with temporary_file() as tmp:
LOG.debug("%s was %s, converting to %s",
image_id, volume_format, image_meta['disk_format'])
+
+ data = qemu_img_info(volume_path, run_as_root=run_as_root)
+ backing_file = data.backing_file
+ fmt = data.file_format
+ if backing_file is not None:
+ # Disallow backing files as a security measure.
+ # This prevents a user from writing an image header into a raw
+ # volume with a backing file pointing to data they wish to
+ # access.
+ raise exception.ImageUnacceptable(
+ image_id=image_id,
+ reason=_("fmt=%(fmt)s backed by:%(backing_file)s")
+ % {'fmt': fmt, 'backing_file': backing_file})
+
convert_image(volume_path, tmp, image_meta['disk_format'],
run_as_root=run_as_root)
mock_os.name = 'posix'
data = mock_info.return_value
data.file_format = mock.sentinel.disk_format
+ data.backing_file = None
temp_file = mock_temp.return_value.__enter__.return_value
output = image_utils.upload_volume(ctxt, image_service, image_meta,
temp_file,
mock.sentinel.disk_format,
run_as_root=True)
- mock_info.assert_called_once_with(temp_file, run_as_root=True)
+ mock_info.assert_called_with(temp_file, run_as_root=True)
+ self.assertEqual(mock_info.call_count, 2)
mock_open.assert_called_once_with(temp_file, 'rb')
image_service.update.assert_called_once_with(
ctxt, image_meta['id'], {},
mock_os.name = 'posix'
data = mock_info.return_value
data.file_format = mock.sentinel.other_disk_format
+ data.backing_file = None
temp_file = mock_temp.return_value.__enter__.return_value
self.assertRaises(exception.ImageUnacceptable,
temp_file,
mock.sentinel.disk_format,
run_as_root=True)
- mock_info.assert_called_once_with(temp_file, run_as_root=True)
+ mock_info.assert_called_with(temp_file, run_as_root=True)
+ self.assertEqual(mock_info.call_count, 2)
self.assertFalse(image_service.update.called)