From 07f3dd363d9fce66ad53dcdad9f80b72bf3bc1dd Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Mon, 22 Feb 2021 23:30:20 +0100 Subject: [PATCH 2/3] formdef: prevent hiding of EOFError on new style pickled formdef (#51327) --- tests/test_formdef.py | 29 ++++++++++++++++++++++++++--- wcs/formdef.py | 7 ++++++- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/tests/test_formdef.py b/tests/test_formdef.py index d4ad2e14..e3b44f51 100644 --- a/tests/test_formdef.py +++ b/tests/test_formdef.py @@ -259,10 +259,13 @@ def test_internal_identifier_migration(pub): formdef.fields = [] formdef.store() - obj = pickle.load(open(formdef.get_object_filename(), 'rb')) + with open(formdef.get_object_filename(), 'rb') as fd: + obj = FormDef.storage_load(fd) del obj.internal_identifier - pickle.dump(obj, open(formdef.get_object_filename(), 'wb')) - assert pickle.load(open(formdef.get_object_filename(), 'rb')).internal_identifier is None + with open(formdef.get_object_filename(), 'wb') as fd: + fd.write(FormDef.storage_dumps(obj)) + with open(formdef.get_object_filename(), 'rb') as fd: + assert pickle.load(fd).internal_identifier is None assert FormDef.get(formdef.id, ignore_migration=True).internal_identifier is None formdef = FormDef.get(formdef.id) @@ -621,3 +624,23 @@ def test_pickle_2to3_conversion(pub): assert formdef.fields[0].label == 'Test' assert formdef.workflow.possible_status[0].items[0].varname == 'blah' assert formdef.workflow.possible_status[0].items[0].formdef.fields[0].varname == 'str' + + +def test_lightweight(pub): + FormDef.wipe() + formdef = FormDef() + formdef.name = 'basic formdef' + formdef.fields = [ + StringField(id='1', label='Test', type='string', varname='foo'), + ] + formdef.store() + + # load works + FormDef.get(formdef.id) + + # truncate the pickle, now load should fail + with open(formdef.get_object_filename(), 'rb+') as fd: + pickle.load(fd) + fd.truncate(fd.tell()) + with pytest.raises(KeyError): + FormDef.get(formdef.id) diff --git a/wcs/formdef.py b/wcs/formdef.py index 880785c9..2855db01 100644 --- a/wcs/formdef.py +++ b/wcs/formdef.py @@ -1550,7 +1550,12 @@ class FormDef(StorableObject): try: o.fields = pickle.load(fd, **PICKLE_KWARGS) except EOFError: - pass # old format + if isinstance(getattr(o, 'fields', None), list): + pass # old format + elif isinstance(o.__dict__.get(b'fields'), list): + pass # old format + else: + raise return o @classmethod -- 2.30.0