about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/ifreq.h
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/ifreq.h')
-rw-r--r--sysdeps/unix/sysv/linux/ifreq.h9
1 files changed, 6 insertions, 3 deletions
diff --git a/sysdeps/unix/sysv/linux/ifreq.h b/sysdeps/unix/sysv/linux/ifreq.h
index 216c1f3373..9d42664444 100644
--- a/sysdeps/unix/sysv/linux/ifreq.h
+++ b/sysdeps/unix/sysv/linux/ifreq.h
@@ -26,7 +26,7 @@
 #include "kernel-features.h"
 
 /* Variable to signal whether SIOCGIFCONF is not available.  */
-#if __ASSUME_SIOCGIFNAME == 0
+#if __ASSUME_SIOCGIFNAME == 0 || 1
 static int old_siocgifconf;
 #else
 # define old_siocgifconf 0
@@ -73,7 +73,7 @@ __ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd)
     rq_len = RQ_IFS * sizeof (struct ifreq);
 
   /* Read all the interfaces out of the kernel.  */
-  do
+  while (1)
     {
       ifc.ifc_len = rq_len;
       ifc.ifc_buf = realloc (ifc.ifc_buf, ifc.ifc_len);
@@ -89,9 +89,12 @@ __ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd)
 	  *ifreqs = NULL;
 	  return;
 	}
+
+      if (!old_siocgifconf || ifc.ifc_len < rq_len)
+	break;
+
       rq_len *= 2;
     }
-  while (ifc.ifc_len == rq_len && old_siocgifconf);
 
   nifs = ifc.ifc_len / sizeof (struct ifreq);