Hi Adhemerval, > On 12/03/2021 13:09, Lukasz Majewski wrote: > > Dear Community, > > > >> --- > >> resolv/Makefile | 2 ++ > >> resolv/tst-gai_suspend.c | 53 > >> ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 > >> insertions(+) create mode 100644 resolv/tst-gai_suspend.c > >> > >> diff --git a/resolv/Makefile b/resolv/Makefile > >> index 1047bb6ae5..e7e66fe903 100644 > >> --- a/resolv/Makefile > >> +++ b/resolv/Makefile > >> @@ -60,6 +60,7 @@ tests += \ > >> tst-resolv-res_init-multi \ > >> tst-resolv-search \ > >> tst-resolv-trailing \ > >> + tst-gai_suspend \ > >> > >> # This test calls __res_context_send directly, which is not > >> exported # from libresolv. > >> @@ -209,3 +210,4 @@ $(objpfx)tst-ns_name_compress: > >> $(objpfx)libresolv.so $(objpfx)tst-ns_name_pton: > >> $(objpfx)libresolv.so $(objpfx)tst-res_hnok: $(objpfx)libresolv.so > >> $(objpfx)tst-p_secstodate: $(objpfx)libresolv.so > >> +$(objpfx)tst-gai_suspend: $(objpfx)libanl.so > >> diff --git a/resolv/tst-gai_suspend.c b/resolv/tst-gai_suspend.c > >> new file mode 100644 > >> index 0000000000..bbafd13fc4 > >> --- /dev/null > >> +++ b/resolv/tst-gai_suspend.c > >> @@ -0,0 +1,53 @@ > >> +/* Test for gai_suspend timeout > >> + Copyright (C) 2021 Free Software Foundation, Inc. > >> + This file is part of the GNU C Library. > >> + > >> + The GNU C Library is free software; you can redistribute it > >> and/or > >> + modify it under the terms of the GNU Lesser General Public > >> + License as published by the Free Software Foundation; either > >> + version 2.1 of the License, or (at your option) any later > >> version. + > >> + The GNU C Library is distributed in the hope that it will be > >> useful, > >> + but WITHOUT ANY WARRANTY; without even the implied warranty of > >> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > >> GNU > >> + Lesser General Public License for more details. > >> + > >> + You should have received a copy of the GNU Lesser General > >> Public > >> + License along with the GNU C Library; if not, see > >> + . */ > >> + > >> +#include > >> +#include > >> +#include > >> +#include > >> +#include > >> +#include > >> +#include > >> + > >> +static int > >> +do_test (void) > >> +{ > >> + struct timespec ts; > >> + xclock_gettime (CLOCK_REALTIME, &ts); > >> + struct timespec timeout = make_timespec (1, 0); > >> + ts = timespec_add (ts, timeout); > >> + > >> + /* Ignore gaicb content - just wait for timeout. */ > >> + struct addrinfo result; > >> + > >> + struct gaicb gai = { "foo.baz", "0", NULL, &result }; > >> + const struct gaicb * const gai_s[] = { &gai }; > >> + struct gaicb *gai_p = &gai; > >> + > >> + int ret = getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); > >> + if (ret != 0) > >> + FAIL_EXIT1 ("getaddrinfo_a failed: %m\n"); > >> + > >> + ret = gai_suspend (gai_s, 1, &timeout); > >> + TEST_COMPARE (ret, EAI_AGAIN); > >> + TEST_TIMESPEC_NOW_OR_AFTER (CLOCK_REALTIME, ts); > >> + > >> + return 0; > >> +} > >> + > >> +#include > > > > I'm a bit puzzled with the above gai_suspend() test. > > > > > > The idea for Y2038 test is to check if one can timeout when passed > > crafted struct gaicb causes the gai_suspend() to exit with timeout. > > This approach is similar to one from tst-ppoll.c > > > > > > 1. When I do run it by hand on the remove machine (from glibc test > > suite): > > -------------------------------------------------- > > > > rm -rf ./resolv/* > > make PARALLELMFLAGS="-j8" > > test-wrapper='/home/lukma/work/yocto/y2038/build/workspace/sources/y2038-glibc/scripts/cross-test-ssh.sh > > --allow-time-setting root@192.168.7.2' subdirs=resolv check > > > > I do see the following error: > > ----------------------------- > > > > cat ./resolv/tst-gai_suspend.out > > Didn't expect signal from child: got `Segmentation fault' > > > > This is strange, as I've passed NULL to getaddrinfo_a as the last > > parameter, which causes passing no signals to program running it. > > > > What am I missing here? Has the test setup any strict policy to > > handle LWPs ? > > > > > > 2. On the VM (armv7): > > > > gai_suspend.c test program: > > --------------------------- > > > > #define _GNU_SOURCE > > > > #include > > #include > > #include > > > > int main (int argc, char **argv) > > { > > struct timespec ts, timeout, now; > > > > clock_gettime (CLOCK_REALTIME, &ts); > > > > timeout.tv_sec = ts.tv_sec + 3; > > timeout.tv_nsec = ts.tv_nsec; > > > > struct addrinfo result; > > struct gaicb gai = { "foo.baz", "0", NULL, &result }; > > const struct gaicb * const gai_s[] = { &gai }; > > struct gaicb *gai_p = &gai; > > > > int ret = getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); > > if (ret != 0) > > printf("getaddrinfo_a error"); > > > > ret = gai_suspend (gai_s, 1, &timeout); > > // According to man getaddrinfo_s I shall receive ret == -3 > > // when conversion from name to IP credentials is performed > > if (ret != 0) > > printf("gai_suspend error"); > > > > clock_gettime (CLOCK_REALTIME, &now); > > > > printf("gai_suspend seconds diff: %llu\n", now.tv_sec - > > ts.tv_sec); > > > > return 0; > > } > > > > > > gcc -Wall -ggdb -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64 > > -I/opt/include \ -I/opt/usr/include -L/opt/usr/lib > > -Wl,-rpath=/opt/lib \ -Wl,--dynamic-linker=/opt/lib/ld-linux.so.2 > > gai_suspend.c -o gs -lanl \ -lpthread -static > > > > The above line has some manual adjustments for linker, but this > > works for other syscalls for some long time now - more info [1]. > > > > > > In this case the program quits without any issues with threads, but > > the output and behavior of gai_suspend is not as expected > > (according at least to the manual [2]). The return code from > > gai_suspend shall be EAI_AGAIN and the result struct has some > > garbage in it. > > > > > > The question(s): > > ================ > > > > 1. Why I do experience thread error in glibc test suite? > > > > 2. Is the code for gai_suspend testing wrong (not much reference in > > glibc), or do we have a bug in the the implementation? > > > > > > Thanks in advance for any help/hints. > > > > > > > > Links: > > [1] - https://github.com/lmajewski/meta-y2038/ > > [2] - https://linux.die.net/man/3/gai_suspend > > > > Best regards, > > > > Lukasz Majewski > > I am not sure from where the failure come from, on my environment I am > not seeing the SEGFAULT failure on neither x86_64 nor on i686. > > But I am seeing: > > $ ./testrun.sh resolv/tst-gai_suspend > tst-gai_suspend.c:47: numeric comparison failure > left: 0 (0x0); from: ret > right: -3 (0xfffffffd); from: EAI_AGAIN > tst-gai_suspend.c:48: 1616504556.995728406s not after > 1616504557.971222237s (difference 0.975493831s) > error: 2 test failures > > The issue is tests is using the system NSS and possible DNS cache so > the expected name resolution timeout does not happen reliable. Even more strange (tested on x86_64): 1. For "sourceware.org" + "http" struct gaicb gai = { "sourceware.org", "http", NULL, &result }; getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); gai_suspend (gai_s, 1, &timeout); ret = gai_error(gai_p); Here the ret is 0 as expected. 2. For "foo.baz" + "0" (the gai_suspend and getaddrinfo_a are called in the same way as above) struct gaicb gai = { "foo.baz", "0", NULL, &result }; Here the ret is -2 as expected (EAI_NONAME - NAME or SERVICE unknown) - the "0" here is wrong. 3. For "foo.baz" + "http" (the gai_suspend and getaddrinfo_a are called in the same way as above) struct gaicb gai = { "foo.baz", "http", NULL, &result }; Here the ret is also -2, which I don't understand. I would expect that the foo.baz name is going to be resolved as it "looks" correctly and hence the timeout will occur. Any hints on how timeout can be forced? > I am > not sure how we can accomplish it, maybe through running it on a > container with a custom NSS module to actually emulate the delay. Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de