Skip to content

Commit

Permalink
Reject qcow files with data-file attributes
Browse files Browse the repository at this point in the history
Change-Id: Ic3fa16f55acc38cf6c1a4ac1dce4487225e66d04
Closes-Bug: #2059809
  • Loading branch information
kk7ds committed Jul 2, 2024
1 parent 04ddddf commit ec9c55c
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 0 deletions.
1 change: 1 addition & 0 deletions nova/tests/unit/virt/libvirt/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,7 @@ class FakeImgInfo(object):
FakeImgInfo.file_format = file_format
FakeImgInfo.backing_file = backing_file
FakeImgInfo.virtual_size = 1
FakeImgInfo.format_specific = None if file_format == 'raw' else {}

return FakeImgInfo()

Expand Down
31 changes: 31 additions & 0 deletions nova/tests/unit/virt/test_images.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,37 @@ def test_fetch_to_raw_errors(self, convert_image, qemu_img_info, fetch):
images.fetch_to_raw,
None, 'href123', '/no/path')

@mock.patch.object(images, 'convert_image',
side_effect=exception.ImageUnacceptable)
@mock.patch.object(images, 'qemu_img_info')
@mock.patch.object(images, 'fetch')
def test_fetch_to_raw_data_file(self, convert_image, qemu_img_info_fn,
fetch):
# NOTE(danms): the above test needs the following line as well, as it
# is broken without it.
qemu_img_info = qemu_img_info_fn.return_value
qemu_img_info.backing_file = None
qemu_img_info.file_format = 'qcow2'
qemu_img_info.virtual_size = 20
qemu_img_info.format_specific = {'data': {'data-file': 'somefile'}}
self.assertRaisesRegex(exception.ImageUnacceptable,
'Image href123 is unacceptable.*somefile',
images.fetch_to_raw,
None, 'href123', '/no/path')

@mock.patch('os.rename')
@mock.patch.object(images, 'qemu_img_info')
@mock.patch.object(images, 'fetch')
def test_fetch_to_raw_from_raw(self, fetch, qemu_img_info_fn, mock_rename):
# Make sure we support a case where we fetch an already-raw image and
# qemu-img returns None for "format_specific".
qemu_img_info = qemu_img_info_fn.return_value
qemu_img_info.file_format = 'raw'
qemu_img_info.backing_file = None
qemu_img_info.format_specific = None
images.fetch_to_raw(None, 'href123', '/no/path')
mock_rename.assert_called_once_with('/no/path.part', '/no/path')

@mock.patch.object(compute_utils, 'disk_ops_semaphore')
@mock.patch('nova.privsep.utils.supports_direct_io', return_value=True)
@mock.patch('oslo_concurrency.processutils.execute')
Expand Down
9 changes: 9 additions & 0 deletions nova/virt/images.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,15 @@ def fetch_to_raw(context, image_href, path, trusted_certs=None):
reason=(_("fmt=%(fmt)s backed by: %(backing_file)s") %
{'fmt': fmt, 'backing_file': backing_file}))

try:
data_file = data.format_specific['data']['data-file']
except (KeyError, TypeError, AttributeError):
data_file = None
if data_file is not None:
raise exception.ImageUnacceptable(image_id=image_href,
reason=(_("fmt=%(fmt)s has data-file: %(data_file)s") %
{'fmt': fmt, 'data_file': data_file}))

if fmt == 'vmdk':
check_vmdk_image(image_href, data)

Expand Down

0 comments on commit ec9c55c

Please sign in to comment.