Revision 1640366c

b/block/vmdk.c
233 233
    memset(&header, 0, sizeof(header));
234 234
    memcpy(&header,&hdr[4], sizeof(header)); // skip the VMDK4_MAGIC
235 235

  
236
    ftruncate(snp_fd, header.grain_offset << 9);
236
    if (ftruncate(snp_fd, header.grain_offset << 9))
237
        goto fail;
237 238
    /* the descriptor offset = 0x200 */
238 239
    if (lseek(p_fd, 0x200, SEEK_SET) == -1)
239 240
        goto fail;
......
717 718
    int64_t total_size = 0;
718 719
    const char *backing_file = NULL;
719 720
    int flags = 0;
721
    int ret;
720 722

  
721 723
    // Read out options
722 724
    while (options && options->name) {
......
773 775
    header.check_bytes[3] = 0xa;
774 776

  
775 777
    /* write all the data */
776
    write(fd, &magic, sizeof(magic));
777
    write(fd, &header, sizeof(header));
778
    ret = qemu_write_full(fd, &magic, sizeof(magic));
779
    if (ret != sizeof(magic)) {
780
        ret = -1;
781
        goto exit;
782
    }
783
    ret = qemu_write_full(fd, &header, sizeof(header));
784
    if (ret != sizeof(header)) {
785
        ret = -1;
786
        goto exit;
787
    }
778 788

  
779
    ftruncate(fd, header.grain_offset << 9);
789
    ret = ftruncate(fd, header.grain_offset << 9);
790
    if (ret < 0) {
791
        ret = -1;
792
        goto exit;
793
    }
780 794

  
781 795
    /* write grain directory */
782 796
    lseek(fd, le64_to_cpu(header.rgd_offset) << 9, SEEK_SET);
783 797
    for (i = 0, tmp = header.rgd_offset + gd_size;
784
         i < gt_count; i++, tmp += gt_size)
785
        write(fd, &tmp, sizeof(tmp));
798
         i < gt_count; i++, tmp += gt_size) {
799
        ret = qemu_write_full(fd, &tmp, sizeof(tmp));
800
        if (ret != sizeof(tmp)) {
801
            ret = -1;
802
            goto exit;
803
        }
804
    }
786 805

  
787 806
    /* write backup grain directory */
788 807
    lseek(fd, le64_to_cpu(header.gd_offset) << 9, SEEK_SET);
789 808
    for (i = 0, tmp = header.gd_offset + gd_size;
790
         i < gt_count; i++, tmp += gt_size)
791
        write(fd, &tmp, sizeof(tmp));
809
         i < gt_count; i++, tmp += gt_size) {
810
        ret = qemu_write_full(fd, &tmp, sizeof(tmp));
811
        if (ret != sizeof(tmp)) {
812
            ret = -1;
813
            goto exit;
814
        }
815
    }
792 816

  
793 817
    /* compose the descriptor */
794 818
    real_filename = filename;
......
805 829

  
806 830
    /* write the descriptor */
807 831
    lseek(fd, le64_to_cpu(header.desc_offset) << 9, SEEK_SET);
808
    write(fd, desc, strlen(desc));
832
    ret = qemu_write_full(fd, desc, strlen(desc));
833
    if (ret != strlen(desc)) {
834
        ret = -1;
835
        goto exit;
836
    }
809 837

  
838
    ret = 0;
839
exit:
810 840
    close(fd);
811
    return 0;
841
    return ret;
812 842
}
813 843

  
814 844
static void vmdk_close(BlockDriverState *bs)

Also available in: Unified diff