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 -- 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