Skip to content

Commit 6a38aef

Browse files
kk7dsmnaser
authored andcommitted
Reject qcow files with data-file attributes
Change-Id: I6326a3e85c1ba4cb1da944a4323769f2399ed2c1 Closes-Bug: #2059809 (cherry picked from commit 2ca29af4433e9fa99a0a48e230d8d25d6eaa4a87) (cherry picked from commit c3586f3a122f6cb0663217b12b52203e74e2e4fa) (cherry picked from commit a92c438fb5ba55440b38cae7c8b4361b58daa9dd) (cherry picked from commit dba3bdb)
1 parent bcfc1e4 commit 6a38aef

File tree

4 files changed

+67
-0
lines changed

4 files changed

+67
-0
lines changed

glance/async_/flows/base_import.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,16 @@ def execute(self, image_id):
181181
'bfile': backing_file}
182182
raise RuntimeError(msg)
183183

184+
try:
185+
data_file = metadata['format-specific']['data']['data-file']
186+
except KeyError:
187+
data_file = None
188+
if data_file is not None:
189+
msg = _("File %(path)s has invalid data-file "
190+
"%(dfile)s, aborting.") % {"path": path,
191+
"dfile": data_file}
192+
raise RuntimeError(msg)
193+
184194
return path
185195

186196
def revert(self, image_id, result, **kwargs):

glance/async_/flows/plugins/image_conversion.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,14 @@ def _execute(self, action, file_path, **kwargs):
121121
raise RuntimeError(
122122
'QCOW images with backing files are not allowed')
123123

124+
try:
125+
data_file = metadata['format-specific']['data']['data-file']
126+
except KeyError:
127+
data_file = None
128+
if data_file is not None:
129+
raise RuntimeError(
130+
'QCOW images with data-file set are not allowed')
131+
124132
if metadata.get('format') == 'vmdk':
125133
create_type = metadata.get(
126134
'format-specific', {}).get(

glance/tests/unit/async_/flows/plugins/test_image_conversion.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,22 @@ def test_image_convert_invalid_qcow(self):
184184
self.assertEqual('QCOW images with backing files are not allowed',
185185
str(e))
186186

187+
def test_image_convert_invalid_qcow_data_file(self):
188+
data = {'format': 'qcow2',
189+
'format-specific': {
190+
'data': {
191+
'data-file': '/etc/hosts',
192+
},
193+
}}
194+
195+
convert = self._setup_image_convert_info_fail()
196+
with mock.patch.object(processutils, 'execute') as exc_mock:
197+
exc_mock.return_value = json.dumps(data), ''
198+
e = self.assertRaises(RuntimeError,
199+
convert.execute, 'file:///test/path.qcow')
200+
self.assertEqual('QCOW images with data-file set are not allowed',
201+
str(e))
202+
187203
def _test_image_convert_invalid_vmdk(self):
188204
data = {'format': 'vmdk',
189205
'format-specific': {

glance/tests/unit/async_/flows/test_import.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,39 @@ def create_image(*args, **kwargs):
178178
self.assertFalse(os.path.exists(tmp_image_path))
179179
self.assertTrue(os.path.exists(image_path))
180180

181+
def test_import_flow_invalid_data_file(self):
182+
self.config(engine_mode='serial',
183+
group='taskflow_executor')
184+
185+
img_factory = mock.MagicMock()
186+
187+
executor = taskflow_executor.TaskExecutor(
188+
self.context,
189+
self.task_repo,
190+
self.img_repo,
191+
img_factory)
192+
193+
self.task_repo.get.return_value = self.task
194+
195+
def create_image(*args, **kwargs):
196+
kwargs['image_id'] = UUID1
197+
return self.img_factory.new_image(*args, **kwargs)
198+
199+
self.img_repo.get.return_value = self.image
200+
img_factory.new_image.side_effect = create_image
201+
202+
with mock.patch.object(script_utils, 'get_image_data_iter') as dmock:
203+
dmock.return_value = io.BytesIO(b"TEST_IMAGE")
204+
205+
with mock.patch.object(putils, 'trycmd') as tmock:
206+
out = json.dumps({'format-specific':
207+
{'data': {'data-file': 'somefile'}}})
208+
tmock.return_value = (out, '')
209+
e = self.assertRaises(RuntimeError,
210+
executor.begin_processing,
211+
self.task.task_id)
212+
self.assertIn('somefile', str(e))
213+
181214
def test_import_flow_revert_import_to_fs(self):
182215
self.config(engine_mode='serial', group='taskflow_executor')
183216

0 commit comments

Comments
 (0)