libgo icon indicating copy to clipboard operation
libgo copied to clipboard

dns解析异常

Open dearbird opened this issue 4 years ago • 2 comments

我看到hook中有使用了g_dns_mtx, 来保证同一线程下多个协程的dns查询顺序执行,但仍会出现异常。 这个g_dns_mtx 是使用的线程局部变量,会不会协程调度到其它线程后,无法保证安全?

(gdb) p ctx $1 = (const struct resolv_context *) 0x7ffff600a150 (gdb) p *ctx $2 = {resp = 0xd, conf = 0xd, __refcount = 0, __from_res = 119, __next = 0x6d6f632e75} (gdb) bt #0 __resolv_context_search_list (index=1, ctx=0x7ffff600a150) at ../resolv/resolv_context.h:103 #1 __GI___res_context_search (ctx=ctx@entry=0x7ffff600a150, name=name@entry=0x7ffff600a0a8 "www.baidu.com", class=class@entry=1, type=type@entry=1, answer=answer@entry=0x7ffff611c410 "<P\201\003", anslen=anslen@entry=1024, answerp=0x7ffff611c860, answerp2=answerp2@entry=0x0, nanswerp2=nanswerp2@entry=0x0, resplen2=resplen2@entry=0x0, answerp2_malloced=answerp2_malloced@entry=0x0) at res_query.c:396 #2 0x00007ffff25fb188 in gethostbyname3_context (ctx=ctx@entry=0x7ffff600a150, name=name@entry=0x7ffff600a0a8 "www.baidu.com", af=af@entry=2, result=result@entry=0x7ffff611cf20, buffer=buffer@entry=0x7ffff611cf40 "\n\225\200\061", buflen=buflen@entry=8192, errnop=errnop@entry=0x7ffff7fed690, h_errnop=h_errnop@entry=0x7ffff611cee0, ttlp=ttlp@entry=0x0, canonp=canonp@entry=0x0) at nss_dns/dns-host.c:217 #3 0x00007ffff25fbbda in _nss_dns_gethostbyname_r (name=0x7ffff600a0a8 "www.baidu.com", result=0x7ffff611cf20, buffer=0x7ffff611cf40 "\n\225\200\061", buflen=8192, errnop=0x7ffff7fed690, h_errnop=0x7ffff611cee0) at nss_dns/dns-host.c:303 #4 0x00007ffff66442df in __gethostbyname_r (name=0x7ffff600a0a8 "www.baidu.com", resbuf=0x7ffff611cf20, buffer=0x7ffff611cf40 "\n\225\200\061", buflen=8192, result=0x7ffff611cf00, h_errnop=0x7ffff611cee0) at ../nss/getXXbyYY_r.c:316 #5 0x00000000004f790e in gethostbyname_r (name=0x7ffff600a0a8 "www.baidu.com", __result_buf=0x7ffff611cf20, __buf=0x7ffff611cf40 "\n\225\200\061", __buflen=8192, __result=0x7ffff611cf00, __h_errnop=0x7ffff611cee0) at /git/libgo/libgo/netio/unix/hook.cpp:547

dearbird avatar Dec 04 '19 05:12 dearbird

gethostbyname / getaddrinfo 等函数的实现内部都使用了TLS。

dns 查询过程中网络收发包有概率会导致协程被worksteal到另一个线程上,会导致TLS 变量数据异常。

@yyzybb537

dearbird avatar Oct 30 '20 07:10 dearbird

gethostbyname / getaddrinfo 等函数的实现内部都使用了TLS。

dns 查询过程中网络收发包有概率会导致协程被worksteal到另一个线程上,会导致TLS 变量数据异常。

@yyzybb537

这个问题解决了吗

nqf avatar Oct 14 '22 05:10 nqf