mirror of https://github.com/python/cpython
Removed all uses of the out-of-favor __safe_for_unpickling__ magic
attr, and copy_reg.safe_constructors.
This commit is contained in:
parent
371935fc06
commit
1f1b2d2e68
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ********************************** */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue