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

[Xen-devel] [PATCH 2/6] ioemu: Use the image format sent by blktapctrl



Currently the blktap backend in ioemu lets qemu guess which format an
image is in. This was a security problem and the blktap backend
doesn't work any more since this was fixed in qemu.

This patch changes ioemu to respect the format it gets from blktapctrl.

Signed-off-by: Kevin Wolf <kwolf@xxxxxxx>
---
 hw/xen_blktap.c |   22 +++++++++++++++++++---
 hw/xen_blktap.h |   14 ++++++++++++++
 2 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/hw/xen_blktap.c b/hw/xen_blktap.c
index 0547889..9cb2a45 100644
--- a/hw/xen_blktap.c
+++ b/hw/xen_blktap.c
@@ -220,9 +220,10 @@ static int map_new_dev(struct td_state *s, int minor)
        return -1;
 }
 
-static int open_disk(struct td_state *s, char *path, int readonly)
+static int open_disk(struct td_state *s, char *path, int driver, int readonly)
 {
        BlockDriverState* bs;
+       BlockDriver* drv;
        char* devname;
        static int devnumber = 0;
        int i;
@@ -232,7 +233,22 @@ static int open_disk(struct td_state *s, char *path, int 
readonly)
        bs = bdrv_new(devname);
        free(devname);
 
-       if (bdrv_open(bs, path, 0) != 0) {
+       /* Search for disk driver */
+       for (i = 0; blktap_drivers[i].idnum >= 0; i++) {
+               if (blktap_drivers[i].idnum == driver)
+                       break;
+       }
+
+       if (blktap_drivers[i].idnum < 0) {
+               fprintf(stderr, "Could not find image format id %d\n", driver);
+               return -ENOMEM;
+       }
+
+       drv = blktap_drivers[i].drv;
+       DPRINTF("%s driver specified\n", drv ? drv->format_name : "No");
+
+       /* Open the image */
+       if (bdrv_open2(bs, path, 0, drv) != 0) {
                fprintf(stderr, "Could not open image file %s\n", path);
                return -ENOMEM;
        }
@@ -523,7 +539,7 @@ static void handle_blktap_ctrlmsg(void* private)
                        s = state_init();
 
                        /*Open file*/
-                       if (s == NULL || open_disk(s, path, msg->readonly)) {
+                       if (s == NULL || open_disk(s, path, msg->drivertype, 
msg->readonly)) {
                                msglen = sizeof(msg_hdr_t);
                                msg->type = CTLMSG_IMG_FAIL;
                                msg->len = msglen;
diff --git a/hw/xen_blktap.h b/hw/xen_blktap.h
index 92cc08e..46ead31 100644
--- a/hw/xen_blktap.h
+++ b/hw/xen_blktap.h
@@ -50,4 +50,18 @@ typedef struct fd_list_entry {
        struct fd_list_entry **pprev, *next;
 } fd_list_entry_t;
 
+typedef struct disk_info {
+       int idnum;
+       struct BlockDriver *drv;
+} disk_info_t;
+
+static disk_info_t blktap_drivers[] = {
+       { DISK_TYPE_AIO, &bdrv_raw },
+       { DISK_TYPE_SYNC, &bdrv_raw },
+       { DISK_TYPE_VMDK, &bdrv_vmdk },
+       { DISK_TYPE_QCOW, &bdrv_qcow },
+       { DISK_TYPE_QCOW2, &bdrv_qcow2 },
+       { -1, NULL }
+};
+
 #endif /*XEN_BLKTAP_H_*/
-- 
1.6.0.2


_______________________________________________
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®.