From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 58545 invoked by alias); 15 Jun 2018 13:29:34 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 58536 invoked by uid 89); 15 Jun 2018 13:29:33 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LAZY_DOMAIN_SECURITY,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=holes, ifa, itll X-HELO: mx1.redhat.com From: Daniel Alvarez To: libc-alpha@sourceware.org Cc: Daniel Alvarez , Jakub Sitnicki Subject: [PATCH] [BZ #21812] getifaddrs() Don't return ifa entries with NULL names Date: Fri, 15 Jun 2018 13:29:00 -0000 Message-Id: <20180615132915.83940-1-dalvarez@redhat.com> X-SW-Source: 2018-06/txt/msg00438.txt.bz2 Due to bug 21812, a lookup operation in map_newlink() turns out into an insert because of holes in the interface part of the map. This leads to incorrectly set the name of the interface to NULL when the interface is not present for the address being processed (most likely because the interface was added between the RTM_GETLINK and RTM_GETADDR calls to the kernel). When such changes are detected by the kernel, it'll mark the dump as "inconsistent" by setting NLM_F_DUMP_INTR flag on the next netlink message. This patch checks this condition and retries the whole operation. Hopes are that next time the interface corresponding to the address entry is present in the list and correct name is returned. Signed-off-by: Daniel Alvarez Signed-off-by: Jakub Sitnicki --- sysdeps/unix/sysv/linux/ifaddrs.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sysdeps/unix/sysv/linux/ifaddrs.c b/sysdeps/unix/sysv/linux/ifaddrs.c index 32381f54e4..5659c9605b 100644 --- a/sysdeps/unix/sysv/linux/ifaddrs.c +++ b/sysdeps/unix/sysv/linux/ifaddrs.c @@ -370,6 +370,14 @@ getifaddrs_internal (struct ifaddrs **ifap) if ((pid_t) nlh->nlmsg_pid != nh.pid || nlh->nlmsg_seq != nlp->seq) continue; + /* If the dump got interrupted, we can't relay on the results so + try again. */ + if (nlh->nlmsg_flags & NLM_F_DUMP_INTR) + { + result = -EAGAIN; + goto exit_free; + } + if (nlh->nlmsg_type == NLMSG_DONE) break; /* ok */ -- 2.15.1 (Apple Git-101)