rpms/kvm/F-9 kvm-62-block-rw-range-check.patch,1.1.8.1,1.1.8.2

Juan Quintela quintela at fedoraproject.org
Tue Oct 21 16:38:40 UTC 2008


Author: quintela

Update of /cvs/pkgs/rpms/kvm/F-9
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv29839

Added Files:
      Tag: private-quintela-kvm-77-branch
	kvm-62-block-rw-range-check.patch 
Log Message:
New patch needed for kvm-77 update

kvm-62-block-rw-range-check.patch:

Index: kvm-62-block-rw-range-check.patch
===================================================================
RCS file: kvm-62-block-rw-range-check.patch
diff -N kvm-62-block-rw-range-check.patch
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ kvm-62-block-rw-range-check.patch	21 Oct 2008 16:38:09 -0000	1.1.8.2
@@ -0,0 +1,217 @@
+diff --git a/qemu/block-qcow.c b/qemu/block-qcow.c
+index 1fecf30..919dd51 100644
+--- a/qemu/block-qcow.c
++++ b/qemu/block-qcow.c
+@@ -95,7 +95,7 @@ static int qcow_open(BlockDriverState *bs, const char *filename, int flags)
+     int len, i, shift, ret;
+     QCowHeader header;
+ 
+-    ret = bdrv_file_open(&s->hd, filename, flags);
++    ret = bdrv_file_open(&s->hd, filename, flags | BDRV_O_AUTOGROW);
+     if (ret < 0)
+         return ret;
+     if (bdrv_pread(s->hd, 0, &header, sizeof(header)) != sizeof(header))
+diff --git a/qemu/block-qcow2.c b/qemu/block-qcow2.c
+index b9f1688..31e2726 100644
+--- a/qemu/block-qcow2.c
++++ b/qemu/block-qcow2.c
+@@ -193,7 +193,7 @@ static int qcow_open(BlockDriverState *bs, const char *filename, int flags)
+     int len, i, shift, ret;
+     QCowHeader header;
+ 
+-    ret = bdrv_file_open(&s->hd, filename, flags);
++    ret = bdrv_file_open(&s->hd, filename, flags | BDRV_O_AUTOGROW);
+     if (ret < 0)
+         return ret;
+     if (bdrv_pread(s->hd, 0, &header, sizeof(header)) != sizeof(header))
+diff --git a/qemu/block-vmdk.c b/qemu/block-vmdk.c
+index 305463f..99234c1 100644
+--- a/qemu/block-vmdk.c
++++ b/qemu/block-vmdk.c
+@@ -376,7 +376,7 @@ static int vmdk_open(BlockDriverState *bs, const char *filename, int flags)
+         // Parent must be opened as RO.
+         flags = BDRV_O_RDONLY;
+ 
+-    ret = bdrv_file_open(&s->hd, filename, flags);
++    ret = bdrv_file_open(&s->hd, filename, flags | BDRV_O_AUTOGROW);
+     if (ret < 0)
+         return ret;
+     if (bdrv_pread(s->hd, 0, &magic, sizeof(magic)) != sizeof(magic))
+diff --git a/qemu/block.c b/qemu/block.c
+index f4f9c97..f9f8c2d 100644
+--- a/qemu/block.c
++++ b/qemu/block.c
+@@ -124,6 +124,60 @@ void path_combine(char *dest, int dest_size,
+     }
+ }
+ 
++static int bdrv_rd_badreq_sectors(BlockDriverState *bs,
++                                  int64_t sector_num, int nb_sectors)
++{
++    return
++        nb_sectors < 0 ||
++        sector_num < 0 ||
++        nb_sectors > bs->total_sectors ||
++        sector_num > bs->total_sectors - nb_sectors;
++}
++
++static int bdrv_rd_badreq_bytes(BlockDriverState *bs,
++                                int64_t offset, int count)
++{
++    int64_t size = bs->total_sectors << SECTOR_BITS;
++    return
++        count < 0 ||
++        size < 0 ||
++        count > size ||
++        offset > size - count;
++}
++
++static int bdrv_wr_badreq_sectors(BlockDriverState *bs,
++                                  int64_t sector_num, int nb_sectors)
++{
++    if (sector_num < 0 ||
++        nb_sectors < 0)
++        return 1;
++
++    if (sector_num > bs->total_sectors - nb_sectors) {
++        if (bs->autogrow)
++            bs->total_sectors = sector_num + nb_sectors;
++        else
++            return 1;
++    }
++    return 0;
++}
++
++static int bdrv_wr_badreq_bytes(BlockDriverState *bs,
++                                int64_t offset, int count)
++{
++    int64_t size = bs->total_sectors << SECTOR_BITS;
++    if (count < 0 ||
++        offset < 0)
++        return 1;
++
++    if (offset > size - count) {
++        if (bs->autogrow)
++            bs->total_sectors = (offset + count + SECTOR_SIZE - 1) >> SECTOR_BITS;
++        else
++            return 1;
++    }
++    return 0;
++}
++
+ 
+ static void bdrv_register(BlockDriver *bdrv)
+ {
+@@ -336,6 +390,10 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
+     bs->read_only = 0;
+     bs->is_temporary = 0;
+     bs->encrypted = 0;
++    bs->autogrow = 0;
++
++    if (flags & BDRV_O_AUTOGROW)
++        bs->autogrow = 1;
+ 
+     if (flags & BDRV_O_SNAPSHOT) {
+         BlockDriverState *bs1;
+@@ -380,6 +438,7 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
+     }
+     bs->drv = drv;
+     bs->opaque = qemu_mallocz(drv->instance_size);
++    bs->total_sectors = 0; /* driver will set if it does not do getlength */
+     if (bs->opaque == NULL && drv->instance_size > 0)
+         return -1;
+     /* Note: for compatibility, we open disk image files as RDWR, and
+@@ -445,6 +504,7 @@ void bdrv_close(BlockDriverState *bs)
+         bs->drv = NULL;
+ 
+         /* call the change callback */
++        bs->total_sectors = 0;
+         bs->media_changed = 1;
+         if (bs->change_cb)
+             bs->change_cb(bs->change_opaque);
+@@ -517,6 +577,8 @@ int bdrv_read(BlockDriverState *bs, int64_t sector_num,
+     if (!drv)
+         return -ENOMEDIUM;
+ 
++    if (bdrv_rd_badreq_sectors(bs, sector_num, nb_sectors))
++        return -EDOM;
+     if (sector_num == 0 && bs->boot_sector_enabled && nb_sectors > 0) {
+             memcpy(buf, bs->boot_sector_data, 512);
+         sector_num++;
+@@ -557,6 +619,8 @@ int bdrv_write(BlockDriverState *bs, int64_t sector_num,
+         return -ENOMEDIUM;
+     if (bs->read_only)
+         return -EACCES;
++    if (bdrv_wr_badreq_sectors(bs, sector_num, nb_sectors))
++        return -EDOM;
+     if (sector_num == 0 && bs->boot_sector_enabled && nb_sectors > 0) {
+         memcpy(bs->boot_sector_data, buf, 512);
+     }
+@@ -682,6 +746,8 @@ int bdrv_pread(BlockDriverState *bs, int64_t offset,
+         return -ENOMEDIUM;
+     if (!drv->bdrv_pread)
+         return bdrv_pread_em(bs, offset, buf1, count1);
++    if (bdrv_rd_badreq_bytes(bs, offset, count1))
++        return -EDOM;
+     return drv->bdrv_pread(bs, offset, buf1, count1);
+ }
+ 
+@@ -697,6 +763,8 @@ int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
+         return -ENOMEDIUM;
+     if (!drv->bdrv_pwrite)
+         return bdrv_pwrite_em(bs, offset, buf1, count1);
++    if (bdrv_wr_badreq_bytes(bs, offset, count1))
++        return -EDOM;
+     return drv->bdrv_pwrite(bs, offset, buf1, count1);
+ }
+ 
+@@ -1129,6 +1197,8 @@ int bdrv_write_compressed(BlockDriverState *bs, int64_t sector_num,
+         return -ENOMEDIUM;
+     if (!drv->bdrv_write_compressed)
+         return -ENOTSUP;
++    if (bdrv_wr_badreq_sectors(bs, sector_num, nb_sectors))
++        return -EDOM;
+     return drv->bdrv_write_compressed(bs, sector_num, buf, nb_sectors);
+ }
+ 
+@@ -1275,6 +1345,8 @@ BlockDriverAIOCB *bdrv_aio_read(BlockDriverState *bs, int64_t sector_num,
+ 
+     if (!drv)
+         return NULL;
++    if (bdrv_rd_badreq_sectors(bs, sector_num, nb_sectors))
++        return NULL;
+ 
+     /* XXX: we assume that nb_sectors == 0 is suppored by the async read */
+     if (sector_num == 0 && bs->boot_sector_enabled && nb_sectors > 0) {
+@@ -1306,6 +1378,8 @@ BlockDriverAIOCB *bdrv_aio_write(BlockDriverState *bs, int64_t sector_num,
+         return NULL;
+     if (bs->read_only)
+         return NULL;
++    if (bdrv_wr_badreq_sectors(bs, sector_num, nb_sectors))
++        return NULL;
+     if (sector_num == 0 && bs->boot_sector_enabled && nb_sectors > 0) {
+         memcpy(bs->boot_sector_data, buf, 512);
+     }
+diff -uNp kvm-76/qemu/block.h.orig kvm-76/qemu/block.h
+--- kvm-76/qemu/block.h.orig	2008-09-28 17:13:28.000000000 +0200
++++ kvm-76/qemu/block.h	2008-10-10 16:02:17.000000000 +0200
+@@ -48,6 +48,7 @@ typedef struct QEMUSnapshotInfo {
+                                      it (default for
+                                      bdrv_file_open()) */
+ #define BDRV_O_DIRECT      0x0020
++#define BDRV_O_AUTOGROW    0x0040 /* Allow backing file to extend when writing past end of file */
+ 
+ void bdrv_info(void);
+ void bdrv_info_stats(void);
+diff --git a/qemu/block_int.h b/qemu/block_int.h
+index 2d70cf1..efd7516 100644
+--- a/qemu/block_int.h
++++ b/qemu/block_int.h
+@@ -97,6 +97,7 @@ struct BlockDriverState {
+     int locked;    /* if true, the media cannot temporarily be ejected */
+     int encrypted; /* if true, the media is encrypted */
+     int sg;        /* if true, the device is a /dev/sg* */
++    int autogrow;  /* if true, the backing store can auto-extend to allocate new extents */
+     /* event callback when inserting/removing */
+     void (*change_cb)(void *opaque);
+     void *change_opaque;




More information about the fedora-extras-commits mailing list