]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Fix a crash when using Open vSwitch virtual ports
authorKyle Mestery <kmestery@cisco.com>
Wed, 29 Aug 2012 18:44:36 +0000 (14:44 -0400)
committerDaniel Veillard <veillard@redhat.com>
Thu, 30 Aug 2012 05:48:52 +0000 (13:48 +0800)
Fixup buffer usage when handling VLANs. Also fix the logic
used to determine if the virNetDevVlanPtr is valid or not.
Fixes crashes in the latest code when using Open vSwitch
virtualports.

Signed-off-by: Kyle Mestery <kmestery@cisco.com>
src/util/virnetdevopenvswitch.c

index b903ae4ee668d9ae83f27673313a3ef2e9d8e29c..06debd7912b16783ec068653e761eb8e720d21a6 100644 (file)
@@ -59,7 +59,7 @@ int virNetDevOpenvswitchAddPort(const char *brname, const char *ifname,
     char *ifaceid_ex_id = NULL;
     char *profile_ex_id = NULL;
     char *vmid_ex_id = NULL;
-    virBufferPtr buf;
+    virBuffer buf = VIR_BUFFER_INITIALIZER;
 
     virMacAddrFormat(macaddr, macaddrstr);
     virUUIDFormat(ovsport->interfaceID, ifuuidstr);
@@ -79,13 +79,12 @@ int virNetDevOpenvswitchAddPort(const char *brname, const char *ifname,
                         ovsport->profileID) < 0)
             goto out_of_memory;
     }
-    if (virtVlan) {
-        if (VIR_ALLOC(buf) < 0)
-            goto out_of_memory;
+
+    if (virtVlan && virtVlan->nTags > 0) {
 
         /* Trunk port first */
-        if (virtVlan->trunk) {
-            virBufferAddLit(buf, "trunk=");
+        if (virtVlan->trunk == true) {
+            virBufferAddLit(&buf, "trunk=");
 
             /*
              * Trunk ports have at least one VLAN. Do the first one
@@ -93,21 +92,21 @@ int virNetDevOpenvswitchAddPort(const char *brname, const char *ifname,
              * start of the for loop if there are more than one VLANs
              * on this trunk port.
              */
-            virBufferAsprintf(buf, "%d", virtVlan->tag[i]);
+            virBufferAsprintf(&buf, "%d", virtVlan->tag[i]);
 
             for (i = 1; i < virtVlan->nTags; i++) {
-                virBufferAddLit(buf, ",");
-                virBufferAsprintf(buf, "%d", virtVlan->tag[i]);
+                virBufferAddLit(&buf, ",");
+                virBufferAsprintf(&buf, "%d", virtVlan->tag[i]);
             }
         } else if (virtVlan->nTags) {
-            virBufferAsprintf(buf, "tag=%d", virtVlan->tag[0]);
+            virBufferAsprintf(&buf, "tag=%d", virtVlan->tag[0]);
         }
     }
 
     cmd = virCommandNew(OVSVSCTL);
     if (ovsport->profileID[0] == '\0') {
         virCommandAddArgList(cmd, "--", "--may-exist", "add-port",
-                        brname, ifname, virBufferContentAndReset(buf),
+                        brname, ifname, virBufferCurrentContent(&buf),
                         "--", "set", "Interface", ifname, attachedmac_ex_id,
                         "--", "set", "Interface", ifname, ifaceid_ex_id,
                         "--", "set", "Interface", ifname, vmid_ex_id,
@@ -116,7 +115,7 @@ int virNetDevOpenvswitchAddPort(const char *brname, const char *ifname,
                         NULL);
     } else {
         virCommandAddArgList(cmd, "--", "--may-exist", "add-port",
-                        brname, ifname, virBufferContentAndReset(buf),
+                        brname, ifname, virBufferCurrentContent(&buf),
                         "--", "set", "Interface", ifname, attachedmac_ex_id,
                         "--", "set", "Interface", ifname, ifaceid_ex_id,
                         "--", "set", "Interface", ifname, vmid_ex_id,
@@ -135,7 +134,7 @@ int virNetDevOpenvswitchAddPort(const char *brname, const char *ifname,
 
     ret = 0;
 cleanup:
-    VIR_FREE(buf);
+    virBufferFreeAndReset(&buf);
     VIR_FREE(attachedmac_ex_id);
     VIR_FREE(ifaceid_ex_id);
     VIR_FREE(vmid_ex_id);