[libvirt] [PATCH] lxc: fix veth off by 1 error

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



When not specifying a target for veth device, veth.c:getFreeVethName()
is supposed to scan for unused veth devices in /sys/class/net.
However, when it finds one, it bumps the index by one before
returning it.

So, if you have one container running, veth0 is passed into
the container, veth1 is taken and still sitting in /sys/class/net.
When you now start a second container, getFreeVethName() finds
veth0 is unused, but returns 1.  Now container creation dies
becuase /sys/class/net/veth1 exists.

Signed-off-by: Serge Hallyn <serue@xxxxxxxxxx>
---
 src/veth.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/veth.c b/src/veth.c
index 93173e4..90c1dcb 100644
--- a/src/veth.c
+++ b/src/veth.c
@@ -35,12 +35,12 @@
 static int getFreeVethName(char *veth, int maxLen, int startDev)
 {
     int rc = -1;
-    int devNum = startDev;
+    int devNum = startDev-1;
     char path[PATH_MAX];
 
     do {
-        snprintf(path, PATH_MAX, "/sys/class/net/veth%d/", devNum);
         ++devNum;
+        snprintf(path, PATH_MAX, "/sys/class/net/veth%d/", devNum);
     } while (virFileExists(path));
 
     snprintf(veth, maxLen, "veth%d", devNum);
@@ -97,6 +97,7 @@ int vethCreate(char* veth1, int veth1MaxLen,
 
     while ((1 > strlen(veth2)) || STREQ(veth1, veth2)) {
         vethDev = getFreeVethName(veth2, veth2MaxLen, vethDev);
+        ++vethDev;
         DEBUG("assigned veth2: %s", veth2);
     }
 
-- 
1.6.2

--
Libvir-list mailing list
Libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list

[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]