diff --git a/Lib/copy_reg.py b/Lib/copy_reg.py index cf801cb584d..2bff142b57e 100644 --- a/Lib/copy_reg.py +++ b/Lib/copy_reg.py @@ -10,7 +10,6 @@ __all__ = ["pickle", "constructor", "add_extension", "remove_extension", "clear_extension_cache"] dispatch_table = {} -safe_constructors = {} def pickle(ob_type, pickle_function, constructor_ob=None): if type(ob_type) is _ClassType: @@ -26,7 +25,6 @@ def pickle(ob_type, pickle_function, constructor_ob=None): def constructor(object): if not callable(object): raise TypeError("constructors must be callable") - safe_constructors[object] = 1 # Example: provide pickling support for complex numbers. @@ -41,7 +39,6 @@ def _reconstructor(cls, base, state): obj = base.__new__(cls, state) base.__init__(obj, state) return obj -_reconstructor.__safe_for_unpickling__ = 1 _HEAPTYPE = 1<<9 diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index ed0e436be30..8211dcf58cf 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -15,8 +15,6 @@ class myint(int): class initarg(C): - __safe_for_unpickling__ = 1 - def __init__(self, a, b): self.a = a self.b = b diff --git a/Modules/cPickle.c b/Modules/cPickle.c index 08bb8e8b2d9..07d108914d6 100644 --- a/Modules/cPickle.c +++ b/Modules/cPickle.c @@ -92,14 +92,13 @@ static PyObject *BadPickleGet; static PyObject *dispatch_table; -static PyObject *safe_constructors; static PyObject *empty_tuple; static PyObject *__class___str, *__getinitargs___str, *__dict___str, *__getstate___str, *__setstate___str, *__name___str, *__reduce___str, - *write_str, *__safe_for_unpickling___str, *append_str, + *write_str, *append_str, *read_str, *readline_str, *__main___str, *__basicnew___str, - *copy_reg_str, *dispatch_table_str, *safe_constructors_str; + *copy_reg_str, *dispatch_table_str; /************************************************************************* Internal Data type for pickle data. */ @@ -306,7 +305,6 @@ typedef struct Unpicklerobject { int (*readline_func)(struct Unpicklerobject *, char **); int buf_size; char *buf; - PyObject *safe_constructors; PyObject *find_class; } Unpicklerobject; @@ -3078,8 +3076,7 @@ load_dict(Unpicklerobject *self) static PyObject * Instance_New(PyObject *cls, PyObject *args) { - int has_key; - PyObject *safe=0, *r=0; + PyObject *r = 0; if (PyClass_Check(cls)) { int l; @@ -3107,21 +3104,6 @@ Instance_New(PyObject *cls, PyObject *args) else goto err; } - /* Is safe_constructors always a dict? */ - has_key = cPickle_PyMapping_HasKey(safe_constructors, cls); - if (!has_key) { - safe = PyObject_GetAttr(cls, __safe_for_unpickling___str); - if (!safe || - !PyObject_IsTrue(safe)) { - cPickle_ErrFormat(UnpicklingError, - "%s is not safe for unpickling", - "O", cls); - Py_XDECREF(safe); - return NULL; - } - Py_DECREF(safe); - } - if (args==Py_None) { /* Special case, call cls.__basicnew__() */ PyObject *basicnew; @@ -4332,7 +4314,6 @@ newUnpicklerobject(PyObject *f) self->buf_size = 0; self->read = NULL; self->readline = NULL; - self->safe_constructors = NULL; self->find_class = NULL; if (!( self->memo = PyDict_New())) @@ -4373,21 +4354,6 @@ newUnpicklerobject(PyObject *f) } } - if (PyEval_GetRestricted()) { - /* Restricted execution, get private tables */ - PyObject *m; - - if (!( m=PyImport_Import(copy_reg_str))) goto err; - self->safe_constructors=PyObject_GetAttr(m, - safe_constructors_str); - Py_DECREF(m); - if (!( self->safe_constructors )) goto err; - } - else { - self->safe_constructors=safe_constructors; - Py_INCREF(safe_constructors); - } - return self; err: @@ -4418,7 +4384,6 @@ Unpickler_dealloc(Unpicklerobject *self) Py_XDECREF(self->pers_func); Py_XDECREF(self->arg); Py_XDECREF(self->last_string); - Py_XDECREF(self->safe_constructors); if (self->marks) { free(self->marks); @@ -4693,28 +4658,22 @@ init_stuff(PyObject *module_dict) INIT_STR(__main__); INIT_STR(__reduce__); INIT_STR(write); - INIT_STR(__safe_for_unpickling__); INIT_STR(append); INIT_STR(read); INIT_STR(readline); INIT_STR(copy_reg); INIT_STR(dispatch_table); - INIT_STR(safe_constructors); INIT_STR(__basicnew__); if (!( copy_reg = PyImport_ImportModule("copy_reg"))) return -1; - /* These next few are special because we want to use different - ones in restricted mode. */ + /* This is special because we want to use a different + one in restricted mode. */ dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str); if (!dispatch_table) return -1; - if (!( safe_constructors = PyObject_GetAttr(copy_reg, - safe_constructors_str))) - return -1; - Py_DECREF(copy_reg); /* Down to here ********************************** */ diff --git a/Modules/datetimemodule.c b/Modules/datetimemodule.c index c149d1cc601..054ddd44459 100644 --- a/Modules/datetimemodule.c +++ b/Modules/datetimemodule.c @@ -4516,13 +4516,6 @@ initdatetime(void) PyObject *d; /* its dict */ PyObject *x; - /* Types that use __reduce__ for pickling need to set the following - * magical attr in the type dict, with a true value. - */ - PyObject *safepickle = PyString_FromString("__safe_for_unpickling__"); - if (safepickle == NULL) - return; - m = Py_InitModule3("datetime", module_methods, "Fast implementation of the datetime type."); @@ -4577,18 +4570,9 @@ initdatetime(void) } } - /* tzinfo values */ - d = PyDateTime_TZInfoType.tp_dict; - - if (PyDict_SetItem(d, safepickle, Py_True) < 0) - return; - /* timedelta values */ d = PyDateTime_DeltaType.tp_dict; - if (PyDict_SetItem(d, safepickle, Py_True) < 0) - return; - x = new_delta(0, 0, 1, 0); if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0) return; @@ -4607,9 +4591,6 @@ initdatetime(void) /* date values */ d = PyDateTime_DateType.tp_dict; - if (PyDict_SetItem(d, safepickle, Py_True) < 0) - return; - x = new_date(1, 1, 1); if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) return; @@ -4628,9 +4609,6 @@ initdatetime(void) /* time values */ d = PyDateTime_TimeType.tp_dict; - if (PyDict_SetItem(d, safepickle, Py_True) < 0) - return; - x = new_time(0, 0, 0, 0, Py_None); if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) return; @@ -4649,9 +4627,6 @@ initdatetime(void) /* datetime values */ d = PyDateTime_DateTimeType.tp_dict; - if (PyDict_SetItem(d, safepickle, Py_True) < 0) - return; - x = new_datetime(1, 1, 1, 0, 0, 0, 0, Py_None); if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) return; @@ -4667,8 +4642,6 @@ initdatetime(void) return; Py_DECREF(x); - Py_DECREF(safepickle); - /* module initialization */ PyModule_AddIntConstant(m, "MINYEAR", MINYEAR); PyModule_AddIntConstant(m, "MAXYEAR", MAXYEAR); diff --git a/Objects/structseq.c b/Objects/structseq.c index effe360c1ee..603477f594e 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -392,5 +392,4 @@ PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc) PyInt_FromLong((long) n_members)); PyDict_SetItemString(dict, unnamed_fields_key, PyInt_FromLong((long) n_unnamed_members)); - PyDict_SetItemString(dict, "__safe_for_unpickling__", Py_True); }