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