diff options
authorRich Felker <>2020-08-24 21:38:49 -0400
committerRich Felker <>2020-08-24 21:38:49 -0400
commit9d0b8b92a508c328e7eac774847f001f80dfb5ff (patch)
parent4d5786544bb52c62fc1ae84d91684ef2268afa05 (diff)
make h_errno thread-local
the framework to do this always existed but it was deemed unnecessary because the only [ex-]standard functions using h_errno were not thread-safe anyway. however, some of the nonstandard res_* functions are also supposed to set h_errno to indicate the cause of error, and were unable to do so because it was not thread-safe. this change is a prerequisite for fixing them.
2 files changed, 3 insertions, 4 deletions
diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h
index 5742dfc5..5749a336 100644
--- a/src/internal/pthread_impl.h
+++ b/src/internal/pthread_impl.h
@@ -43,6 +43,7 @@ struct pthread {
long off;
volatile void *volatile pending;
} robust_list;
+ int h_errno_val;
volatile int timer_id;
locale_t locale;
volatile int killlock[1];
diff --git a/src/network/h_errno.c b/src/network/h_errno.c
index 4f700cea..8677a92b 100644
--- a/src/network/h_errno.c
+++ b/src/network/h_errno.c
@@ -1,9 +1,7 @@
#include <netdb.h>
-#undef h_errno
-int h_errno;
+#include "pthread_impl.h"
int *__h_errno_location(void)
- return &h_errno;
+ return &__pthread_self()->h_errno_val;