summaryrefslogtreecommitdiffstats
path: root/libpthread
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2002-08-08 15:44:46 +0000
committerEric Andersen <andersen@codepoet.org>2002-08-08 15:44:46 +0000
commitac3f49cb8024c62c4f48182371091e9a52a19273 (patch)
tree31f8684c59eb4f890f5bfd651a94238f9627e978 /libpthread
parent58b57e65cc2cee5f33260bef009c074409669564 (diff)
downloaduClibc-alpine-ac3f49cb8024c62c4f48182371091e9a52a19273.tar.bz2
uClibc-alpine-ac3f49cb8024c62c4f48182371091e9a52a19273.tar.xz
Patch from Stefan Allius and Edie C. Dost:
In linuxthreads/errno.h the functions __errno_location and __h_errno_location wasn't safe against calling before the library is initialized.
Diffstat (limited to 'libpthread')
-rw-r--r--libpthread/linuxthreads/errno.c22
-rw-r--r--libpthread/linuxthreads/pthread.c4
2 files changed, 21 insertions, 5 deletions
diff --git a/libpthread/linuxthreads/errno.c b/libpthread/linuxthreads/errno.c
index ad43be47a..46e2fbb35 100644
--- a/libpthread/linuxthreads/errno.c
+++ b/libpthread/linuxthreads/errno.c
@@ -20,15 +20,29 @@
#include <netdb.h>
#include "pthread.h"
#include "internals.h"
+#include <stdio.h>
+extern int _errno;
+extern int _h_errno;
int * __errno_location()
{
- pthread_descr self = thread_self();
- return THREAD_GETMEM (self, p_errnop);
+ /* check, if the library is initilize */
+ if (__pthread_initial_thread_bos != NULL)
+ {
+ pthread_descr self = thread_self();
+ return THREAD_GETMEM (self, p_errnop);
+ }
+ return &_errno;
}
int * __h_errno_location()
{
- pthread_descr self = thread_self();
- return THREAD_GETMEM (self, p_h_errnop);
+ /* check, if the library is initilize */
+ if (__pthread_initial_thread_bos != NULL)
+ {
+ pthread_descr self = thread_self();
+
+ return THREAD_GETMEM (self, p_h_errnop);
+ }
+ return &_h_errno;
}
diff --git a/libpthread/linuxthreads/pthread.c b/libpthread/linuxthreads/pthread.c
index 90c770879..548f83a5f 100644
--- a/libpthread/linuxthreads/pthread.c
+++ b/libpthread/linuxthreads/pthread.c
@@ -349,8 +349,10 @@ int __pthread_initialize_manager(void)
NOMMU_INITIAL_THREAD_BOUNDS(__pthread_manager_thread_tos,__pthread_manager_thread_bos);
PDEBUG("manager stack: size=%d, bos=%p, tos=%p\n", THREAD_MANAGER_STACK_SIZE,
__pthread_manager_thread_bos, __pthread_manager_thread_tos);
+#if 0
PDEBUG("initial stack: estimate bos=%p, tos=%p\n",
- __pthread_initial_thread_bos, __pthread_initial_thread_tos);
+ __pthread_initial_thread_bos, __pthread_initial_thread_tos);
+#endif
/* Setup pipe to communicate with thread manager */
if (pipe(manager_pipe) == -1) {