Skip to content
  • Hanna Reitz's avatar
    bedb8bb4
    vmdk: Reject invalid compressed writes · bedb8bb4
    Hanna Reitz authored
    
    
    Compressed writes generally have to write full clusters, not just in
    theory but also in practice when it comes to vmdk's streamOptimized
    subformat.  It currently is just silently broken for writes with
    non-zero in-cluster offsets:
    
    $ qemu-img create -f vmdk -o subformat=streamOptimized foo.vmdk 1M
    $ qemu-io -c 'write 4k 4k' -c 'read 4k 4k' foo.vmdk
    wrote 4096/4096 bytes at offset 4096
    4 KiB, 1 ops; 00.01 sec (443.724 KiB/sec and 110.9309 ops/sec)
    read failed: Invalid argument
    
    (The technical reason is that vmdk_write_extent() just writes the
    incomplete compressed data actually to offset 4k.  When reading the
    data, vmdk_read_extent() looks at offset 0 and finds the compressed data
    size to be 0, because that is what it reads from there.  This yields an
    error.)
    
    For incomplete writes with zero in-cluster offsets, the error path when
    reading the rest of the cluster is a bit different, but the result is
    the same:
    
    $ qemu-img create -f vmdk -o subformat=streamOptimized foo.vmdk 1M
    $ qemu-io -c 'write 0k 4k' -c 'read 4k 4k' foo.vmdk
    wrote 4096/4096 bytes at offset 0
    4 KiB, 1 ops; 00.01 sec (362.641 KiB/sec and 90.6603 ops/sec)
    read failed: Invalid argument
    
    (Here, vmdk_read_extent() finds the data and then sees that the
    uncompressed data is short.)
    
    It is better to reject invalid writes than to make the user believe they
    might have succeeded and then fail when trying to read it back.
    
    Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
    Reviewed-by: default avatarJohn Snow <jsnow@redhat.com>
    Message-id: 20190815153638.4600-5-mreitz@redhat.com
    Reviewed-by: default avatarJohn Snow <jsnow@redhat.com>
    Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
    bedb8bb4
    vmdk: Reject invalid compressed writes
    Hanna Reitz authored
    
    
    Compressed writes generally have to write full clusters, not just in
    theory but also in practice when it comes to vmdk's streamOptimized
    subformat.  It currently is just silently broken for writes with
    non-zero in-cluster offsets:
    
    $ qemu-img create -f vmdk -o subformat=streamOptimized foo.vmdk 1M
    $ qemu-io -c 'write 4k 4k' -c 'read 4k 4k' foo.vmdk
    wrote 4096/4096 bytes at offset 4096
    4 KiB, 1 ops; 00.01 sec (443.724 KiB/sec and 110.9309 ops/sec)
    read failed: Invalid argument
    
    (The technical reason is that vmdk_write_extent() just writes the
    incomplete compressed data actually to offset 4k.  When reading the
    data, vmdk_read_extent() looks at offset 0 and finds the compressed data
    size to be 0, because that is what it reads from there.  This yields an
    error.)
    
    For incomplete writes with zero in-cluster offsets, the error path when
    reading the rest of the cluster is a bit different, but the result is
    the same:
    
    $ qemu-img create -f vmdk -o subformat=streamOptimized foo.vmdk 1M
    $ qemu-io -c 'write 0k 4k' -c 'read 4k 4k' foo.vmdk
    wrote 4096/4096 bytes at offset 0
    4 KiB, 1 ops; 00.01 sec (362.641 KiB/sec and 90.6603 ops/sec)
    read failed: Invalid argument
    
    (Here, vmdk_read_extent() finds the data and then sees that the
    uncompressed data is short.)
    
    It is better to reject invalid writes than to make the user believe they
    might have succeeded and then fail when trying to read it back.
    
    Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
    Reviewed-by: default avatarJohn Snow <jsnow@redhat.com>
    Message-id: 20190815153638.4600-5-mreitz@redhat.com
    Reviewed-by: default avatarJohn Snow <jsnow@redhat.com>
    Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
Loading