[PATCH] resolv: Add test for getaddrinfo returning EAI_AGAIN on DNS failure
H.J. Lu
hjl.tools@gmail.com
Tue Sep 16 19:48:48 GMT 2025
On Tue, Sep 16, 2025 at 12:43 PM Sergey Kolosov <skolosov@redhat.com> wrote:
>
> Test for BZ #16849. This test verifies that getaddrinfo correctly
> returns the EAI_AGAIN error code when DNS queries fail due to a network
> failure. The test queries with AF_INET, AF_INET6, AF_UNSPEC address
> families and expects getaddrinfo to return EAI_AGAIN in each case.
> ---
> To validate the test, I manually reverted the fix for BZ #16849 in
> nss/getaddrinfo.c, specifically the condition:
Is it possible to write a container test with network/DNS disabled?
> - if (h_errno == TRY_AGAIN)
> + if (status == NSS_STATUS_TRYAGAIN && h_errno == TRY_AGAIN)
>
> With this reversion in place, the test fails as expected (getaddrinfo
> returns EAI_NONAME instead of EAI_AGAIN), confirming that the test
> detects the broken behavior.
>
> With the fix present, the test passes.
> ---
> resolv/Makefile | 2 +
> resolv/tst-getaddrinfo-eai-again.c | 71 ++++++++++++++++++++++++++++++
> 2 files changed, 73 insertions(+)
> create mode 100644 resolv/tst-getaddrinfo-eai-again.c
>
> diff --git a/resolv/Makefile b/resolv/Makefile
> index 8fa3398d76..4d6f0ebe82 100644
> --- a/resolv/Makefile
> +++ b/resolv/Makefile
> @@ -136,6 +136,7 @@ tests-static += tst-ns_rr_cursor
> # These tests need libdl.
> ifeq (yes,$(build-shared))
> tests += \
> + tst-getaddrinfo-eai-again \
> tst-resolv-ai_idn \
> tst-resolv-ai_idn-latin1 \
> tst-resolv-ai_idn-nolibidn2 \
> @@ -280,6 +281,7 @@ $(objpfx)mtrace-tst-resolv-res_ninit.out: $(objpfx)tst-resolv-res_ninit.out
>
> $(objpfx)tst-bug18665-tcp: $(objpfx)libresolv.so $(shared-thread-library)
> $(objpfx)tst-bug18665: $(objpfx)libresolv.so $(shared-thread-library)
> +$(objpfx)tst-getaddrinfo-eai-again: $(objpfx)libresolv.so $(shared-thread-library)
> $(objpfx)tst-resolv-ai_idn: $(objpfx)libresolv.so $(shared-thread-library)
> $(objpfx)tst-resolv-ai_idn-latin1: \
> $(objpfx)libresolv.so $(shared-thread-library)
> diff --git a/resolv/tst-getaddrinfo-eai-again.c b/resolv/tst-getaddrinfo-eai-again.c
> new file mode 100644
> index 0000000000..0c2d8deb96
> --- /dev/null
> +++ b/resolv/tst-getaddrinfo-eai-again.c
> @@ -0,0 +1,71 @@
> +/* Test for BZ #16849. Verify that getaddrinfo correctly returns
> + EAI_AGAIN error code if DNS query fails due to a network failure.
> + Copyright (C) 2025 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
> + <https://www.gnu.org/licenses/>. */
> +
> +#include <resolv.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <support/check.h>
> +#include <support/check_nss.h>
> +#include <support/resolv_test.h>
> +#include <support/support.h>
> +
> +/* DNS stub callback that simulates a network failure. */
> +static void
> +response (const struct resolv_response_context *ctx,
> + struct resolv_response_builder *b,
> + const char *qname, uint16_t qclass, uint16_t qtype)
> +{
> +}
> +
> +static void
> +query_host (const char *host_name)
> +{
> + int family[] = { AF_INET, AF_INET6, AF_UNSPEC };
> + const char *family_names[] = { "AF_INET", "AF_INET6", "AF_UNSPEC" };
> +
> + for (int i = 0; i < 3; i++)
> + {
> + struct addrinfo hints = {
> + .ai_socktype = 0,
> + .ai_protocol = 0,
> + .ai_family = family[i],
> + .ai_flags = 0,
> + };
> + struct addrinfo *result;
> + int res = getaddrinfo (host_name, NULL, &hints, &result);
> + if (res != EAI_AGAIN)
> + FAIL_EXIT1 ("getaddrinfo (%s, %s): %s\n should return EAI_AGAIN \n",
> + host_name, family_names[i], gai_strerror (res));
> + }
> +}
> +
> +static int
> +do_test (void)
> +{
> + struct resolv_test *aux = resolv_test_start
> + ((struct resolv_redirect_config)
> + {
> + .response_callback = response,
> + });
> + query_host("site.example");
> + resolv_test_end (aux);
> + return 0;
> +}
> +
> +#include <support/test-driver.c>
> --
> 2.51.0
>
--
H.J.
More information about the Libc-alpha
mailing list