From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) by sourceware.org (Postfix) with ESMTPS id 656D43846020 for ; Thu, 6 May 2021 09:11:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 656D43846020 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=lukma@denx.de Received: from jawa (85-222-111-42.dynamic.chello.pl [85.222.111.42]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: lukma@denx.de) by phobos.denx.de (Postfix) with ESMTPSA id 5193682A80; Thu, 6 May 2021 11:11:52 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1620292312; bh=Vkn4C+dlCvBH4LKTQqcxA2AzBqs2uWEuoAVnrkKBfJU=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=KqexeYj0EXD11muggmgYi8oebBGoXcwrR6gFfB2U+NaDGFC7UHhPa6vEOTDjiO+Kl orb3SrfM7IQv4E5TerNmVH6AZGEo86vLDpvQ5mgl9zj9P9D6LvI0ZBs+APBvRDhkjf 16k2LLtxcDZP2k9VkIQlL5AgiGyUAvZW5whsCvNTPBaFiOo6aca6h7h6MGrmklDCaJ YAG0GAW1APw6AGsmdgW3lIb2uG0/zCMQ0oChpBu2t+GQD79FGUxzLGlMqRIuRTdAm9 SmwdMkveAXD/f+AsExfLiHChFt09y7WgV8/HCNx/D+X3KG+CnB1UEF8fbUlRkX/C/9 TYYXEAydip3wQ== Date: Thu, 6 May 2021 11:11:51 +0200 From: Lukasz Majewski To: Adhemerval Zanella Cc: GNU C Library Subject: Re: [RFC PATCH] tst: Add test for gai_suspend Message-ID: <20210506111151.0b9c1a95@jawa> In-Reply-To: <20210326123043.4c4da1a6@jawa> References: <20210312154958.13842-1-lukma@denx.de> <20210312170934.2b29cc9d@jawa> <20210326123043.4c4da1a6@jawa> Organization: denx.de X-Mailer: Claws Mail 3.17.8 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; boundary="Sig_/=SlLkSql=Ni_B3HV8SwB=0v"; protocol="application/pgp-signature" X-Virus-Scanned: clamav-milter 0.102.4 at phobos.denx.de X-Virus-Status: Clean X-Spam-Status: No, score=-11.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_ASCII_DIVIDERS, KAM_SHORT, RCVD_IN_BARRACUDACENTRAL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 06 May 2021 09:11:55 -0000 --Sig_/=SlLkSql=Ni_B3HV8SwB=0v Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable On Fri, 26 Mar 2021 12:30:43 +0100 Lukasz Majewski wrote: > Hi Adhemerval, >=20 > > On 12/03/2021 13:09, Lukasz Majewski wrote: =20 > > > Dear Community, > > > =20 > > >> --- > > >> 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 +=3D \ > > >> tst-resolv-res_init-multi \ > > >> tst-resolv-search \ > > >> tst-resolv-trailing \ > > >> + tst-gai_suspend \ > > >> =20 > > >> # 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 =3D make_timespec (1, 0); > > >> + ts =3D timespec_add (ts, timeout); > > >> + > > >> + /* Ignore gaicb content - just wait for timeout. */ > > >> + struct addrinfo result; > > >> + > > >> + struct gaicb gai =3D { "foo.baz", "0", NULL, &result }; > > >> + const struct gaicb * const gai_s[] =3D { &gai }; > > >> + struct gaicb *gai_p =3D &gai; > > >> + > > >> + int ret =3D getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); > > >> + if (ret !=3D 0) > > >> + FAIL_EXIT1 ("getaddrinfo_a failed: %m\n"); > > >> + > > >> + ret =3D gai_suspend (gai_s, 1, &timeout); > > >> + TEST_COMPARE (ret, EAI_AGAIN); > > >> + TEST_TIMESPEC_NOW_OR_AFTER (CLOCK_REALTIME, ts); > > >> + > > >> + return 0; > > >> +} > > >> + > > >> +#include =20 > > >=20 > > > I'm a bit puzzled with the above gai_suspend() test. > > >=20 > > >=20 > > > 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 > > >=20 > > >=20 > > > 1. When I do run it by hand on the remove machine (from glibc test > > > suite): > > > -------------------------------------------------- > > >=20 > > > rm -rf ./resolv/* > > > make PARALLELMFLAGS=3D"-j8" > > > test-wrapper=3D'/home/lukma/work/yocto/y2038/build/workspace/sources/= y2038-glibc/scripts/cross-test-ssh.sh > > > --allow-time-setting root@192.168.7.2' subdirs=3Dresolv check > > >=20 > > > I do see the following error: > > > ----------------------------- > > >=20 > > > cat ./resolv/tst-gai_suspend.out > > > Didn't expect signal from child: got `Segmentation fault' > > >=20 > > > This is strange, as I've passed NULL to getaddrinfo_a as the last > > > parameter, which causes passing no signals to program running it. > > >=20 > > > What am I missing here? Has the test setup any strict policy to > > > handle LWPs ? > > >=20 > > >=20 > > > 2. On the VM (armv7): > > >=20 > > > gai_suspend.c test program: > > > --------------------------- > > >=20 > > > #define _GNU_SOURCE > > >=20 > > > #include > > > #include > > > #include > > >=20 > > > int main (int argc, char **argv) > > > { > > > struct timespec ts, timeout, now; > > >=20 > > > clock_gettime (CLOCK_REALTIME, &ts); > > >=20 > > > timeout.tv_sec =3D ts.tv_sec + 3; > > > timeout.tv_nsec =3D ts.tv_nsec; > > >=20 > > > struct addrinfo result; > > > struct gaicb gai =3D { "foo.baz", "0", NULL, &result }; > > > const struct gaicb * const gai_s[] =3D { &gai }; > > > struct gaicb *gai_p =3D &gai; > > >=20 > > > int ret =3D getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); > > > if (ret !=3D 0) > > > printf("getaddrinfo_a error"); > > >=20 > > > ret =3D gai_suspend (gai_s, 1, &timeout); > > > // According to man getaddrinfo_s I shall receive ret =3D=3D > > > -3 // when conversion from name to IP credentials is performed > > > if (ret !=3D 0) > > > printf("gai_suspend error"); > > >=20 > > > clock_gettime (CLOCK_REALTIME, &now); > > >=20 > > > printf("gai_suspend seconds diff: %llu\n", now.tv_sec - > > > ts.tv_sec); > > >=20 > > > return 0; > > > } > > >=20 > > >=20 > > > gcc -Wall -ggdb -D_TIME_BITS=3D64 -D_FILE_OFFSET_BITS=3D64 > > > -I/opt/include \ -I/opt/usr/include -L/opt/usr/lib > > > -Wl,-rpath=3D/opt/lib \ -Wl,--dynamic-linker=3D/opt/lib/ld-linux.so.2 > > > gai_suspend.c -o gs -lanl \ -lpthread -static > > >=20 > > > The above line has some manual adjustments for linker, but this > > > works for other syscalls for some long time now - more info [1]. > > >=20 > > >=20 > > > 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. > > >=20 > > >=20 > > > The question(s): > > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > >=20 > > > 1. Why I do experience thread error in glibc test suite? > > >=20 > > > 2. Is the code for gai_suspend testing wrong (not much reference > > > in glibc), or do we have a bug in the the implementation? > > >=20 > > >=20 > > > Thanks in advance for any help/hints. > > >=20 > > >=20 > > >=20 > > > Links: > > > [1] - https://github.com/lmajewski/meta-y2038/ > > > [2] - https://linux.die.net/man/3/gai_suspend > > >=20 > > > Best regards, > > >=20 > > > Lukasz Majewski =20 > >=20 > > 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. > >=20 > > But I am seeing: > >=20 > > $ ./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=20 > > 1616504557.971222237s (difference 0.975493831s) > > error: 2 test failures > >=20 > > The issue is tests is using the system NSS and possible DNS cache so > > the expected name resolution timeout does not happen reliable. =20 >=20 > Even more strange (tested on x86_64): >=20 > 1. For "sourceware.org" + "http" > struct gaicb gai =3D { "sourceware.org", "http", NULL, &result }; >=20 > getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); > gai_suspend (gai_s, 1, &timeout); >=20 > ret =3D gai_error(gai_p); >=20 > Here the ret is 0 as expected. >=20 > 2. For "foo.baz" + "0" (the gai_suspend and getaddrinfo_a are called > in the same way as above) >=20 > struct gaicb gai =3D { "foo.baz", "0", NULL, &result }; >=20 > Here the ret is -2 as expected (EAI_NONAME - NAME or SERVICE unknown) > - the "0" here is wrong. >=20 >=20 > 3. For "foo.baz" + "http" (the gai_suspend and getaddrinfo_a are > called in the same way as above) >=20 > struct gaicb gai =3D { "foo.baz", "http", NULL, &result }; >=20 > 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. >=20 > Any hints on how timeout can be forced? Gentle ping on this problem. >=20 > > 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. =20 >=20 >=20 > Best regards, >=20 > Lukasz Majewski >=20 > -- >=20 > 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 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 --Sig_/=SlLkSql=Ni_B3HV8SwB=0v Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCgAdFiEEgAyFJ+N6uu6+XupJAR8vZIA0zr0FAmCTstcACgkQAR8vZIA0 zr3DIggAjY6OUcG7WZhV66gpxZo+/FibgmUscBVn3GpCD2FkpQ/bwSFm1L7ssrbp f6/sT9WrajyjTViobI2wzCe5NJGjiJcZpiUFLv34HU52ihU9ycgA0/8tbsa/swI7 vbh3WDxtT20QXuz7sidP3qBJFJ/gFRSjER3NVhhwy1FJi8XB47hbVg99eNdTT4vu U1TJ0R5nE7z7JtNofEpXEYHBzLRzXAUQ/gLufyeNCwZ2MTRebp5rbQ8kV1JWTfsX RJGSN8C/3VZsbXLXRLorGAxr7ZIVAT/mWpLHosdASVIoIvKNmlPTv10NkNM4loFF k/tybJJBwG4auNZVfrTgULLA28C9yQ== =5PO7 -----END PGP SIGNATURE----- --Sig_/=SlLkSql=Ni_B3HV8SwB=0v--