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

[Xen-devel] [PATCH 14/14]: libxenlight, checks before device deletion and addition



Proper existential checks before adding or deleting a
device, i.e. return error if:

- Adding a device to a non-existent domain
- Adding a device twice
- Deleting a non-existent device
- Deleting a device from a non-existent domain

Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>


# HG changeset patch
# User Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>
# Date 1259606866 18000
# Node ID 7a2b9d53941757142b408d09020099990b725467
# Parent  bf82205e60f45e98ab637c68d5c305dcb3e167cd
Proper existential checks before adding or deleting a 
device, i.e. return error if:

- Adding a device to a non-existent domain
- Adding a device twice
- Deleting a non-existent device
- Deleting a device from a non-existent domain

Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>

diff -r bf82205e60f4 -r 7a2b9d539417 libxl.c
--- a/libxl.c
+++ b/libxl.c
@@ -1008,6 +1008,7 @@ int libxl_device_disk_add(struct libxl_c
     int devid;
     libxl_device device;
     int major, minor;
+    int rc;
 
     front = flexarray_make(16, 1);
     if (!front)
@@ -1126,12 +1127,12 @@ int libxl_device_disk_add(struct libxl_c
         flexarray_set(front, foffset++, "x86_32-abi"); /* hardcoded ! */
     }
 
-    libxl_device_generic_add(ctx, &device,
+    rc = libxl_device_generic_add(ctx, &device,
                              libxl_xs_kvs_of_flexarray(ctx, back, boffset),
                              libxl_xs_kvs_of_flexarray(ctx, front, foffset));
     flexarray_free(back);
     flexarray_free(front);
-    return 0;
+    return rc;
 }
 
 int libxl_device_disk_del(struct libxl_ctx *ctx, 
@@ -1169,6 +1170,7 @@ int libxl_device_nic_add(struct libxl_ct
     unsigned int boffset = 0;
     unsigned int foffset = 0;
     libxl_device device;
+    int rc;
 
     front = flexarray_make(16, 1);
     if (!front)
@@ -1214,14 +1216,14 @@ int libxl_device_nic_add(struct libxl_ct
         flexarray_set(front, foffset++, "x86_32-abi"); /* hardcoded ! */
     }
 
-    libxl_device_generic_add(ctx, &device,
+    rc = libxl_device_generic_add(ctx, &device,
                              libxl_xs_kvs_of_flexarray(ctx, back, boffset),
                              libxl_xs_kvs_of_flexarray(ctx, front, foffset));
 
     /* FIXME: wait for plug */
     flexarray_free(back);
     flexarray_free(front);
-    return 0;
+    return rc;
 }
 
 int libxl_device_nic_del(struct libxl_ctx *ctx, 
@@ -1257,6 +1259,7 @@ int libxl_device_console_add(struct libx
     unsigned int boffset = 0;
     unsigned int foffset = 0;
     libxl_device device;
+    int rc;
 
     if (console->build_state) {
         xs_transaction_t t;
@@ -1319,13 +1322,13 @@ retry_transaction:
     else
         flexarray_set(front, foffset++, "ioemu");
 
-    libxl_device_generic_add(ctx, &device,
+    rc = libxl_device_generic_add(ctx, &device,
                              libxl_xs_kvs_of_flexarray(ctx, back, boffset),
                              libxl_xs_kvs_of_flexarray(ctx, front, foffset));
     flexarray_free(back);
     flexarray_free(front);
 
-    return 0;
+    return rc;
 }
 
 
/******************************************************************************/
@@ -1336,6 +1339,7 @@ int libxl_device_vkb_add(struct libxl_ct
     unsigned int boffset = 0;
     unsigned int foffset = 0;
     libxl_device device;
+    int rc;
 
     front = flexarray_make(16, 1);
     if (!front)
@@ -1371,7 +1375,7 @@ int libxl_device_vkb_add(struct libxl_ct
     flexarray_free(back);
     flexarray_free(front);
 
-    return 0;
+    return rc;
 }
 
 int libxl_device_vkb_clean_shutdown(struct libxl_ctx *ctx, uint32_t domid)
diff -r bf82205e60f4 -r 7a2b9d539417 libxl_device.c
--- a/libxl_device.c
+++ b/libxl_device.c
@@ -45,6 +45,18 @@ int libxl_device_generic_add(struct libx
     struct xs_permissions backend_perms[2];
     struct xs_permissions hotplug_perms[1];
 
+    /* Check the domain exists before trying to add */
+    {
+        xc_dominfo_t *info = libxl_domain_info(ctx, device->domid);
+        if (!info) {
+            XL_LOG(ctx, XL_LOG_ERROR, "Adding %s to inexistent domain %u\n",
+                                        string_of_kinds[device->kind], 
+                                        device->domid);
+            return ERROR_FAIL;
+        }
+        free(info);
+    }
+
     dom_path_backend = libxl_xs_get_dompath(ctx, device->backend_domid);
     dom_path = libxl_xs_get_dompath(ctx, device->domid);
 
@@ -68,9 +80,29 @@ int libxl_device_generic_add(struct libx
     hotplug_perms[0].id = device->backend_domid;
     hotplug_perms[0].perms = XS_PERM_NONE;
 
+    {
+        /* Read frontend_path and check state before removing stuff */
+        char *state_path = libxl_sprintf(ctx, "%s/state", frontend_path);
+        char *state = libxl_xs_read(ctx, XBT_NULL, state_path);
+        libxl_free(ctx, state_path);
+        if (state) {
+            int state_num = atoi(state);
+            libxl_free(ctx, state);
+            if (state_num == 4) {
+                XL_LOG(ctx, XL_LOG_ERROR, "Trying to add twice device "
+                                          "with frontend path %s\n", 
frontend_path);
+                libxl_free(ctx, dom_path_backend);
+                libxl_free(ctx, dom_path);
+                libxl_free(ctx, frontend_path);
+                libxl_free(ctx, backend_path);
+                libxl_free(ctx, hotplug_path);
+                return -1;
+            }
+        }
+    }
+
 retry_transaction:
     t = xs_transaction_start(ctx->xsh);
-    /* FIXME: read frontend_path and check state before removing stuff */
 
     xs_rm(ctx->xsh, t, frontend_path);
     xs_rm(ctx->xsh, t, backend_path);
@@ -179,12 +211,20 @@ int libxl_device_destroy(struct libxl_ct
     xs_transaction_t t;
     char *state_path = libxl_sprintf(ctx, "%s/state", be_path);
     char *state = libxl_xs_read(ctx, XBT_NULL, state_path);
-    if (!state)
-        return 0;
+    if (!state) {
+        XL_LOG(ctx, XL_LOG_ERROR, "Trying to remove non-existent device "
+                                  "with backend path %s\n", be_path);
+        libxl_free(ctx, state_path);
+        libxl_free(ctx, state);
+        return -1;
+    }
     if (atoi(state) != 4) {
         xs_rm(ctx->xsh, XBT_NULL, be_path);
+        libxl_free(ctx, state_path);
+        libxl_free(ctx, state);
         return 0;
     }
+    libxl_free(ctx, state);
 
 retry_transaction:
     t = xs_transaction_start(ctx->xsh);
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.