|
|
978e96 |
commit c1f86a33ca32e26a9d6e29fc961e5ecb5e2e5eb4
|
|
|
978e96 |
Author: Daniel Alvarez <dalvarez@redhat.com>
|
|
|
978e96 |
Date: Fri Jun 29 09:44:55 2018 +0200
|
|
|
978e96 |
|
|
|
978e96 |
getifaddrs: Don't return ifa entries with NULL names [BZ #21812]
|
|
|
978e96 |
|
|
|
978e96 |
A lookup operation in map_newlink could turn into an insert because of
|
|
|
978e96 |
holes in the interface part of the map. This leads to incorrectly set
|
|
|
978e96 |
the name of the interface to NULL when the interface is not present
|
|
|
978e96 |
for the address being processed (most likely because the interface was
|
|
|
978e96 |
added between the RTM_GETLINK and RTM_GETADDR calls to the kernel).
|
|
|
978e96 |
When such changes are detected by the kernel, it'll mark the dump as
|
|
|
978e96 |
"inconsistent" by setting NLM_F_DUMP_INTR flag on the next netlink
|
|
|
978e96 |
message.
|
|
|
978e96 |
|
|
|
978e96 |
This patch checks this condition and retries the whole operation.
|
|
|
978e96 |
Hopes are that next time the interface corresponding to the address
|
|
|
978e96 |
entry is present in the list and correct name is returned.
|
|
|
978e96 |
|
|
|
978e96 |
diff --git a/sysdeps/unix/sysv/linux/ifaddrs.c b/sysdeps/unix/sysv/linux/ifaddrs.c
|
|
|
978e96 |
index c87e594e30a314fe..b1329dc4d4c63529 100644
|
|
|
978e96 |
--- a/sysdeps/unix/sysv/linux/ifaddrs.c
|
|
|
978e96 |
+++ b/sysdeps/unix/sysv/linux/ifaddrs.c
|
|
|
978e96 |
@@ -369,6 +369,14 @@ getifaddrs_internal (struct ifaddrs **ifap)
|
|
|
978e96 |
if ((pid_t) nlh->nlmsg_pid != nh.pid || nlh->nlmsg_seq != nlp->seq)
|
|
|
978e96 |
continue;
|
|
|
978e96 |
|
|
|
978e96 |
+ /* If the dump got interrupted, we can't rely on the results
|
|
|
978e96 |
+ so try again. */
|
|
|
978e96 |
+ if (nlh->nlmsg_flags & NLM_F_DUMP_INTR)
|
|
|
978e96 |
+ {
|
|
|
978e96 |
+ result = -EAGAIN;
|
|
|
978e96 |
+ goto exit_free;
|
|
|
978e96 |
+ }
|
|
|
978e96 |
+
|
|
|
978e96 |
if (nlh->nlmsg_type == NLMSG_DONE)
|
|
|
978e96 |
break; /* ok */
|
|
|
978e96 |
|