Commit 712e78744e3a0332825a80298f38225b30dec88c
1 parent
7c35359c
probing fixes
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1425 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
42 additions
and
27 deletions
block-cow.c
| ... | ... | @@ -54,7 +54,8 @@ static int cow_probe(const uint8_t *buf, int buf_size, const char *filename) |
| 54 | 54 | { |
| 55 | 55 | const struct cow_header_v2 *cow_header = (const void *)buf; |
| 56 | 56 | |
| 57 | - if (be32_to_cpu(cow_header->magic) == COW_MAGIC && | |
| 57 | + if (buf_size >= sizeof(struct cow_header_v2) && | |
| 58 | + be32_to_cpu(cow_header->magic) == COW_MAGIC && | |
| 58 | 59 | be32_to_cpu(cow_header->version) == COW_VERSION) |
| 59 | 60 | return 100; |
| 60 | 61 | else | ... | ... |
block-qcow.c
| ... | ... | @@ -80,8 +80,9 @@ static int decompress_cluster(BDRVQcowState *s, uint64_t cluster_offset); |
| 80 | 80 | static int qcow_probe(const uint8_t *buf, int buf_size, const char *filename) |
| 81 | 81 | { |
| 82 | 82 | const QCowHeader *cow_header = (const void *)buf; |
| 83 | - | |
| 84 | - if (be32_to_cpu(cow_header->magic) == QCOW_MAGIC && | |
| 83 | + | |
| 84 | + if (buf_size >= sizeof(QCowHeader) && | |
| 85 | + be32_to_cpu(cow_header->magic) == QCOW_MAGIC && | |
| 85 | 86 | be32_to_cpu(cow_header->version) == QCOW_VERSION) |
| 86 | 87 | return 100; |
| 87 | 88 | else |
| ... | ... | @@ -551,9 +552,19 @@ static int qcow_create(const char *filename, int64_t total_size, |
| 551 | 552 | header_size = sizeof(header); |
| 552 | 553 | backing_filename_len = 0; |
| 553 | 554 | if (backing_file) { |
| 554 | - realpath(backing_file, backing_filename); | |
| 555 | - if (stat(backing_filename, &st) != 0) { | |
| 556 | - return -1; | |
| 555 | + const char *p; | |
| 556 | + /* XXX: this is a hack: we do not attempt to check for URL | |
| 557 | + like syntax */ | |
| 558 | + p = strchr(backing_file, ':'); | |
| 559 | + if (p && (p - backing_file) >= 2) { | |
| 560 | + /* URL like but exclude "c:" like filenames */ | |
| 561 | + pstrcpy(backing_filename, sizeof(backing_filename), | |
| 562 | + backing_file); | |
| 563 | + } else { | |
| 564 | + realpath(backing_file, backing_filename); | |
| 565 | + if (stat(backing_filename, &st) != 0) { | |
| 566 | + return -1; | |
| 567 | + } | |
| 557 | 568 | } |
| 558 | 569 | header.mtime = cpu_to_be32(st.st_mtime); |
| 559 | 570 | header.backing_file_offset = cpu_to_be64(header_size); | ... | ... |
block-vpc.c
| ... | ... | @@ -81,9 +81,8 @@ typedef struct BDRVVPCState { |
| 81 | 81 | |
| 82 | 82 | static int vpc_probe(const uint8_t *buf, int buf_size, const char *filename) |
| 83 | 83 | { |
| 84 | - if (!strncmp(buf, "conectix", 8)) | |
| 84 | + if (buf_size >= 8 && !strncmp(buf, "conectix", 8)) | |
| 85 | 85 | return 100; |
| 86 | - | |
| 87 | 86 | return 0; |
| 88 | 87 | } |
| 89 | 88 | ... | ... |
block.c
| ... | ... | @@ -106,26 +106,29 @@ static BlockDriver *find_image_format(const char *filename) |
| 106 | 106 | size_t bufsize = 1024; |
| 107 | 107 | |
| 108 | 108 | fd = open(filename, O_RDONLY | O_BINARY | O_LARGEFILE); |
| 109 | - if (fd < 0) | |
| 110 | - return NULL; | |
| 109 | + if (fd < 0) { | |
| 110 | + buf = NULL; | |
| 111 | + ret = 0; | |
| 112 | + } else { | |
| 111 | 113 | #ifdef DIOCGSECTORSIZE |
| 112 | - { | |
| 113 | - unsigned int sectorsize = 512; | |
| 114 | - if (!ioctl(fd, DIOCGSECTORSIZE, §orsize) && | |
| 115 | - sectorsize > bufsize) | |
| 116 | - bufsize = sectorsize; | |
| 117 | - } | |
| 114 | + { | |
| 115 | + unsigned int sectorsize = 512; | |
| 116 | + if (!ioctl(fd, DIOCGSECTORSIZE, §orsize) && | |
| 117 | + sectorsize > bufsize) | |
| 118 | + bufsize = sectorsize; | |
| 119 | + } | |
| 118 | 120 | #endif |
| 119 | - buf = malloc(bufsize); | |
| 120 | - if (!buf) | |
| 121 | - return NULL; | |
| 122 | - ret = read(fd, buf, bufsize); | |
| 123 | - if (ret < 0) { | |
| 121 | + buf = qemu_malloc(bufsize); | |
| 122 | + if (!buf) | |
| 123 | + return NULL; | |
| 124 | + ret = read(fd, buf, bufsize); | |
| 125 | + if (ret < 0) { | |
| 126 | + close(fd); | |
| 127 | + qemu_free(buf); | |
| 128 | + return NULL; | |
| 129 | + } | |
| 124 | 130 | close(fd); |
| 125 | - free(buf); | |
| 126 | - return NULL; | |
| 127 | 131 | } |
| 128 | - close(fd); | |
| 129 | 132 | |
| 130 | 133 | drv = NULL; |
| 131 | 134 | score_max = 0; |
| ... | ... | @@ -136,7 +139,7 @@ static BlockDriver *find_image_format(const char *filename) |
| 136 | 139 | drv = drv1; |
| 137 | 140 | } |
| 138 | 141 | } |
| 139 | - free(buf); | |
| 142 | + qemu_free(buf); | |
| 140 | 143 | return drv; |
| 141 | 144 | } |
| 142 | 145 | |
| ... | ... | @@ -154,7 +157,7 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int snapshot, |
| 154 | 157 | bs->read_only = 0; |
| 155 | 158 | bs->is_temporary = 0; |
| 156 | 159 | bs->encrypted = 0; |
| 157 | - | |
| 160 | + | |
| 158 | 161 | if (snapshot) { |
| 159 | 162 | BlockDriverState *bs1; |
| 160 | 163 | int64_t total_size; |
| ... | ... | @@ -183,7 +186,7 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int snapshot, |
| 183 | 186 | filename = tmp_filename; |
| 184 | 187 | bs->is_temporary = 1; |
| 185 | 188 | } |
| 186 | - | |
| 189 | + | |
| 187 | 190 | pstrcpy(bs->filename, sizeof(bs->filename), filename); |
| 188 | 191 | if (!drv) { |
| 189 | 192 | drv = find_image_format(filename); |
| ... | ... | @@ -653,4 +656,5 @@ void bdrv_init(void) |
| 653 | 656 | bdrv_register(&bdrv_dmg); |
| 654 | 657 | bdrv_register(&bdrv_bochs); |
| 655 | 658 | bdrv_register(&bdrv_vpc); |
| 659 | + bdrv_register(&bdrv_vvfat); | |
| 656 | 660 | } | ... | ... |