Note: This bug is displayed in read-only format because
the product is no longer active in Red Hat Bugzilla.
RHEL Engineering is moving the tracking of its product development work on RHEL 6 through RHEL 9 to Red Hat Jira (issues.redhat.com). If you're a Red Hat customer, please continue to file support cases via the Red Hat customer portal. If you're not, please head to the "RHEL project" in Red Hat Jira and file new tickets here. Individual Bugzilla bugs in the statuses "NEW", "ASSIGNED", and "POST" are being migrated throughout September 2023. Bugs of Red Hat partners with an assigned Engineering Partner Manager (EPM) are migrated in late September as per pre-agreed dates. Bugs against components "kernel", "kernel-rt", and "kpatch" are only migrated if still in "NEW" or "ASSIGNED". If you cannot log in to RH Jira, please consult article #7032570. That failing, please send an e-mail to the RH Jira admins at rh-issues@redhat.com to troubleshoot your issue as a user management inquiry. The email creates a ServiceNow ticket with Red Hat. Individual Bugzilla bugs that are migrated will be moved to status "CLOSED", resolution "MIGRATED", and set with "MigratedToJIRA" in "Keywords". The link to the successor Jira issue will be found under "Links", have a little "two-footprint" icon next to it, and direct you to the "RHEL project" in Red Hat Jira (issue links are of type "https://issues.redhat.com/browse/RHEL-XXXX", where "X" is a digit). This same link will be available in a blue banner at the top of the page informing you that that bug has been migrated.
Resolution for getaddrinfo accessing uninitialised data
On systems with nscd enabled, the getaddrinfo function in glibc could access uninitialized data and return false address information.
This update avoids accessing uninitialized data and ensures that correct addresses are returned.
Created attachment 1027400[details]
gaitest.c
Test case.
strace will show random values, like this:
connect(3, {sa_family=XXX /* AF_??? */, sa_data="\0\0\377\177\0\0\0\0\0\0\0\0\0\0"}, 16) = -1 EAFNOSUPPORT (Address family not supported by protocol)
where XXX is some random value.
Valgrind will tell all sorts of uninitialized memory use.
I can confirm that the upstream fix addresses this issue:
commit a071766ebfd853179ac39f9773f894029bf86d36
Author: Andreas Schwab <schwab>
Date: Thu Mar 20 15:05:25 2014 +0100
Fix use of half-initialized result in getaddrinfo when using nscd (bug 16743)
This fixes a bug in the way the results from __nscd_getai are collected:
for every returned result a new entry is first added to the
gaih_addrtuple list, but if that result doesn't match the request this
entry remains uninitialized. So for this non-matching result an extra
result with uninitialized content is returned.
To reproduce (with nscd running):
$ getent ahostsv4 localhost
127.0.0.1 STREAM localhost
127.0.0.1 DGRAM
127.0.0.1 RAW
(null) STREAM
(null) DGRAM
(null) RAW
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=a071766ebfd853179ac39f9773f894029bf86d36
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.
For information on the advisory, and where to find the updated
files, follow the link below.
If the solution does not work for you, open a new bug report.
https://rhn.redhat.com/errata/RHSA-2017-0680.html
The problem also happens in rhel-7.x. Checking in rhel-7, the memory is allocated at: sysdeps/posix/getaddrinfo.c:706 if (__libc_use_alloca (alloca_used + air->naddrs * sizeof (struct gaih_addrtuple))) addrmem = alloca_account (air->naddrs * sizeof (struct gaih_addrtuple), alloca_used); Simple debug attaching gdb from valgrind: ==30081== Conditional jump or move depends on uninitialised value(s) ==30081== at 0x4F10C22: gaih_inet (getaddrinfo.c:1200) ==30081== by 0x4F147AC: getaddrinfo (getaddrinfo.c:2420) ==30081== by 0x4005C8: main (gaitest.c:10) ... (gdb) bt #0 gaih_inet (name=name@entry=0x400660 "localhost", service=<optimized out>, req=req@entry=0xffefffd30, pai=0x51f62a8, pai@entry=0xffefffbe0, naddrs=naddrs@entry=0xffefffbd0) at ../sysdeps/posix/getaddrinfo.c:1200 #1 0x0000000004f147ad in __GI_getaddrinfo (name=0x400660 "localhost", service=0x0, hints=0xffefffd30, pai=0xffefffd68) at ../sysdeps/posix/getaddrinfo.c:2420 #2 0x00000000004005c9 in main () at gaitest.c:10 (gdb) p addrmem $1 = (struct gaih_addrtuple *) 0xffefff8b0 (gdb) p at->next $2 = (struct gaih_addrtuple *) 0xffefff8b0 (gdb) p* at->next $3 = {next = 0x0, name = 0x0, family = -16778416, addr = {15, 0, 0, 0}, scopeid = 0} (gdb) p* req $4 = {ai_flags = 2, ai_family = 2, ai_socktype = 0, ai_protocol = 0, ai_addrlen = 0, ai_addr = 0x0, ai_canonname = 0x0, ai_next = 0x0} (gdb) p $rsp $5 = (void *) 0xffefff890