[libvirt] [PATCH 2/2] interface: Take interface status into account when starting and destroying

Michal Privoznik mprivozn at redhat.com
Wed Dec 11 09:16:38 UTC 2013


https://bugzilla.redhat.com/show_bug.cgi?id=956994

Currently, it is possible to start an interface that is already running:

 # virsh iface-start eth2
 Interface eth2 started

 # echo $?
 0

 # virsh iface-start eth2
 Interface eth2 started

 # echo $?
 0

 # virsh iface-start eth2
 Interface eth2 started

 # echo $?
 0

Same applies for destroying a dead interface. We should not allow such
state transitions.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/interface/interface_backend_netcf.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/src/interface/interface_backend_netcf.c b/src/interface/interface_backend_netcf.c
index 2e681ec..c525ca9 100644
--- a/src/interface/interface_backend_netcf.c
+++ b/src/interface/interface_backend_netcf.c
@@ -944,6 +944,7 @@ static int netcfInterfaceCreate(virInterfacePtr ifinfo,
     struct netcf_if *iface = NULL;
     virInterfaceDefPtr def = NULL;
     int ret = -1;
+    bool active;
 
     virCheckFlags(0, -1);
 
@@ -962,6 +963,15 @@ static int netcfInterfaceCreate(virInterfacePtr ifinfo,
     if (virInterfaceCreateEnsureACL(ifinfo->conn, def) < 0)
        goto cleanup;
 
+    if (netcfInterfaceObjIsActive(iface, &active) < 0)
+        goto cleanup;
+
+    if (active) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("interface is already running"));
+        goto cleanup;
+    }
+
     ret = ncf_if_up(iface);
     if (ret < 0) {
         const char *errmsg, *details;
@@ -987,6 +997,7 @@ static int netcfInterfaceDestroy(virInterfacePtr ifinfo,
     struct netcf_if *iface = NULL;
     virInterfaceDefPtr def = NULL;
     int ret = -1;
+    bool active;
 
     virCheckFlags(0, -1);
 
@@ -1005,6 +1016,15 @@ static int netcfInterfaceDestroy(virInterfacePtr ifinfo,
     if (virInterfaceDestroyEnsureACL(ifinfo->conn, def) < 0)
        goto cleanup;
 
+    if (netcfInterfaceObjIsActive(iface, &active) < 0)
+        goto cleanup;
+
+    if (!active) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("interface is not running"));
+        goto cleanup;
+    }
+
     ret = ncf_if_down(iface);
     if (ret < 0) {
         const char *errmsg, *details;
-- 
1.8.5.1




More information about the libvir-list mailing list