Revision a8842e6d block/vmdk.c
b/block/vmdk.c | ||
---|---|---|
529 | 529 |
static int vmdk_open_desc_file(BlockDriverState *bs, int flags, |
530 | 530 |
uint64_t desc_offset, Error **errp); |
531 | 531 |
|
532 |
static char *vmdk_read_desc(BlockDriverState *file, uint64_t desc_offset, |
|
533 |
Error **errp) |
|
534 |
{ |
|
535 |
int64_t size; |
|
536 |
char *buf; |
|
537 |
int ret; |
|
538 |
|
|
539 |
size = bdrv_getlength(file); |
|
540 |
if (size < 0) { |
|
541 |
error_setg_errno(errp, -size, "Could not access file"); |
|
542 |
return NULL; |
|
543 |
} |
|
544 |
|
|
545 |
size = MIN(size, 1 << 20); /* avoid unbounded allocation */ |
|
546 |
buf = g_malloc0(size + 1); |
|
547 |
|
|
548 |
ret = bdrv_pread(file, desc_offset, buf, size); |
|
549 |
if (ret < 0) { |
|
550 |
error_setg_errno(errp, -ret, "Could not read from file"); |
|
551 |
g_free(buf); |
|
552 |
return NULL; |
|
553 |
} |
|
554 |
|
|
555 |
return buf; |
|
556 |
} |
|
557 |
|
|
532 | 558 |
static int vmdk_open_vmdk4(BlockDriverState *bs, |
533 | 559 |
BlockDriverState *file, |
534 | 560 |
int flags, Error **errp) |
... | ... | |
823 | 849 |
uint64_t desc_offset, Error **errp) |
824 | 850 |
{ |
825 | 851 |
int ret; |
826 |
char *buf = NULL;
|
|
852 |
char *buf; |
|
827 | 853 |
char ct[128]; |
828 | 854 |
BDRVVmdkState *s = bs->opaque; |
829 |
int64_t size; |
|
830 | 855 |
|
831 |
size = bdrv_getlength(bs->file);
|
|
832 |
if (size < 0) {
|
|
856 |
buf = vmdk_read_desc(bs->file, desc_offset, errp);
|
|
857 |
if (!buf) {
|
|
833 | 858 |
return -EINVAL; |
834 |
} |
|
835 |
|
|
836 |
size = MIN(size, 1 << 20); /* avoid unbounded allocation */ |
|
837 |
buf = g_malloc0(size + 1); |
|
838 |
|
|
839 |
ret = bdrv_pread(bs->file, desc_offset, buf, size); |
|
840 |
if (ret < 0) { |
|
841 | 859 |
goto exit; |
842 | 860 |
} |
861 |
|
|
843 | 862 |
if (vmdk_parse_description(buf, "createType", ct, sizeof(ct))) { |
844 | 863 |
ret = -EMEDIUMTYPE; |
845 | 864 |
goto exit; |
Also available in: Unified diff