diff options
author | Felix Fietkau <nbd@openwrt.org> | 2013-12-28 15:06:04 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2013-12-28 15:06:04 +0000 |
commit | c4b013f00b19e983ff43264b418dad9e66bb7fe6 (patch) | |
tree | 812aadc4e3064de281b17a2267d4479a855925bf | |
parent | 8cabffaa3bd947a66f5111faa8bb0119fe15a7e1 (diff) | |
download | upstream-c4b013f00b19e983ff43264b418dad9e66bb7fe6.tar.gz upstream-c4b013f00b19e983ff43264b418dad9e66bb7fe6.tar.bz2 upstream-c4b013f00b19e983ff43264b418dad9e66bb7fe6.zip |
uClibc: make res_init() thread safe
Signed-off-by: Jiri Slachta <slachta@cesnet.cz>
SVN-Revision: 39178
-rw-r--r-- | toolchain/uClibc/patches-0.9.33.2/136-inet_make_res_init_thread_safe.patch | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/toolchain/uClibc/patches-0.9.33.2/136-inet_make_res_init_thread_safe.patch b/toolchain/uClibc/patches-0.9.33.2/136-inet_make_res_init_thread_safe.patch new file mode 100644 index 0000000000..e23b0839ad --- /dev/null +++ b/toolchain/uClibc/patches-0.9.33.2/136-inet_make_res_init_thread_safe.patch @@ -0,0 +1,55 @@ +--- a/libc/inet/resolv.c ++++ b/libc/inet/resolv.c +@@ -3432,6 +3432,7 @@ static void res_sync_func(void) + */ + } + ++/* has to be called under __resolv_lock */ + static int + __res_vinit(res_state rp, int preinit) + { +@@ -3440,7 +3441,6 @@ __res_vinit(res_state rp, int preinit) + int m = 0; + #endif + +- __UCLIBC_MUTEX_LOCK(__resolv_lock); + __close_nameservers(); + __open_nameservers(); + +@@ -3532,7 +3532,6 @@ __res_vinit(res_state rp, int preinit) + + rp->options |= RES_INIT; + +- __UCLIBC_MUTEX_UNLOCK(__resolv_lock); + return 0; + } + +@@ -3582,11 +3582,11 @@ res_init(void) + if (!_res.id) + _res.id = res_randomid(); + +- __UCLIBC_MUTEX_UNLOCK(__resolv_lock); +- + __res_vinit(&_res, 1); + __res_sync = res_sync_func; + ++ __UCLIBC_MUTEX_UNLOCK(__resolv_lock); ++ + return 0; + } + libc_hidden_def(res_init) +@@ -3687,7 +3687,11 @@ struct __res_state *__resp = &_res; + int + res_ninit(res_state statp) + { +- return __res_vinit(statp, 0); ++ int ret; ++ __UCLIBC_MUTEX_LOCK(__resolv_lock); ++ ret = __res_vinit(statp, 0); ++ __UCLIBC_MUTEX_UNLOCK(__resolv_lock); ++ return ret; + } + + #endif /* L_res_init */ +-- +cgit v0.9.1 |