From 2225e431d6a8702495bf6432ba4bf1f8bc6a0742 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 | 20 ++++++++++++++++++++ wcs/formdef.py | 5 ++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/tests/test_formdef.py b/tests/test_formdef.py index b54b3fe5..6578ed40 100644 --- a/tests/test_formdef.py +++ b/tests/test_formdef.py @@ -622,3 +622,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 7bede6b7..b11d9c37 100644 --- a/wcs/formdef.py +++ b/wcs/formdef.py @@ -1551,7 +1551,10 @@ 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 + else: + raise return o @classmethod -- 2.30.0