This is the mail archive of the libc-help@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: libresolv with getaddrinfo


Hi,
On 14/03/15 00:56, Carlos O'Donell wrote:
> Other than that, it must accurately set RES_INIT flag to indicate
> the structure is initialized and does not need to be initialized
> again.
>
> The obvious dislcaimer is that this is very fragile and may break
> at any time if we change the layout of _res.
>
Would that be what res_init() is for?

If so, that doesn't seem to work either. If I use res_init(); before I
set _res, it still overwrites it on the first call to getaddrinfo.
This is the same for using res_query.

From gdb:

> Breakpoint 1, main () at k.c:9
> 9    int main() {
> (gdb) n
> 18        res_init();
> (gdb) n
> 19        inet_pton(AF_INET, "208.67.220.220", &server);
> (gdb) p _res
> $1 = {retrans = 5, retry = 4, options = 524993, nscount = 1,
> nsaddr_list = {{sin_family = 2, sin_port = 13568, sin_addr = {s_addr =
> 16842879}, sin_zero = "\000\000\000\000\000\000\000"}, {sin_family =
> 0, sin_port = 0,
>       sin_addr = {s_addr = 0}, sin_zero =
> "\000\000\000\000\000\000\000"}, {sin_family = 0, sin_port = 0,
> sin_addr = {s_addr = 0}, sin_zero = "\000\000\000\000\000\000\000"}},
> id = 902, dnsrch = {
>     0x7ffff7bbd460 <_res+128> "", 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
> defdname = '\000' <repeats 255 times>, pfcode = 0, ndots = 1, nsort =
> 0, ipv6_unavail = 0, unused = 0, sort_list = {{addr = {s_addr = 0},
> mask = 0}, {addr = {
>         s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr
> = {s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr =
> {s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr =
> {s_addr = 0},
>       mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr = {s_addr =
> 0}, mask = 0}}, qhook = 0x0, rhook = 0x0, res_h_errno = 0, _vcsock =
> -1, _flags = 0, _u = {
>     pad = "\000\000\003\000\003\000\003", '\000' <repeats 41 times>,
> "\001\000\000", _ext = {nscount = 0, nsmap = {3, 3, 3}, nssocks = {0,
> 0, 0}, nscount6 = 0, nsinit = 0, nsaddrs = {0x0, 0x0, 0x0}, initstamp
> = 1}}}
> (gdb) n
> 21        serverSock.sin_family = AF_INET;
> (gdb) n
> 22        serverSock.sin_port = htons(53);
> (gdb) n
> 23        serverSock.sin_addr = server;
> (gdb) n
> 25        _res.nscount = 1;
> (gdb) n
> 26        _res.nsaddr_list[0] = serverSock;
> (gdb) n
> 27        printf("Blah\n");
> (gdb) p _res
> $2 = {retrans = 5, retry = 4, options = 524993, nscount = 1,
> nsaddr_list = {{sin_family = 2, sin_port = 13568, sin_addr = {s_addr =
> 3705422800}, sin_zero = "\000\000\000\000\000\000\000"}, {sin_family =
> 0, sin_port = 0,
>       sin_addr = {s_addr = 0}, sin_zero =
> "\000\000\000\000\000\000\000"}, {sin_family = 0, sin_port = 0,
> sin_addr = {s_addr = 0}, sin_zero = "\000\000\000\000\000\000\000"}},
> id = 902, dnsrch = {
>     0x7ffff7bbd460 <_res+128> "", 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
> defdname = '\000' <repeats 255 times>, pfcode = 0, ndots = 1, nsort =
> 0, ipv6_unavail = 0, unused = 0, sort_list = {{addr = {s_addr = 0},
> mask = 0}, {addr = {
>         s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr
> = {s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr =
> {s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr =
> {s_addr = 0},
>       mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr = {s_addr =
> 0}, mask = 0}}, qhook = 0x0, rhook = 0x0, res_h_errno = 0, _vcsock =
> -1, _flags = 0, _u = {
>     pad = "\000\000\003\000\003\000\003", '\000' <repeats 41 times>,
> "\001\000\000", _ext = {nscount = 0, nsmap = {3, 3, 3}, nssocks = {0,
> 0, 0}, nscount6 = 0, nsinit = 0, nsaddrs = {0x0, 0x0, 0x0}, initstamp
> = 1}}}
> (gdb) n
> Blah
> 28        int l = res_query("myip.opendns.com", ns_c_any, ns_t_a, buf,
> sizeof(buf));
> (gdb) n
> 29        if(l < 0) {
> (gdb) p _res
> $3 = {retrans = 5, retry = 4, options = 524993, nscount = 1,
> nsaddr_list = {{sin_family = 2, sin_port = 13568, sin_addr = {s_addr =
> 16842879}, sin_zero = "\000\000\000\000\000\000\000"}, {sin_family =
> 0, sin_port = 0,
>       sin_addr = {s_addr = 0}, sin_zero =
> "\000\000\000\000\000\000\000"}, {sin_family = 0, sin_port = 0,
> sin_addr = {s_addr = 0}, sin_zero = "\000\000\000\000\000\000\000"}},
> id = 12360, dnsrch = {
>     0x7ffff7bbd460 <_res+128> "", 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
> defdname = '\000' <repeats 255 times>, pfcode = 0, ndots = 1, nsort =
> 0, ipv6_unavail = 0, unused = 0, sort_list = {{addr = {s_addr = 0},
> mask = 0}, {addr = {
>         s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr
> = {s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr =
> {s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr =
> {s_addr = 0},
>       mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr = {s_addr =
> 0}, mask = 0}}, qhook = 0x0, rhook = 0x0, res_h_errno = 2, _vcsock =
> -1, _flags = 0, _u = {
>     pad = "\001\000\000\000\003\000\003\000\377\377\377\377", '\000'
> <repeats 12 times>, "\020 `", '\000' <repeats 21 times>,
> "\002\000\000", _ext = {nscount = 1, nsmap = {0, 3, 3}, nssocks = {-1,
> 0, 0}, nscount6 = 0,
>       nsinit = 0, nsaddrs = {0x602010, 0x0, 0x0}, initstamp = 2}}}


Anyways, for my code, I assume I should be using the res_* family, as
getaddrinfo is not guaranteed to use _res, right?


Thanks,
-- 
-- Joshua Rogers <https://internot.info/>

Attachment: signature.asc
Description: OpenPGP digital signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]