This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] Test status before h_errno in gaih_inet
- From: Florian Weimer <fweimer at redhat dot com>
- To: Stan Shebs <stanshebs at google dot com>
- Cc: "libc-alpha at sourceware dot org" <libc-alpha at sourceware dot org>
- Date: Fri, 19 Aug 2016 18:01:00 +0200
- Subject: Re: [PATCH] Test status before h_errno in gaih_inet
- Authentication-results: sourceware.org; auth=none
- References: <CA+5-Q5Kf3Eb5PYm9OusZ-JccCNgKMvLsM0GsnyKVBCD50m8Z8g@mail.gmail.com>
On 07/25/2016 06:50 PM, Stan Shebs wrote:
Per feedback on my previous attempt to fix getaddrinfo failures
after recovering from a failure:
https://sourceware.org/ml/libc-alpha/2016-07/msg00341.html
here is a simpler patch that checks status before checking
h_errno.
The patch basically adds back a test that was previously
present. I am not 100% convinced that it catches all cases
of NSS status being set in a way that ought to be reported
as an error coming from getaddrinfo, but I can't find
any actual examples.
2016-07-25 Stan Shebs <stanshebs@google.com>
* sysdeps/posix/getaddrinfo.c (gaih_inet): Test status before
looking at h_errno.
* posix/tst-getaddrinfo6.c: New test.
* posix/Makefile (tests): Add tst-getaddrinfo6.
It's unclear whether the test case is intended to run against nss_files,
nss_dns, or both. You should call __nss_configure_lookup to make your
selection explicit. This also avoids accidentally running against a
system nscd daemon.
I'm still trying to figure out what the expected error reporting
behavior for functions returning enum nss_status is. There seems to be
some expectation that enum nss_status != NSS_STATUS_SUCCESS implies that
h_errno is valid, but this code in getaddrinfo.c itself contradicts that:
status = NSS_STATUS_UNAVAIL;
/* Could not load any of the lookup functions. Indicate
an internal error if the failure was due to a system
error other than the file not being found. We use the
errno from the last failed callback. */
if (errno != 0 && errno != ENOENT)
__set_h_errno (NETDB_INTERNAL);
It would have to set h_errno unconditionally in order to preserve the
invariant.
The _nss_files_gethostbyname3_r implementation in nss_files calls
internal_setent, but does not update *herrnop for status !=
NSS_STATUS_SUCCESS. This is in contrast to _nss_files_gethostbyname4_r,
which does.
I need to dig further and write up what I find, but I suspect that we
may have to set h_errno to 0 temporarily to obtain maximum compatibility
with existing NSS modules, and base the error check on that.
Thanks,
Florian