blob: 9f6e66f70a54622e117175ff47cabbaadbc350fd [file] [log] [blame]
Victor Stinner5c75f372019-04-17 23:02:26 +02001/* pickle accelerator C extensor: _pickle module.
2 *
3 * It is built as a built-in module (Py_BUILD_CORE_BUILTIN define) on Windows
4 * and as an extension module (Py_BUILD_CORE_MODULE define) on other
5 * platforms. */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06006
Victor Stinner5c75f372019-04-17 23:02:26 +02007#if !defined(Py_BUILD_CORE_BUILTIN) && !defined(Py_BUILD_CORE_MODULE)
8# error "Py_BUILD_CORE_BUILTIN or Py_BUILD_CORE_MODULE must be defined"
Eric Snow2ebc5ce2017-09-07 23:51:28 -06009#endif
10
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000011#include "Python.h"
12#include "structmember.h"
13
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -080014PyDoc_STRVAR(pickle_module_doc,
15"Optimized C implementation for the Python pickle module.");
16
Larry Hastings61272b72014-01-07 12:41:53 -080017/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -080018module _pickle
Larry Hastingsc2047262014-01-25 20:43:29 -080019class _pickle.Pickler "PicklerObject *" "&Pickler_Type"
20class _pickle.PicklerMemoProxy "PicklerMemoProxyObject *" "&PicklerMemoProxyType"
21class _pickle.Unpickler "UnpicklerObject *" "&Unpickler_Type"
22class _pickle.UnpicklerMemoProxy "UnpicklerMemoProxyObject *" "&UnpicklerMemoProxyType"
Larry Hastings61272b72014-01-07 12:41:53 -080023[clinic start generated code]*/
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030024/*[clinic end generated code: output=da39a3ee5e6b4b0d input=4b3e113468a58e6c]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -080025
Łukasz Langac51d8c92018-04-03 23:06:53 -070026/* Bump HIGHEST_PROTOCOL when new opcodes are added to the pickle protocol.
27 Bump DEFAULT_PROTOCOL only when the oldest still supported version of Python
28 already includes it. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000029enum {
Antoine Pitrou91f43802019-05-26 17:10:09 +020030 HIGHEST_PROTOCOL = 5,
Łukasz Langac51d8c92018-04-03 23:06:53 -070031 DEFAULT_PROTOCOL = 4
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000032};
33
Alexandre Vassalottica2d6102008-06-12 18:26:05 +000034/* Pickle opcodes. These must be kept updated with pickle.py.
35 Extensive docs are in pickletools.py. */
36enum opcode {
37 MARK = '(',
38 STOP = '.',
39 POP = '0',
40 POP_MARK = '1',
41 DUP = '2',
42 FLOAT = 'F',
43 INT = 'I',
44 BININT = 'J',
45 BININT1 = 'K',
46 LONG = 'L',
47 BININT2 = 'M',
48 NONE = 'N',
49 PERSID = 'P',
50 BINPERSID = 'Q',
51 REDUCE = 'R',
52 STRING = 'S',
53 BINSTRING = 'T',
54 SHORT_BINSTRING = 'U',
55 UNICODE = 'V',
56 BINUNICODE = 'X',
57 APPEND = 'a',
58 BUILD = 'b',
59 GLOBAL = 'c',
60 DICT = 'd',
61 EMPTY_DICT = '}',
62 APPENDS = 'e',
63 GET = 'g',
64 BINGET = 'h',
65 INST = 'i',
66 LONG_BINGET = 'j',
67 LIST = 'l',
68 EMPTY_LIST = ']',
69 OBJ = 'o',
70 PUT = 'p',
71 BINPUT = 'q',
72 LONG_BINPUT = 'r',
73 SETITEM = 's',
74 TUPLE = 't',
75 EMPTY_TUPLE = ')',
76 SETITEMS = 'u',
77 BINFLOAT = 'G',
78
79 /* Protocol 2. */
80 PROTO = '\x80',
81 NEWOBJ = '\x81',
82 EXT1 = '\x82',
83 EXT2 = '\x83',
84 EXT4 = '\x84',
85 TUPLE1 = '\x85',
86 TUPLE2 = '\x86',
87 TUPLE3 = '\x87',
88 NEWTRUE = '\x88',
89 NEWFALSE = '\x89',
90 LONG1 = '\x8a',
91 LONG4 = '\x8b',
92
93 /* Protocol 3 (Python 3.x) */
94 BINBYTES = 'B',
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010095 SHORT_BINBYTES = 'C',
96
97 /* Protocol 4 */
98 SHORT_BINUNICODE = '\x8c',
99 BINUNICODE8 = '\x8d',
100 BINBYTES8 = '\x8e',
101 EMPTY_SET = '\x8f',
102 ADDITEMS = '\x90',
103 FROZENSET = '\x91',
104 NEWOBJ_EX = '\x92',
105 STACK_GLOBAL = '\x93',
106 MEMOIZE = '\x94',
Antoine Pitrou91f43802019-05-26 17:10:09 +0200107 FRAME = '\x95',
108
109 /* Protocol 5 */
110 BYTEARRAY8 = '\x96',
111 NEXT_BUFFER = '\x97',
112 READONLY_BUFFER = '\x98'
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000113};
114
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000115enum {
116 /* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
117 batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
118 break if this gets out of synch with pickle.py, but it's unclear that would
119 help anything either. */
120 BATCHSIZE = 1000,
121
122 /* Nesting limit until Pickler, when running in "fast mode", starts
123 checking for self-referential data-structures. */
124 FAST_NESTING_LIMIT = 50,
125
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000126 /* Initial size of the write buffer of Pickler. */
127 WRITE_BUF_SIZE = 4096,
128
Antoine Pitrou04248a82010-10-12 20:51:21 +0000129 /* Prefetch size when unpickling (disabled on unpeekable streams) */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100130 PREFETCH = 8192 * 16,
131
Serhiy Storchaka1211c9a2018-01-20 16:42:44 +0200132 FRAME_SIZE_MIN = 4,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100133 FRAME_SIZE_TARGET = 64 * 1024,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100134 FRAME_HEADER_SIZE = 9
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000135};
136
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800137/*************************************************************************/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000138
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800139/* State of the pickle module, per PEP 3121. */
140typedef struct {
141 /* Exception classes for pickle. */
142 PyObject *PickleError;
143 PyObject *PicklingError;
144 PyObject *UnpicklingError;
Larry Hastings61272b72014-01-07 12:41:53 -0800145
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800146 /* copyreg.dispatch_table, {type_object: pickling_function} */
147 PyObject *dispatch_table;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000148
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800149 /* For the extension opcodes EXT1, EXT2 and EXT4. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000150
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800151 /* copyreg._extension_registry, {(module_name, function_name): code} */
152 PyObject *extension_registry;
153 /* copyreg._extension_cache, {code: object} */
154 PyObject *extension_cache;
155 /* copyreg._inverted_registry, {code: (module_name, function_name)} */
156 PyObject *inverted_registry;
157
158 /* Import mappings for compatibility with Python 2.x */
159
160 /* _compat_pickle.NAME_MAPPING,
161 {(oldmodule, oldname): (newmodule, newname)} */
162 PyObject *name_mapping_2to3;
163 /* _compat_pickle.IMPORT_MAPPING, {oldmodule: newmodule} */
164 PyObject *import_mapping_2to3;
165 /* Same, but with REVERSE_NAME_MAPPING / REVERSE_IMPORT_MAPPING */
166 PyObject *name_mapping_3to2;
167 PyObject *import_mapping_3to2;
168
169 /* codecs.encode, used for saving bytes in older protocols */
170 PyObject *codecs_encode;
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300171 /* builtins.getattr, used for saving nested names with protocol < 4 */
172 PyObject *getattr;
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300173 /* functools.partial, used for implementing __newobj_ex__ with protocols
174 2 and 3 */
175 PyObject *partial;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800176} PickleState;
177
178/* Forward declaration of the _pickle module definition. */
179static struct PyModuleDef _picklemodule;
180
181/* Given a module object, get its per-module state. */
182static PickleState *
183_Pickle_GetState(PyObject *module)
184{
185 return (PickleState *)PyModule_GetState(module);
186}
187
188/* Find the module instance imported in the currently running sub-interpreter
189 and get its state. */
190static PickleState *
191_Pickle_GetGlobalState(void)
192{
193 return _Pickle_GetState(PyState_FindModule(&_picklemodule));
194}
195
196/* Clear the given pickle module state. */
197static void
198_Pickle_ClearState(PickleState *st)
199{
200 Py_CLEAR(st->PickleError);
201 Py_CLEAR(st->PicklingError);
202 Py_CLEAR(st->UnpicklingError);
203 Py_CLEAR(st->dispatch_table);
204 Py_CLEAR(st->extension_registry);
205 Py_CLEAR(st->extension_cache);
206 Py_CLEAR(st->inverted_registry);
207 Py_CLEAR(st->name_mapping_2to3);
208 Py_CLEAR(st->import_mapping_2to3);
209 Py_CLEAR(st->name_mapping_3to2);
210 Py_CLEAR(st->import_mapping_3to2);
211 Py_CLEAR(st->codecs_encode);
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300212 Py_CLEAR(st->getattr);
Victor Stinner9ba97df2015-11-17 12:15:07 +0100213 Py_CLEAR(st->partial);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800214}
215
216/* Initialize the given pickle module state. */
217static int
218_Pickle_InitState(PickleState *st)
219{
220 PyObject *copyreg = NULL;
221 PyObject *compat_pickle = NULL;
222 PyObject *codecs = NULL;
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300223 PyObject *functools = NULL;
Serhiy Storchakabb86bf42018-12-11 08:28:18 +0200224 _Py_IDENTIFIER(getattr);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800225
Serhiy Storchakabb86bf42018-12-11 08:28:18 +0200226 st->getattr = _PyEval_GetBuiltinId(&PyId_getattr);
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300227 if (st->getattr == NULL)
228 goto error;
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300229
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800230 copyreg = PyImport_ImportModule("copyreg");
231 if (!copyreg)
232 goto error;
233 st->dispatch_table = PyObject_GetAttrString(copyreg, "dispatch_table");
234 if (!st->dispatch_table)
235 goto error;
236 if (!PyDict_CheckExact(st->dispatch_table)) {
237 PyErr_Format(PyExc_RuntimeError,
238 "copyreg.dispatch_table should be a dict, not %.200s",
239 Py_TYPE(st->dispatch_table)->tp_name);
240 goto error;
241 }
242 st->extension_registry = \
243 PyObject_GetAttrString(copyreg, "_extension_registry");
244 if (!st->extension_registry)
245 goto error;
246 if (!PyDict_CheckExact(st->extension_registry)) {
247 PyErr_Format(PyExc_RuntimeError,
248 "copyreg._extension_registry should be a dict, "
249 "not %.200s", Py_TYPE(st->extension_registry)->tp_name);
250 goto error;
251 }
252 st->inverted_registry = \
253 PyObject_GetAttrString(copyreg, "_inverted_registry");
254 if (!st->inverted_registry)
255 goto error;
256 if (!PyDict_CheckExact(st->inverted_registry)) {
257 PyErr_Format(PyExc_RuntimeError,
258 "copyreg._inverted_registry should be a dict, "
259 "not %.200s", Py_TYPE(st->inverted_registry)->tp_name);
260 goto error;
261 }
262 st->extension_cache = PyObject_GetAttrString(copyreg, "_extension_cache");
263 if (!st->extension_cache)
264 goto error;
265 if (!PyDict_CheckExact(st->extension_cache)) {
266 PyErr_Format(PyExc_RuntimeError,
267 "copyreg._extension_cache should be a dict, "
268 "not %.200s", Py_TYPE(st->extension_cache)->tp_name);
269 goto error;
270 }
271 Py_CLEAR(copyreg);
272
273 /* Load the 2.x -> 3.x stdlib module mapping tables */
274 compat_pickle = PyImport_ImportModule("_compat_pickle");
275 if (!compat_pickle)
276 goto error;
277 st->name_mapping_2to3 = \
278 PyObject_GetAttrString(compat_pickle, "NAME_MAPPING");
279 if (!st->name_mapping_2to3)
280 goto error;
281 if (!PyDict_CheckExact(st->name_mapping_2to3)) {
282 PyErr_Format(PyExc_RuntimeError,
283 "_compat_pickle.NAME_MAPPING should be a dict, not %.200s",
284 Py_TYPE(st->name_mapping_2to3)->tp_name);
285 goto error;
286 }
287 st->import_mapping_2to3 = \
288 PyObject_GetAttrString(compat_pickle, "IMPORT_MAPPING");
289 if (!st->import_mapping_2to3)
290 goto error;
291 if (!PyDict_CheckExact(st->import_mapping_2to3)) {
292 PyErr_Format(PyExc_RuntimeError,
293 "_compat_pickle.IMPORT_MAPPING should be a dict, "
294 "not %.200s", Py_TYPE(st->import_mapping_2to3)->tp_name);
295 goto error;
296 }
297 /* ... and the 3.x -> 2.x mapping tables */
298 st->name_mapping_3to2 = \
299 PyObject_GetAttrString(compat_pickle, "REVERSE_NAME_MAPPING");
300 if (!st->name_mapping_3to2)
301 goto error;
302 if (!PyDict_CheckExact(st->name_mapping_3to2)) {
303 PyErr_Format(PyExc_RuntimeError,
304 "_compat_pickle.REVERSE_NAME_MAPPING should be a dict, "
305 "not %.200s", Py_TYPE(st->name_mapping_3to2)->tp_name);
306 goto error;
307 }
308 st->import_mapping_3to2 = \
309 PyObject_GetAttrString(compat_pickle, "REVERSE_IMPORT_MAPPING");
310 if (!st->import_mapping_3to2)
311 goto error;
312 if (!PyDict_CheckExact(st->import_mapping_3to2)) {
313 PyErr_Format(PyExc_RuntimeError,
314 "_compat_pickle.REVERSE_IMPORT_MAPPING should be a dict, "
315 "not %.200s", Py_TYPE(st->import_mapping_3to2)->tp_name);
316 goto error;
317 }
318 Py_CLEAR(compat_pickle);
319
320 codecs = PyImport_ImportModule("codecs");
321 if (codecs == NULL)
322 goto error;
323 st->codecs_encode = PyObject_GetAttrString(codecs, "encode");
324 if (st->codecs_encode == NULL) {
325 goto error;
326 }
327 if (!PyCallable_Check(st->codecs_encode)) {
328 PyErr_Format(PyExc_RuntimeError,
329 "codecs.encode should be a callable, not %.200s",
330 Py_TYPE(st->codecs_encode)->tp_name);
331 goto error;
332 }
333 Py_CLEAR(codecs);
334
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300335 functools = PyImport_ImportModule("functools");
336 if (!functools)
337 goto error;
338 st->partial = PyObject_GetAttrString(functools, "partial");
339 if (!st->partial)
340 goto error;
341 Py_CLEAR(functools);
342
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800343 return 0;
344
345 error:
346 Py_CLEAR(copyreg);
347 Py_CLEAR(compat_pickle);
348 Py_CLEAR(codecs);
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300349 Py_CLEAR(functools);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800350 _Pickle_ClearState(st);
351 return -1;
352}
353
354/* Helper for calling a function with a single argument quickly.
355
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800356 This function steals the reference of the given argument. */
357static PyObject *
358_Pickle_FastCall(PyObject *func, PyObject *obj)
359{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800360 PyObject *result;
361
Victor Stinner7bfb42d2016-12-05 17:04:32 +0100362 result = PyObject_CallFunctionObjArgs(func, obj, NULL);
Victor Stinner75210692016-08-19 18:59:15 +0200363 Py_DECREF(obj);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -0800364 return result;
365}
366
367/*************************************************************************/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000368
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200369/* Retrieve and deconstruct a method for avoiding a reference cycle
370 (pickler -> bound method of pickler -> pickler) */
371static int
372init_method_ref(PyObject *self, _Py_Identifier *name,
373 PyObject **method_func, PyObject **method_self)
374{
375 PyObject *func, *func2;
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200376 int ret;
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200377
378 /* *method_func and *method_self should be consistent. All refcount decrements
379 should be occurred after setting *method_self and *method_func. */
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200380 ret = _PyObject_LookupAttrId(self, name, &func);
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200381 if (func == NULL) {
382 *method_self = NULL;
383 Py_CLEAR(*method_func);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200384 return ret;
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200385 }
386
387 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) == self) {
388 /* Deconstruct a bound Python method */
389 func2 = PyMethod_GET_FUNCTION(func);
390 Py_INCREF(func2);
391 *method_self = self; /* borrowed */
392 Py_XSETREF(*method_func, func2);
393 Py_DECREF(func);
394 return 0;
395 }
396 else {
397 *method_self = NULL;
398 Py_XSETREF(*method_func, func);
399 return 0;
400 }
401}
402
403/* Bind a method if it was deconstructed */
404static PyObject *
405reconstruct_method(PyObject *func, PyObject *self)
406{
407 if (self) {
408 return PyMethod_New(func, self);
409 }
410 else {
411 Py_INCREF(func);
412 return func;
413 }
414}
415
416static PyObject *
417call_method(PyObject *func, PyObject *self, PyObject *obj)
418{
419 if (self) {
420 return PyObject_CallFunctionObjArgs(func, self, obj, NULL);
421 }
422 else {
423 return PyObject_CallFunctionObjArgs(func, obj, NULL);
424 }
425}
426
427/*************************************************************************/
428
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000429/* Internal data type used as the unpickling stack. */
430typedef struct {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000431 PyObject_VAR_HEAD
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000432 PyObject **data;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200433 int mark_set; /* is MARK set? */
434 Py_ssize_t fence; /* position of top MARK or 0 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000435 Py_ssize_t allocated; /* number of slots in data allocated */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000436} Pdata;
437
438static void
439Pdata_dealloc(Pdata *self)
440{
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200441 Py_ssize_t i = Py_SIZE(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000442 while (--i >= 0) {
443 Py_DECREF(self->data[i]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000444 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000445 PyMem_FREE(self->data);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000446 PyObject_Del(self);
447}
448
449static PyTypeObject Pdata_Type = {
450 PyVarObject_HEAD_INIT(NULL, 0)
451 "_pickle.Pdata", /*tp_name*/
452 sizeof(Pdata), /*tp_basicsize*/
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +0200453 sizeof(PyObject *), /*tp_itemsize*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000454 (destructor)Pdata_dealloc, /*tp_dealloc*/
455};
456
457static PyObject *
458Pdata_New(void)
459{
460 Pdata *self;
461
462 if (!(self = PyObject_New(Pdata, &Pdata_Type)))
463 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000464 Py_SIZE(self) = 0;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200465 self->mark_set = 0;
466 self->fence = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000467 self->allocated = 8;
468 self->data = PyMem_MALLOC(self->allocated * sizeof(PyObject *));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000469 if (self->data)
470 return (PyObject *)self;
471 Py_DECREF(self);
472 return PyErr_NoMemory();
473}
474
475
476/* Retain only the initial clearto items. If clearto >= the current
477 * number of items, this is a (non-erroneous) NOP.
478 */
479static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200480Pdata_clear(Pdata *self, Py_ssize_t clearto)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000481{
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200482 Py_ssize_t i = Py_SIZE(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000483
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200484 assert(clearto >= self->fence);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000485 if (clearto >= i)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000486 return 0;
487
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000488 while (--i >= clearto) {
489 Py_CLEAR(self->data[i]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000490 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000491 Py_SIZE(self) = clearto;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000492 return 0;
493}
494
495static int
496Pdata_grow(Pdata *self)
497{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000498 PyObject **data = self->data;
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200499 size_t allocated = (size_t)self->allocated;
500 size_t new_allocated;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000501
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000502 new_allocated = (allocated >> 3) + 6;
503 /* check for integer overflow */
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200504 if (new_allocated > (size_t)PY_SSIZE_T_MAX - allocated)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000505 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000506 new_allocated += allocated;
Benjamin Peterson59b08c12015-06-27 13:41:33 -0500507 PyMem_RESIZE(data, PyObject *, new_allocated);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000508 if (data == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000509 goto nomemory;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000510
511 self->data = data;
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200512 self->allocated = (Py_ssize_t)new_allocated;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000513 return 0;
514
515 nomemory:
516 PyErr_NoMemory();
517 return -1;
518}
519
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200520static int
521Pdata_stack_underflow(Pdata *self)
522{
523 PickleState *st = _Pickle_GetGlobalState();
524 PyErr_SetString(st->UnpicklingError,
525 self->mark_set ?
526 "unexpected MARK found" :
527 "unpickling stack underflow");
528 return -1;
529}
530
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000531/* D is a Pdata*. Pop the topmost element and store it into V, which
532 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
533 * is raised and V is set to NULL.
534 */
535static PyObject *
536Pdata_pop(Pdata *self)
537{
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200538 if (Py_SIZE(self) <= self->fence) {
539 Pdata_stack_underflow(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000540 return NULL;
541 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000542 return self->data[--Py_SIZE(self)];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000543}
544#define PDATA_POP(D, V) do { (V) = Pdata_pop((D)); } while (0)
545
546static int
547Pdata_push(Pdata *self, PyObject *obj)
548{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000549 if (Py_SIZE(self) == self->allocated && Pdata_grow(self) < 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000550 return -1;
551 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000552 self->data[Py_SIZE(self)++] = obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000553 return 0;
554}
555
556/* Push an object on stack, transferring its ownership to the stack. */
557#define PDATA_PUSH(D, O, ER) do { \
558 if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
559
560/* Push an object on stack, adding a new reference to the object. */
561#define PDATA_APPEND(D, O, ER) do { \
562 Py_INCREF((O)); \
563 if (Pdata_push((D), (O)) < 0) return (ER); } while(0)
564
565static PyObject *
566Pdata_poptuple(Pdata *self, Py_ssize_t start)
567{
568 PyObject *tuple;
569 Py_ssize_t len, i, j;
570
Serhiy Storchaka59fb6342015-12-06 22:01:35 +0200571 if (start < self->fence) {
572 Pdata_stack_underflow(self);
573 return NULL;
574 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000575 len = Py_SIZE(self) - start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000576 tuple = PyTuple_New(len);
577 if (tuple == NULL)
578 return NULL;
579 for (i = start, j = 0; j < len; i++, j++)
580 PyTuple_SET_ITEM(tuple, j, self->data[i]);
581
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000582 Py_SIZE(self) = start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000583 return tuple;
584}
585
586static PyObject *
587Pdata_poplist(Pdata *self, Py_ssize_t start)
588{
589 PyObject *list;
590 Py_ssize_t len, i, j;
591
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000592 len = Py_SIZE(self) - start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000593 list = PyList_New(len);
594 if (list == NULL)
595 return NULL;
596 for (i = start, j = 0; j < len; i++, j++)
597 PyList_SET_ITEM(list, j, self->data[i]);
598
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000599 Py_SIZE(self) = start;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000600 return list;
601}
602
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000603typedef struct {
604 PyObject *me_key;
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200605 Py_ssize_t me_value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000606} PyMemoEntry;
607
608typedef struct {
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700609 size_t mt_mask;
610 size_t mt_used;
611 size_t mt_allocated;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000612 PyMemoEntry *mt_table;
613} PyMemoTable;
614
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000615typedef struct PicklerObject {
616 PyObject_HEAD
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000617 PyMemoTable *memo; /* Memo table, keep track of the seen
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000618 objects to support self-referential objects
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000619 pickling. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000620 PyObject *pers_func; /* persistent_id() method, can be NULL */
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200621 PyObject *pers_func_self; /* borrowed reference to self if pers_func
622 is an unbound method, NULL otherwise */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +0100623 PyObject *dispatch_table; /* private dispatch_table, can be NULL */
Pierre Glaser289f1f82019-05-08 23:08:25 +0200624 PyObject *reducer_override; /* hook for invoking user-defined callbacks
625 instead of save_global when pickling
626 functions and classes*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000627
628 PyObject *write; /* write() method of the output stream. */
629 PyObject *output_buffer; /* Write into a local bytearray buffer before
630 flushing to the stream. */
631 Py_ssize_t output_len; /* Length of output_buffer. */
632 Py_ssize_t max_output_len; /* Allocation size of output_buffer. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000633 int proto; /* Pickle protocol number, >= 0 */
634 int bin; /* Boolean, true if proto > 0 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100635 int framing; /* True when framing is enabled, proto >= 4 */
636 Py_ssize_t frame_start; /* Position in output_buffer where the
Martin Pantera90a4a92016-05-30 04:04:50 +0000637 current frame begins. -1 if there
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100638 is no frame currently open. */
639
640 Py_ssize_t buf_size; /* Size of the current buffered pickle data */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000641 int fast; /* Enable fast mode if set to a true value.
642 The fast mode disable the usage of memo,
643 therefore speeding the pickling process by
644 not generating superfluous PUT opcodes. It
645 should not be used if with self-referential
646 objects. */
647 int fast_nesting;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000648 int fix_imports; /* Indicate whether Pickler should fix
649 the name of globals for Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000650 PyObject *fast_memo;
Antoine Pitrou91f43802019-05-26 17:10:09 +0200651 PyObject *buffer_callback; /* Callback for out-of-band buffers, or NULL */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000652} PicklerObject;
653
654typedef struct UnpicklerObject {
655 PyObject_HEAD
656 Pdata *stack; /* Pickle data stack, store unpickled objects. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000657
658 /* The unpickler memo is just an array of PyObject *s. Using a dict
659 is unnecessary, since the keys are contiguous ints. */
660 PyObject **memo;
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700661 size_t memo_size; /* Capacity of the memo array */
662 size_t memo_len; /* Number of objects in the memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000663
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000664 PyObject *pers_func; /* persistent_load() method, can be NULL. */
Serhiy Storchaka986375e2017-11-30 22:48:31 +0200665 PyObject *pers_func_self; /* borrowed reference to self if pers_func
666 is an unbound method, NULL otherwise */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000667
668 Py_buffer buffer;
669 char *input_buffer;
670 char *input_line;
671 Py_ssize_t input_len;
672 Py_ssize_t next_read_idx;
Antoine Pitrou04248a82010-10-12 20:51:21 +0000673 Py_ssize_t prefetched_idx; /* index of first prefetched byte */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100674
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000675 PyObject *read; /* read() method of the input stream. */
Antoine Pitrou91f43802019-05-26 17:10:09 +0200676 PyObject *readinto; /* readinto() method of the input stream. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000677 PyObject *readline; /* readline() method of the input stream. */
Antoine Pitrou04248a82010-10-12 20:51:21 +0000678 PyObject *peek; /* peek() method of the input stream, or NULL */
Antoine Pitrou91f43802019-05-26 17:10:09 +0200679 PyObject *buffers; /* iterable of out-of-band buffers, or NULL */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000680
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000681 char *encoding; /* Name of the encoding to be used for
682 decoding strings pickled using Python
683 2.x. The default value is "ASCII" */
684 char *errors; /* Name of errors handling scheme to used when
685 decoding strings. The default value is
686 "strict". */
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -0500687 Py_ssize_t *marks; /* Mark stack, used for unpickling container
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000688 objects. */
689 Py_ssize_t num_marks; /* Number of marks in the mark stack. */
690 Py_ssize_t marks_size; /* Current allocated size of the mark stack. */
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000691 int proto; /* Protocol of the pickle loaded. */
692 int fix_imports; /* Indicate whether Unpickler should fix
693 the name of globals pickled by Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000694} UnpicklerObject;
695
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +0200696typedef struct {
697 PyObject_HEAD
698 PicklerObject *pickler; /* Pickler whose memo table we're proxying. */
699} PicklerMemoProxyObject;
700
701typedef struct {
702 PyObject_HEAD
703 UnpicklerObject *unpickler;
704} UnpicklerMemoProxyObject;
705
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000706/* Forward declarations */
707static int save(PicklerObject *, PyObject *, int);
708static int save_reduce(PicklerObject *, PyObject *, PyObject *);
709static PyTypeObject Pickler_Type;
710static PyTypeObject Unpickler_Type;
711
Serhiy Storchaka3c1f0f12014-01-27 10:34:22 +0200712#include "clinic/_pickle.c.h"
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000713
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000714/*************************************************************************
Serhiy Storchaka95949422013-08-27 19:40:23 +0300715 A custom hashtable mapping void* to Python ints. This is used by the pickler
716 for memoization. Using a custom hashtable rather than PyDict allows us to skip
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000717 a bunch of unnecessary object creation. This makes a huge performance
718 difference. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000719
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000720#define MT_MINSIZE 8
721#define PERTURB_SHIFT 5
722
723
724static PyMemoTable *
725PyMemoTable_New(void)
726{
727 PyMemoTable *memo = PyMem_MALLOC(sizeof(PyMemoTable));
728 if (memo == NULL) {
729 PyErr_NoMemory();
730 return NULL;
731 }
732
733 memo->mt_used = 0;
734 memo->mt_allocated = MT_MINSIZE;
735 memo->mt_mask = MT_MINSIZE - 1;
736 memo->mt_table = PyMem_MALLOC(MT_MINSIZE * sizeof(PyMemoEntry));
737 if (memo->mt_table == NULL) {
738 PyMem_FREE(memo);
739 PyErr_NoMemory();
740 return NULL;
741 }
742 memset(memo->mt_table, 0, MT_MINSIZE * sizeof(PyMemoEntry));
743
744 return memo;
745}
746
747static PyMemoTable *
748PyMemoTable_Copy(PyMemoTable *self)
749{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000750 PyMemoTable *new = PyMemoTable_New();
751 if (new == NULL)
752 return NULL;
753
754 new->mt_used = self->mt_used;
755 new->mt_allocated = self->mt_allocated;
756 new->mt_mask = self->mt_mask;
757 /* The table we get from _New() is probably smaller than we wanted.
758 Free it and allocate one that's the right size. */
759 PyMem_FREE(new->mt_table);
Benjamin Peterson59b08c12015-06-27 13:41:33 -0500760 new->mt_table = PyMem_NEW(PyMemoEntry, self->mt_allocated);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000761 if (new->mt_table == NULL) {
762 PyMem_FREE(new);
Victor Stinner42024562013-07-12 00:53:57 +0200763 PyErr_NoMemory();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000764 return NULL;
765 }
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700766 for (size_t i = 0; i < self->mt_allocated; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000767 Py_XINCREF(self->mt_table[i].me_key);
768 }
769 memcpy(new->mt_table, self->mt_table,
770 sizeof(PyMemoEntry) * self->mt_allocated);
771
772 return new;
773}
774
775static Py_ssize_t
776PyMemoTable_Size(PyMemoTable *self)
777{
778 return self->mt_used;
779}
780
781static int
782PyMemoTable_Clear(PyMemoTable *self)
783{
784 Py_ssize_t i = self->mt_allocated;
785
786 while (--i >= 0) {
787 Py_XDECREF(self->mt_table[i].me_key);
788 }
789 self->mt_used = 0;
790 memset(self->mt_table, 0, self->mt_allocated * sizeof(PyMemoEntry));
791 return 0;
792}
793
794static void
795PyMemoTable_Del(PyMemoTable *self)
796{
797 if (self == NULL)
798 return;
799 PyMemoTable_Clear(self);
800
801 PyMem_FREE(self->mt_table);
802 PyMem_FREE(self);
803}
804
805/* Since entries cannot be deleted from this hashtable, _PyMemoTable_Lookup()
806 can be considerably simpler than dictobject.c's lookdict(). */
807static PyMemoEntry *
808_PyMemoTable_Lookup(PyMemoTable *self, PyObject *key)
809{
810 size_t i;
811 size_t perturb;
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700812 size_t mask = self->mt_mask;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000813 PyMemoEntry *table = self->mt_table;
814 PyMemoEntry *entry;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000815 Py_hash_t hash = (Py_hash_t)key >> 3;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000816
817 i = hash & mask;
818 entry = &table[i];
819 if (entry->me_key == NULL || entry->me_key == key)
820 return entry;
821
822 for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
823 i = (i << 2) + i + perturb + 1;
824 entry = &table[i & mask];
825 if (entry->me_key == NULL || entry->me_key == key)
826 return entry;
827 }
Barry Warsawb2e57942017-09-14 18:13:16 -0700828 Py_UNREACHABLE();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000829}
830
831/* Returns -1 on failure, 0 on success. */
832static int
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700833_PyMemoTable_ResizeTable(PyMemoTable *self, size_t min_size)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000834{
835 PyMemoEntry *oldtable = NULL;
836 PyMemoEntry *oldentry, *newentry;
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700837 size_t new_size = MT_MINSIZE;
838 size_t to_process;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000839
840 assert(min_size > 0);
841
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700842 if (min_size > PY_SSIZE_T_MAX) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000843 PyErr_NoMemory();
844 return -1;
845 }
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700846
847 /* Find the smallest valid table size >= min_size. */
848 while (new_size < min_size) {
849 new_size <<= 1;
850 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000851 /* new_size needs to be a power of two. */
852 assert((new_size & (new_size - 1)) == 0);
853
854 /* Allocate new table. */
855 oldtable = self->mt_table;
Benjamin Peterson59b08c12015-06-27 13:41:33 -0500856 self->mt_table = PyMem_NEW(PyMemoEntry, new_size);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000857 if (self->mt_table == NULL) {
Victor Stinner8ca72e22013-07-12 00:53:26 +0200858 self->mt_table = oldtable;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000859 PyErr_NoMemory();
860 return -1;
861 }
862 self->mt_allocated = new_size;
863 self->mt_mask = new_size - 1;
864 memset(self->mt_table, 0, sizeof(PyMemoEntry) * new_size);
865
866 /* Copy entries from the old table. */
867 to_process = self->mt_used;
868 for (oldentry = oldtable; to_process > 0; oldentry++) {
869 if (oldentry->me_key != NULL) {
870 to_process--;
871 /* newentry is a pointer to a chunk of the new
872 mt_table, so we're setting the key:value pair
873 in-place. */
874 newentry = _PyMemoTable_Lookup(self, oldentry->me_key);
875 newentry->me_key = oldentry->me_key;
876 newentry->me_value = oldentry->me_value;
877 }
878 }
879
880 /* Deallocate the old table. */
881 PyMem_FREE(oldtable);
882 return 0;
883}
884
885/* Returns NULL on failure, a pointer to the value otherwise. */
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200886static Py_ssize_t *
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000887PyMemoTable_Get(PyMemoTable *self, PyObject *key)
888{
889 PyMemoEntry *entry = _PyMemoTable_Lookup(self, key);
890 if (entry->me_key == NULL)
891 return NULL;
892 return &entry->me_value;
893}
894
895/* Returns -1 on failure, 0 on success. */
896static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +0200897PyMemoTable_Set(PyMemoTable *self, PyObject *key, Py_ssize_t value)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000898{
899 PyMemoEntry *entry;
900
901 assert(key != NULL);
902
903 entry = _PyMemoTable_Lookup(self, key);
904 if (entry->me_key != NULL) {
905 entry->me_value = value;
906 return 0;
907 }
908 Py_INCREF(key);
909 entry->me_key = key;
910 entry->me_value = value;
911 self->mt_used++;
912
913 /* If we added a key, we can safely resize. Otherwise just return!
914 * If used >= 2/3 size, adjust size. Normally, this quaduples the size.
915 *
916 * Quadrupling the size improves average table sparseness
917 * (reducing collisions) at the cost of some memory. It also halves
918 * the number of expensive resize operations in a growing memo table.
919 *
920 * Very large memo tables (over 50K items) use doubling instead.
921 * This may help applications with severe memory constraints.
922 */
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700923 if (SIZE_MAX / 3 >= self->mt_used && self->mt_used * 3 < self->mt_allocated * 2) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000924 return 0;
Benjamin Petersona4ae8282018-09-20 18:36:40 -0700925 }
926 // self->mt_used is always < PY_SSIZE_T_MAX, so this can't overflow.
927 size_t desired_size = (self->mt_used > 50000 ? 2 : 4) * self->mt_used;
928 return _PyMemoTable_ResizeTable(self, desired_size);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000929}
930
931#undef MT_MINSIZE
932#undef PERTURB_SHIFT
933
934/*************************************************************************/
935
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000936
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000937static int
938_Pickler_ClearBuffer(PicklerObject *self)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000939{
Serhiy Storchaka48842712016-04-06 09:45:48 +0300940 Py_XSETREF(self->output_buffer,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +0200941 PyBytes_FromStringAndSize(NULL, self->max_output_len));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000942 if (self->output_buffer == NULL)
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000943 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000944 self->output_len = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100945 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000946 return 0;
947}
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +0000948
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100949static void
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100950_write_size64(char *out, size_t value)
951{
Victor Stinnerf13c46c2014-08-17 21:05:55 +0200952 size_t i;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -0800953
Serhiy Storchakafad85aa2015-11-07 15:42:38 +0200954 Py_BUILD_ASSERT(sizeof(size_t) <= 8);
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -0800955
956 for (i = 0; i < sizeof(size_t); i++) {
957 out[i] = (unsigned char)((value >> (8 * i)) & 0xff);
958 }
959 for (i = sizeof(size_t); i < 8; i++) {
960 out[i] = 0;
Alexandre Vassalottided929b2013-11-24 22:41:13 -0800961 }
Antoine Pitrou8f2ee6e2013-11-23 21:05:08 +0100962}
963
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100964static int
965_Pickler_CommitFrame(PicklerObject *self)
966{
967 size_t frame_len;
968 char *qdata;
969
970 if (!self->framing || self->frame_start == -1)
971 return 0;
972 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
973 qdata = PyBytes_AS_STRING(self->output_buffer) + self->frame_start;
Serhiy Storchaka1211c9a2018-01-20 16:42:44 +0200974 if (frame_len >= FRAME_SIZE_MIN) {
975 qdata[0] = FRAME;
976 _write_size64(qdata + 1, frame_len);
977 }
978 else {
979 memmove(qdata, qdata + FRAME_HEADER_SIZE, frame_len);
980 self->output_len -= FRAME_HEADER_SIZE;
981 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100982 self->frame_start = -1;
983 return 0;
984}
985
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000986static PyObject *
987_Pickler_GetString(PicklerObject *self)
988{
989 PyObject *output_buffer = self->output_buffer;
990
991 assert(self->output_buffer != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100992
993 if (_Pickler_CommitFrame(self))
994 return NULL;
995
Antoine Pitrouea99c5c2010-09-09 18:33:21 +0000996 self->output_buffer = NULL;
997 /* Resize down to exact size */
998 if (_PyBytes_Resize(&output_buffer, self->output_len) < 0)
999 return NULL;
1000 return output_buffer;
1001}
1002
1003static int
1004_Pickler_FlushToFile(PicklerObject *self)
1005{
1006 PyObject *output, *result;
1007
1008 assert(self->write != NULL);
1009
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001010 /* This will commit the frame first */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001011 output = _Pickler_GetString(self);
1012 if (output == NULL)
1013 return -1;
1014
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08001015 result = _Pickle_FastCall(self->write, output);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001016 Py_XDECREF(result);
1017 return (result == NULL) ? -1 : 0;
1018}
1019
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01001020static int
1021_Pickler_OpcodeBoundary(PicklerObject *self)
1022{
1023 Py_ssize_t frame_len;
1024
1025 if (!self->framing || self->frame_start == -1) {
1026 return 0;
1027 }
1028 frame_len = self->output_len - self->frame_start - FRAME_HEADER_SIZE;
1029 if (frame_len >= FRAME_SIZE_TARGET) {
1030 if(_Pickler_CommitFrame(self)) {
1031 return -1;
1032 }
Leo Ariasc3d95082018-02-03 18:36:10 -06001033 /* Flush the content of the committed frame to the underlying
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01001034 * file and reuse the pickler buffer for the next frame so as
1035 * to limit memory usage when dumping large complex objects to
1036 * a file.
1037 *
1038 * self->write is NULL when called via dumps.
1039 */
1040 if (self->write != NULL) {
1041 if (_Pickler_FlushToFile(self) < 0) {
1042 return -1;
1043 }
1044 if (_Pickler_ClearBuffer(self) < 0) {
1045 return -1;
1046 }
1047 }
1048 }
1049 return 0;
1050}
1051
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001052static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001053_Pickler_Write(PicklerObject *self, const char *s, Py_ssize_t data_len)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001054{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001055 Py_ssize_t i, n, required;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001056 char *buffer;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001057 int need_new_frame;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001058
1059 assert(s != NULL);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001060 need_new_frame = (self->framing && self->frame_start == -1);
1061
1062 if (need_new_frame)
1063 n = data_len + FRAME_HEADER_SIZE;
1064 else
1065 n = data_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001066
1067 required = self->output_len + n;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001068 if (required > self->max_output_len) {
1069 /* Make place in buffer for the pickle chunk */
1070 if (self->output_len >= PY_SSIZE_T_MAX / 2 - n) {
1071 PyErr_NoMemory();
1072 return -1;
1073 }
1074 self->max_output_len = (self->output_len + n) / 2 * 3;
1075 if (_PyBytes_Resize(&self->output_buffer, self->max_output_len) < 0)
1076 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001077 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001078 buffer = PyBytes_AS_STRING(self->output_buffer);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001079 if (need_new_frame) {
1080 /* Setup new frame */
1081 Py_ssize_t frame_start = self->output_len;
1082 self->frame_start = frame_start;
1083 for (i = 0; i < FRAME_HEADER_SIZE; i++) {
1084 /* Write an invalid value, for debugging */
1085 buffer[frame_start + i] = 0xFE;
1086 }
1087 self->output_len += FRAME_HEADER_SIZE;
1088 }
1089 if (data_len < 8) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001090 /* This is faster than memcpy when the string is short. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001091 for (i = 0; i < data_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001092 buffer[self->output_len + i] = s[i];
1093 }
1094 }
1095 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001096 memcpy(buffer + self->output_len, s, data_len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001097 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001098 self->output_len += data_len;
1099 return data_len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001100}
1101
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001102static PicklerObject *
1103_Pickler_New(void)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001104{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001105 PicklerObject *self;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001106
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001107 self = PyObject_GC_New(PicklerObject, &Pickler_Type);
1108 if (self == NULL)
1109 return NULL;
1110
1111 self->pers_func = NULL;
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01001112 self->dispatch_table = NULL;
Antoine Pitrou91f43802019-05-26 17:10:09 +02001113 self->buffer_callback = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001114 self->write = NULL;
1115 self->proto = 0;
1116 self->bin = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001117 self->framing = 0;
1118 self->frame_start = -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001119 self->fast = 0;
1120 self->fast_nesting = 0;
1121 self->fix_imports = 0;
1122 self->fast_memo = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001123 self->max_output_len = WRITE_BUF_SIZE;
1124 self->output_len = 0;
Pierre Glaser289f1f82019-05-08 23:08:25 +02001125 self->reducer_override = NULL;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001126
1127 self->memo = PyMemoTable_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001128 self->output_buffer = PyBytes_FromStringAndSize(NULL,
1129 self->max_output_len);
Victor Stinner68c8ea22013-07-11 22:56:25 +02001130
1131 if (self->memo == NULL || self->output_buffer == NULL) {
Victor Stinnerc31df042013-07-12 00:08:59 +02001132 Py_DECREF(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001133 return NULL;
1134 }
Zackery Spytz359bd4f2019-04-23 05:56:08 -06001135
1136 PyObject_GC_Track(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001137 return self;
1138}
1139
1140static int
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001141_Pickler_SetProtocol(PicklerObject *self, PyObject *protocol, int fix_imports)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001142{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001143 long proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001144
Serhiy Storchakad322abb2019-09-14 13:31:50 +03001145 if (protocol == Py_None) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001146 proto = DEFAULT_PROTOCOL;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001147 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001148 else {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001149 proto = PyLong_AsLong(protocol);
1150 if (proto < 0) {
1151 if (proto == -1 && PyErr_Occurred())
1152 return -1;
1153 proto = HIGHEST_PROTOCOL;
1154 }
1155 else if (proto > HIGHEST_PROTOCOL) {
1156 PyErr_Format(PyExc_ValueError, "pickle protocol must be <= %d",
1157 HIGHEST_PROTOCOL);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001158 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001159 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001160 }
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08001161 self->proto = (int)proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001162 self->bin = proto > 0;
1163 self->fix_imports = fix_imports && proto < 3;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001164 return 0;
1165}
1166
1167/* Returns -1 (with an exception set) on failure, 0 on success. This may
1168 be called once on a freshly created Pickler. */
1169static int
1170_Pickler_SetOutputStream(PicklerObject *self, PyObject *file)
1171{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001172 _Py_IDENTIFIER(write);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001173 assert(file != NULL);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001174 if (_PyObject_LookupAttrId(file, &PyId_write, &self->write) < 0) {
1175 return -1;
1176 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001177 if (self->write == NULL) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001178 PyErr_SetString(PyExc_TypeError,
1179 "file must have a 'write' attribute");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001180 return -1;
1181 }
1182
1183 return 0;
1184}
1185
Antoine Pitrou91f43802019-05-26 17:10:09 +02001186static int
1187_Pickler_SetBufferCallback(PicklerObject *self, PyObject *buffer_callback)
1188{
1189 if (buffer_callback == Py_None) {
1190 buffer_callback = NULL;
1191 }
1192 if (buffer_callback != NULL && self->proto < 5) {
1193 PyErr_SetString(PyExc_ValueError,
1194 "buffer_callback needs protocol >= 5");
1195 return -1;
1196 }
1197
1198 Py_XINCREF(buffer_callback);
1199 self->buffer_callback = buffer_callback;
1200 return 0;
1201}
1202
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001203/* Returns the size of the input on success, -1 on failure. This takes its
1204 own reference to `input`. */
1205static Py_ssize_t
1206_Unpickler_SetStringInput(UnpicklerObject *self, PyObject *input)
1207{
1208 if (self->buffer.buf != NULL)
1209 PyBuffer_Release(&self->buffer);
1210 if (PyObject_GetBuffer(input, &self->buffer, PyBUF_CONTIG_RO) < 0)
1211 return -1;
1212 self->input_buffer = self->buffer.buf;
1213 self->input_len = self->buffer.len;
1214 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001215 self->prefetched_idx = self->input_len;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001216 return self->input_len;
1217}
1218
Antoine Pitrou04248a82010-10-12 20:51:21 +00001219static int
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001220bad_readline(void)
1221{
1222 PickleState *st = _Pickle_GetGlobalState();
1223 PyErr_SetString(st->UnpicklingError, "pickle data was truncated");
1224 return -1;
1225}
1226
Antoine Pitrou91f43802019-05-26 17:10:09 +02001227/* Skip any consumed data that was only prefetched using peek() */
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001228static int
Antoine Pitrou04248a82010-10-12 20:51:21 +00001229_Unpickler_SkipConsumed(UnpicklerObject *self)
1230{
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001231 Py_ssize_t consumed;
1232 PyObject *r;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001233
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001234 consumed = self->next_read_idx - self->prefetched_idx;
1235 if (consumed <= 0)
1236 return 0;
1237
1238 assert(self->peek); /* otherwise we did something wrong */
Martin Panter6245cb32016-04-15 02:14:19 +00001239 /* This makes a useless copy... */
Victor Stinnerb43ad1d2013-10-31 13:38:42 +01001240 r = PyObject_CallFunction(self->read, "n", consumed);
1241 if (r == NULL)
1242 return -1;
1243 Py_DECREF(r);
1244
1245 self->prefetched_idx = self->next_read_idx;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001246 return 0;
1247}
1248
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001249static const Py_ssize_t READ_WHOLE_LINE = -1;
1250
1251/* If reading from a file, we need to only pull the bytes we need, since there
1252 may be multiple pickle objects arranged contiguously in the same input
1253 buffer.
1254
1255 If `n` is READ_WHOLE_LINE, read a whole line. Otherwise, read up to `n`
1256 bytes from the input stream/buffer.
1257
1258 Update the unpickler's input buffer with the newly-read data. Returns -1 on
1259 failure; on success, returns the number of bytes read from the file.
1260
1261 On success, self->input_len will be 0; this is intentional so that when
1262 unpickling from a file, the "we've run out of data" code paths will trigger,
1263 causing the Unpickler to go back to the file for more data. Use the returned
1264 size to tell you how much data you can process. */
1265static Py_ssize_t
1266_Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n)
1267{
1268 PyObject *data;
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001269 Py_ssize_t read_size;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001270
1271 assert(self->read != NULL);
Victor Stinner121aab42011-09-29 23:40:53 +02001272
Antoine Pitrou04248a82010-10-12 20:51:21 +00001273 if (_Unpickler_SkipConsumed(self) < 0)
1274 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001275
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001276 if (n == READ_WHOLE_LINE) {
Victor Stinner559bb6a2016-08-22 22:48:54 +02001277 data = _PyObject_CallNoArg(self->readline);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001278 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001279 else {
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001280 PyObject *len;
1281 /* Prefetch some data without advancing the file pointer, if possible */
1282 if (self->peek && n < PREFETCH) {
1283 len = PyLong_FromSsize_t(PREFETCH);
1284 if (len == NULL)
1285 return -1;
1286 data = _Pickle_FastCall(self->peek, len);
1287 if (data == NULL) {
1288 if (!PyErr_ExceptionMatches(PyExc_NotImplementedError))
1289 return -1;
1290 /* peek() is probably not supported by the given file object */
1291 PyErr_Clear();
1292 Py_CLEAR(self->peek);
1293 }
1294 else {
1295 read_size = _Unpickler_SetStringInput(self, data);
1296 Py_DECREF(data);
1297 self->prefetched_idx = 0;
1298 if (n <= read_size)
1299 return n;
1300 }
1301 }
1302 len = PyLong_FromSsize_t(n);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001303 if (len == NULL)
1304 return -1;
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08001305 data = _Pickle_FastCall(self->read, len);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001306 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001307 if (data == NULL)
1308 return -1;
1309
Serhiy Storchaka6fe39b72013-11-30 23:15:38 +02001310 read_size = _Unpickler_SetStringInput(self, data);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001311 Py_DECREF(data);
1312 return read_size;
1313}
1314
Victor Stinner19ed27e2016-05-20 11:42:37 +02001315/* Don't call it directly: use _Unpickler_Read() */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001316static Py_ssize_t
Victor Stinner19ed27e2016-05-20 11:42:37 +02001317_Unpickler_ReadImpl(UnpicklerObject *self, char **s, Py_ssize_t n)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001318{
Antoine Pitrou04248a82010-10-12 20:51:21 +00001319 Py_ssize_t num_read;
1320
Benjamin Peterson6aa15642015-09-27 01:16:03 -07001321 *s = NULL;
Benjamin Petersone48cf7e2015-09-26 00:08:34 -07001322 if (self->next_read_idx > PY_SSIZE_T_MAX - n) {
1323 PickleState *st = _Pickle_GetGlobalState();
1324 PyErr_SetString(st->UnpicklingError,
1325 "read would overflow (invalid bytecode)");
1326 return -1;
1327 }
Victor Stinner19ed27e2016-05-20 11:42:37 +02001328
1329 /* This case is handled by the _Unpickler_Read() macro for efficiency */
1330 assert(self->next_read_idx + n > self->input_len);
1331
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001332 if (!self->read)
1333 return bad_readline();
1334
Antoine Pitrou91f43802019-05-26 17:10:09 +02001335 /* Extend the buffer to satisfy desired size */
Antoine Pitrou04248a82010-10-12 20:51:21 +00001336 num_read = _Unpickler_ReadFromFile(self, n);
1337 if (num_read < 0)
1338 return -1;
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001339 if (num_read < n)
1340 return bad_readline();
Antoine Pitrou04248a82010-10-12 20:51:21 +00001341 *s = self->input_buffer;
1342 self->next_read_idx = n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001343 return n;
1344}
1345
Antoine Pitrou91f43802019-05-26 17:10:09 +02001346/* Read `n` bytes from the unpickler's data source, storing the result in `buf`.
1347 *
1348 * This should only be used for non-small data reads where potentially
1349 * avoiding a copy is beneficial. This method does not try to prefetch
1350 * more data into the input buffer.
1351 *
1352 * _Unpickler_Read() is recommended in most cases.
1353 */
1354static Py_ssize_t
1355_Unpickler_ReadInto(UnpicklerObject *self, char *buf, Py_ssize_t n)
1356{
1357 assert(n != READ_WHOLE_LINE);
1358
1359 /* Read from available buffer data, if any */
1360 Py_ssize_t in_buffer = self->input_len - self->next_read_idx;
1361 if (in_buffer > 0) {
1362 Py_ssize_t to_read = Py_MIN(in_buffer, n);
1363 memcpy(buf, self->input_buffer + self->next_read_idx, to_read);
1364 self->next_read_idx += to_read;
1365 buf += to_read;
1366 n -= to_read;
1367 if (n == 0) {
1368 /* Entire read was satisfied from buffer */
1369 return n;
1370 }
1371 }
1372
1373 /* Read from file */
1374 if (!self->readinto) {
1375 return bad_readline();
1376 }
1377 if (_Unpickler_SkipConsumed(self) < 0) {
1378 return -1;
1379 }
1380
1381 /* Call readinto() into user buffer */
1382 PyObject *buf_obj = PyMemoryView_FromMemory(buf, n, PyBUF_WRITE);
1383 if (buf_obj == NULL) {
1384 return -1;
1385 }
1386 PyObject *read_size_obj = _Pickle_FastCall(self->readinto, buf_obj);
1387 if (read_size_obj == NULL) {
1388 return -1;
1389 }
1390 Py_ssize_t read_size = PyLong_AsSsize_t(read_size_obj);
1391 Py_DECREF(read_size_obj);
1392
1393 if (read_size < 0) {
1394 if (!PyErr_Occurred()) {
1395 PyErr_SetString(PyExc_ValueError,
1396 "readinto() returned negative size");
1397 }
1398 return -1;
1399 }
1400 if (read_size < n) {
1401 return bad_readline();
1402 }
1403 return n;
1404}
1405
Victor Stinner19ed27e2016-05-20 11:42:37 +02001406/* Read `n` bytes from the unpickler's data source, storing the result in `*s`.
1407
1408 This should be used for all data reads, rather than accessing the unpickler's
1409 input buffer directly. This method deals correctly with reading from input
1410 streams, which the input buffer doesn't deal with.
1411
1412 Note that when reading from a file-like object, self->next_read_idx won't
1413 be updated (it should remain at 0 for the entire unpickling process). You
1414 should use this function's return value to know how many bytes you can
1415 consume.
1416
1417 Returns -1 (with an exception set) on failure. On success, return the
1418 number of chars read. */
1419#define _Unpickler_Read(self, s, n) \
Victor Stinnerda230562016-05-20 21:16:59 +02001420 (((n) <= (self)->input_len - (self)->next_read_idx) \
Victor Stinner19ed27e2016-05-20 11:42:37 +02001421 ? (*(s) = (self)->input_buffer + (self)->next_read_idx, \
1422 (self)->next_read_idx += (n), \
1423 (n)) \
1424 : _Unpickler_ReadImpl(self, (s), (n)))
1425
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001426static Py_ssize_t
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001427_Unpickler_CopyLine(UnpicklerObject *self, char *line, Py_ssize_t len,
1428 char **result)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001429{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001430 char *input_line = PyMem_Realloc(self->input_line, len + 1);
Victor Stinner42024562013-07-12 00:53:57 +02001431 if (input_line == NULL) {
1432 PyErr_NoMemory();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001433 return -1;
Victor Stinner42024562013-07-12 00:53:57 +02001434 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001435
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001436 memcpy(input_line, line, len);
1437 input_line[len] = '\0';
1438 self->input_line = input_line;
1439 *result = self->input_line;
1440 return len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001441}
1442
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001443/* Read a line from the input stream/buffer. If we run off the end of the input
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001444 before hitting \n, raise an error.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001445
1446 Returns the number of chars read, or -1 on failure. */
1447static Py_ssize_t
1448_Unpickler_Readline(UnpicklerObject *self, char **result)
1449{
1450 Py_ssize_t i, num_read;
1451
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001452 for (i = self->next_read_idx; i < self->input_len; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001453 if (self->input_buffer[i] == '\n') {
1454 char *line_start = self->input_buffer + self->next_read_idx;
1455 num_read = i - self->next_read_idx + 1;
1456 self->next_read_idx = i + 1;
1457 return _Unpickler_CopyLine(self, line_start, num_read, result);
1458 }
1459 }
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001460 if (!self->read)
1461 return bad_readline();
Victor Stinner121aab42011-09-29 23:40:53 +02001462
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03001463 num_read = _Unpickler_ReadFromFile(self, READ_WHOLE_LINE);
1464 if (num_read < 0)
1465 return -1;
1466 if (num_read == 0 || self->input_buffer[num_read - 1] != '\n')
1467 return bad_readline();
1468 self->next_read_idx = num_read;
1469 return _Unpickler_CopyLine(self, self->input_buffer, num_read, result);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001470}
1471
1472/* Returns -1 (with an exception set) on failure, 0 on success. The memo array
1473 will be modified in place. */
1474static int
Benjamin Petersona4ae8282018-09-20 18:36:40 -07001475_Unpickler_ResizeMemoList(UnpicklerObject *self, size_t new_size)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001476{
Benjamin Petersona4ae8282018-09-20 18:36:40 -07001477 size_t i;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001478
1479 assert(new_size > self->memo_size);
1480
Sergey Fedoseev67b9cc82018-08-16 09:27:50 +05001481 PyObject **memo_new = self->memo;
1482 PyMem_RESIZE(memo_new, PyObject *, new_size);
1483 if (memo_new == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001484 PyErr_NoMemory();
1485 return -1;
1486 }
Sergey Fedoseev67b9cc82018-08-16 09:27:50 +05001487 self->memo = memo_new;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001488 for (i = self->memo_size; i < new_size; i++)
1489 self->memo[i] = NULL;
1490 self->memo_size = new_size;
1491 return 0;
1492}
1493
1494/* Returns NULL if idx is out of bounds. */
1495static PyObject *
Benjamin Petersona4ae8282018-09-20 18:36:40 -07001496_Unpickler_MemoGet(UnpicklerObject *self, size_t idx)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001497{
Benjamin Petersona4ae8282018-09-20 18:36:40 -07001498 if (idx >= self->memo_size)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001499 return NULL;
1500
1501 return self->memo[idx];
1502}
1503
1504/* Returns -1 (with an exception set) on failure, 0 on success.
1505 This takes its own reference to `value`. */
1506static int
Benjamin Petersona4ae8282018-09-20 18:36:40 -07001507_Unpickler_MemoPut(UnpicklerObject *self, size_t idx, PyObject *value)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001508{
1509 PyObject *old_item;
1510
1511 if (idx >= self->memo_size) {
1512 if (_Unpickler_ResizeMemoList(self, idx * 2) < 0)
1513 return -1;
1514 assert(idx < self->memo_size);
1515 }
1516 Py_INCREF(value);
1517 old_item = self->memo[idx];
1518 self->memo[idx] = value;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001519 if (old_item != NULL) {
1520 Py_DECREF(old_item);
1521 }
1522 else {
1523 self->memo_len++;
1524 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001525 return 0;
1526}
1527
1528static PyObject **
1529_Unpickler_NewMemo(Py_ssize_t new_size)
1530{
Benjamin Peterson59b08c12015-06-27 13:41:33 -05001531 PyObject **memo = PyMem_NEW(PyObject *, new_size);
Victor Stinner42024562013-07-12 00:53:57 +02001532 if (memo == NULL) {
1533 PyErr_NoMemory();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001534 return NULL;
Victor Stinner42024562013-07-12 00:53:57 +02001535 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001536 memset(memo, 0, new_size * sizeof(PyObject *));
1537 return memo;
1538}
1539
1540/* Free the unpickler's memo, taking care to decref any items left in it. */
1541static void
1542_Unpickler_MemoCleanup(UnpicklerObject *self)
1543{
1544 Py_ssize_t i;
1545 PyObject **memo = self->memo;
1546
1547 if (self->memo == NULL)
1548 return;
1549 self->memo = NULL;
1550 i = self->memo_size;
1551 while (--i >= 0) {
1552 Py_XDECREF(memo[i]);
1553 }
1554 PyMem_FREE(memo);
1555}
1556
1557static UnpicklerObject *
1558_Unpickler_New(void)
1559{
1560 UnpicklerObject *self;
1561
1562 self = PyObject_GC_New(UnpicklerObject, &Unpickler_Type);
1563 if (self == NULL)
1564 return NULL;
1565
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001566 self->pers_func = NULL;
1567 self->input_buffer = NULL;
1568 self->input_line = NULL;
1569 self->input_len = 0;
1570 self->next_read_idx = 0;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001571 self->prefetched_idx = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001572 self->read = NULL;
Antoine Pitrou91f43802019-05-26 17:10:09 +02001573 self->readinto = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001574 self->readline = NULL;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001575 self->peek = NULL;
Antoine Pitrou91f43802019-05-26 17:10:09 +02001576 self->buffers = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001577 self->encoding = NULL;
1578 self->errors = NULL;
1579 self->marks = NULL;
1580 self->num_marks = 0;
1581 self->marks_size = 0;
1582 self->proto = 0;
1583 self->fix_imports = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001584 memset(&self->buffer, 0, sizeof(Py_buffer));
1585 self->memo_size = 32;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001586 self->memo_len = 0;
Victor Stinner68c8ea22013-07-11 22:56:25 +02001587 self->memo = _Unpickler_NewMemo(self->memo_size);
1588 self->stack = (Pdata *)Pdata_New();
1589
1590 if (self->memo == NULL || self->stack == NULL) {
1591 Py_DECREF(self);
1592 return NULL;
1593 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001594
Zackery Spytz359bd4f2019-04-23 05:56:08 -06001595 PyObject_GC_Track(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001596 return self;
1597}
1598
1599/* Returns -1 (with an exception set) on failure, 0 on success. This may
Antoine Pitrou91f43802019-05-26 17:10:09 +02001600 be called once on a freshly created Unpickler. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001601static int
1602_Unpickler_SetInputStream(UnpicklerObject *self, PyObject *file)
1603{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001604 _Py_IDENTIFIER(peek);
1605 _Py_IDENTIFIER(read);
Antoine Pitrou91f43802019-05-26 17:10:09 +02001606 _Py_IDENTIFIER(readinto);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001607 _Py_IDENTIFIER(readline);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02001608
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001609 if (_PyObject_LookupAttrId(file, &PyId_peek, &self->peek) < 0) {
1610 return -1;
Antoine Pitrou04248a82010-10-12 20:51:21 +00001611 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001612 (void)_PyObject_LookupAttrId(file, &PyId_read, &self->read);
Antoine Pitrou91f43802019-05-26 17:10:09 +02001613 (void)_PyObject_LookupAttrId(file, &PyId_readinto, &self->readinto);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001614 (void)_PyObject_LookupAttrId(file, &PyId_readline, &self->readline);
Antoine Pitrou91f43802019-05-26 17:10:09 +02001615 if (!self->readline || !self->readinto || !self->read) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001616 if (!PyErr_Occurred()) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001617 PyErr_SetString(PyExc_TypeError,
Antoine Pitrou91f43802019-05-26 17:10:09 +02001618 "file must have 'read', 'readinto' and "
1619 "'readline' attributes");
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001620 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001621 Py_CLEAR(self->read);
Antoine Pitrou91f43802019-05-26 17:10:09 +02001622 Py_CLEAR(self->readinto);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001623 Py_CLEAR(self->readline);
Antoine Pitrou04248a82010-10-12 20:51:21 +00001624 Py_CLEAR(self->peek);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001625 return -1;
1626 }
1627 return 0;
1628}
1629
1630/* Returns -1 (with an exception set) on failure, 0 on success. This may
Antoine Pitrou91f43802019-05-26 17:10:09 +02001631 be called once on a freshly created Unpickler. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001632static int
1633_Unpickler_SetInputEncoding(UnpicklerObject *self,
1634 const char *encoding,
1635 const char *errors)
1636{
1637 if (encoding == NULL)
1638 encoding = "ASCII";
1639 if (errors == NULL)
1640 errors = "strict";
1641
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001642 self->encoding = _PyMem_Strdup(encoding);
1643 self->errors = _PyMem_Strdup(errors);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001644 if (self->encoding == NULL || self->errors == NULL) {
1645 PyErr_NoMemory();
1646 return -1;
1647 }
1648 return 0;
1649}
1650
Antoine Pitrou91f43802019-05-26 17:10:09 +02001651/* Returns -1 (with an exception set) on failure, 0 on success. This may
1652 be called once on a freshly created Unpickler. */
1653static int
1654_Unpickler_SetBuffers(UnpicklerObject *self, PyObject *buffers)
1655{
Miss Islington (bot)25cb4fd2019-07-25 09:18:20 -07001656 if (buffers == NULL || buffers == Py_None) {
Antoine Pitrou91f43802019-05-26 17:10:09 +02001657 self->buffers = NULL;
1658 }
1659 else {
1660 self->buffers = PyObject_GetIter(buffers);
1661 if (self->buffers == NULL) {
1662 return -1;
1663 }
1664 }
1665 return 0;
1666}
1667
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001668/* Generate a GET opcode for an object stored in the memo. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001669static int
1670memo_get(PicklerObject *self, PyObject *key)
1671{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001672 Py_ssize_t *value;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001673 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001674 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001675
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001676 value = PyMemoTable_Get(self->memo, key);
1677 if (value == NULL) {
1678 PyErr_SetObject(PyExc_KeyError, key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001679 return -1;
1680 }
1681
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001682 if (!self->bin) {
1683 pdata[0] = GET;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001684 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
1685 "%" PY_FORMAT_SIZE_T "d\n", *value);
1686 len = strlen(pdata);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001687 }
1688 else {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001689 if (*value < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001690 pdata[0] = BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001691 pdata[1] = (unsigned char)(*value & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001692 len = 2;
1693 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03001694 else if ((size_t)*value <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001695 pdata[0] = LONG_BINGET;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001696 pdata[1] = (unsigned char)(*value & 0xff);
1697 pdata[2] = (unsigned char)((*value >> 8) & 0xff);
1698 pdata[3] = (unsigned char)((*value >> 16) & 0xff);
1699 pdata[4] = (unsigned char)((*value >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001700 len = 5;
1701 }
1702 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001703 PickleState *st = _Pickle_GetGlobalState();
1704 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001705 "memo id too large for LONG_BINGET");
1706 return -1;
1707 }
1708 }
1709
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001710 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001711 return -1;
1712
1713 return 0;
1714}
1715
1716/* Store an object in the memo, assign it a new unique ID based on the number
1717 of objects currently stored in the memo and generate a PUT opcode. */
1718static int
1719memo_put(PicklerObject *self, PyObject *obj)
1720{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001721 char pdata[30];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001722 Py_ssize_t len;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001723 Py_ssize_t idx;
1724
1725 const char memoize_op = MEMOIZE;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001726
1727 if (self->fast)
1728 return 0;
1729
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001730 idx = PyMemoTable_Size(self->memo);
1731 if (PyMemoTable_Set(self->memo, obj, idx) < 0)
1732 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001733
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001734 if (self->proto >= 4) {
1735 if (_Pickler_Write(self, &memoize_op, 1) < 0)
1736 return -1;
1737 return 0;
1738 }
1739 else if (!self->bin) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001740 pdata[0] = PUT;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02001741 PyOS_snprintf(pdata + 1, sizeof(pdata) - 1,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001742 "%" PY_FORMAT_SIZE_T "d\n", idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001743 len = strlen(pdata);
1744 }
1745 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001746 if (idx < 256) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001747 pdata[0] = BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001748 pdata[1] = (unsigned char)idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001749 len = 2;
1750 }
Serhiy Storchaka67c719b2014-09-05 10:10:23 +03001751 else if ((size_t)idx <= 0xffffffffUL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001752 pdata[0] = LONG_BINPUT;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001753 pdata[1] = (unsigned char)(idx & 0xff);
1754 pdata[2] = (unsigned char)((idx >> 8) & 0xff);
1755 pdata[3] = (unsigned char)((idx >> 16) & 0xff);
1756 pdata[4] = (unsigned char)((idx >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001757 len = 5;
1758 }
1759 else { /* unlikely */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08001760 PickleState *st = _Pickle_GetGlobalState();
1761 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001762 "memo id too large for LONG_BINPUT");
1763 return -1;
1764 }
1765 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001766 if (_Pickler_Write(self, pdata, len) < 0)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001767 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001768
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001769 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001770}
1771
1772static PyObject *
Serhiy Storchaka9937d902017-01-09 10:04:34 +02001773get_dotted_path(PyObject *obj, PyObject *name)
1774{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001775 _Py_static_string(PyId_dot, ".");
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001776 PyObject *dotted_path;
1777 Py_ssize_t i, n;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001778
1779 dotted_path = PyUnicode_Split(name, _PyUnicode_FromId(&PyId_dot), -1);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001780 if (dotted_path == NULL)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001781 return NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001782 n = PyList_GET_SIZE(dotted_path);
1783 assert(n >= 1);
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001784 for (i = 0; i < n; i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001785 PyObject *subpath = PyList_GET_ITEM(dotted_path, i);
Serhiy Storchaka9937d902017-01-09 10:04:34 +02001786 if (_PyUnicode_EqualToASCIIString(subpath, "<locals>")) {
Antoine Pitrou6cd5eda2014-12-02 00:20:03 +01001787 if (obj == NULL)
1788 PyErr_Format(PyExc_AttributeError,
1789 "Can't pickle local object %R", name);
1790 else
1791 PyErr_Format(PyExc_AttributeError,
1792 "Can't pickle local attribute %R on %R", name, obj);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001793 Py_DECREF(dotted_path);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001794 return NULL;
1795 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001796 }
1797 return dotted_path;
1798}
1799
1800static PyObject *
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001801get_deep_attribute(PyObject *obj, PyObject *names, PyObject **pparent)
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001802{
1803 Py_ssize_t i, n;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001804 PyObject *parent = NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001805
1806 assert(PyList_CheckExact(names));
1807 Py_INCREF(obj);
1808 n = PyList_GET_SIZE(names);
1809 for (i = 0; i < n; i++) {
1810 PyObject *name = PyList_GET_ITEM(names, i);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001811 Py_XDECREF(parent);
1812 parent = obj;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001813 (void)_PyObject_LookupAttr(parent, name, &obj);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001814 if (obj == NULL) {
1815 Py_DECREF(parent);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001816 return NULL;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001817 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001818 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001819 if (pparent != NULL)
1820 *pparent = parent;
1821 else
1822 Py_XDECREF(parent);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001823 return obj;
1824}
1825
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001826
1827static PyObject *
1828getattribute(PyObject *obj, PyObject *name, int allow_qualname)
1829{
1830 PyObject *dotted_path, *attr;
1831
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001832 if (allow_qualname) {
1833 dotted_path = get_dotted_path(obj, name);
1834 if (dotted_path == NULL)
1835 return NULL;
1836 attr = get_deep_attribute(obj, dotted_path, NULL);
1837 Py_DECREF(dotted_path);
1838 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001839 else {
1840 (void)_PyObject_LookupAttr(obj, name, &attr);
1841 }
1842 if (attr == NULL && !PyErr_Occurred()) {
1843 PyErr_Format(PyExc_AttributeError,
1844 "Can't get attribute %R on %R", name, obj);
1845 }
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001846 return attr;
1847}
1848
Eric Snow3f9eee62017-09-15 16:35:20 -06001849static int
1850_checkmodule(PyObject *module_name, PyObject *module,
1851 PyObject *global, PyObject *dotted_path)
1852{
1853 if (module == Py_None) {
1854 return -1;
1855 }
1856 if (PyUnicode_Check(module_name) &&
1857 _PyUnicode_EqualToASCIIString(module_name, "__main__")) {
1858 return -1;
1859 }
1860
1861 PyObject *candidate = get_deep_attribute(module, dotted_path, NULL);
1862 if (candidate == NULL) {
Eric Snow3f9eee62017-09-15 16:35:20 -06001863 return -1;
1864 }
1865 if (candidate != global) {
1866 Py_DECREF(candidate);
1867 return -1;
1868 }
1869 Py_DECREF(candidate);
1870 return 0;
1871}
1872
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001873static PyObject *
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001874whichmodule(PyObject *global, PyObject *dotted_path)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001875{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001876 PyObject *module_name;
Eric Snow3f9eee62017-09-15 16:35:20 -06001877 PyObject *module = NULL;
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001878 Py_ssize_t i;
Eric Snow3f9eee62017-09-15 16:35:20 -06001879 PyObject *modules;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001880 _Py_IDENTIFIER(__module__);
1881 _Py_IDENTIFIER(modules);
1882 _Py_IDENTIFIER(__main__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001883
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001884 if (_PyObject_LookupAttrId(global, &PyId___module__, &module_name) < 0) {
1885 return NULL;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001886 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001887 if (module_name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001888 /* In some rare cases (e.g., bound methods of extension types),
1889 __module__ can be None. If it is so, then search sys.modules for
1890 the module of global. */
1891 if (module_name != Py_None)
1892 return module_name;
1893 Py_CLEAR(module_name);
1894 }
1895 assert(module_name == NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001896
Antoine Pitroufce60ea2014-10-23 22:47:50 +02001897 /* Fallback on walking sys.modules */
Eric Snow3f9eee62017-09-15 16:35:20 -06001898 modules = _PySys_GetObjectId(&PyId_modules);
1899 if (modules == NULL) {
Victor Stinner1e53bba2013-07-16 22:26:05 +02001900 PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001901 return NULL;
Victor Stinner1e53bba2013-07-16 22:26:05 +02001902 }
Eric Snow3f9eee62017-09-15 16:35:20 -06001903 if (PyDict_CheckExact(modules)) {
1904 i = 0;
1905 while (PyDict_Next(modules, &i, &module_name, &module)) {
1906 if (_checkmodule(module_name, module, global, dotted_path) == 0) {
1907 Py_INCREF(module_name);
1908 return module_name;
1909 }
1910 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001911 return NULL;
Eric Snow3f9eee62017-09-15 16:35:20 -06001912 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001913 }
Eric Snow3f9eee62017-09-15 16:35:20 -06001914 }
1915 else {
1916 PyObject *iterator = PyObject_GetIter(modules);
1917 if (iterator == NULL) {
1918 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001919 }
Eric Snow3f9eee62017-09-15 16:35:20 -06001920 while ((module_name = PyIter_Next(iterator))) {
1921 module = PyObject_GetItem(modules, module_name);
1922 if (module == NULL) {
1923 Py_DECREF(module_name);
1924 Py_DECREF(iterator);
1925 return NULL;
1926 }
1927 if (_checkmodule(module_name, module, global, dotted_path) == 0) {
1928 Py_DECREF(module);
1929 Py_DECREF(iterator);
1930 return module_name;
1931 }
1932 Py_DECREF(module);
1933 Py_DECREF(module_name);
1934 if (PyErr_Occurred()) {
1935 Py_DECREF(iterator);
1936 return NULL;
1937 }
1938 }
1939 Py_DECREF(iterator);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001940 }
1941
1942 /* If no module is found, use __main__. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001943 module_name = _PyUnicode_FromId(&PyId___main__);
Victor Stinneraf46eb82017-09-05 23:30:16 +02001944 Py_XINCREF(module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001945 return module_name;
1946}
1947
1948/* fast_save_enter() and fast_save_leave() are guards against recursive
1949 objects when Pickler is used with the "fast mode" (i.e., with object
1950 memoization disabled). If the nesting of a list or dict object exceed
1951 FAST_NESTING_LIMIT, these guards will start keeping an internal
1952 reference to the seen list or dict objects and check whether these objects
1953 are recursive. These are not strictly necessary, since save() has a
1954 hard-coded recursion limit, but they give a nicer error message than the
1955 typical RuntimeError. */
1956static int
1957fast_save_enter(PicklerObject *self, PyObject *obj)
1958{
1959 /* if fast_nesting < 0, we're doing an error exit. */
1960 if (++self->fast_nesting >= FAST_NESTING_LIMIT) {
1961 PyObject *key = NULL;
1962 if (self->fast_memo == NULL) {
1963 self->fast_memo = PyDict_New();
1964 if (self->fast_memo == NULL) {
1965 self->fast_nesting = -1;
1966 return 0;
1967 }
1968 }
1969 key = PyLong_FromVoidPtr(obj);
Mat Mf76231f2017-11-13 02:50:16 -05001970 if (key == NULL) {
1971 self->fast_nesting = -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001972 return 0;
Mat Mf76231f2017-11-13 02:50:16 -05001973 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001974 if (PyDict_GetItemWithError(self->fast_memo, key)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001975 Py_DECREF(key);
1976 PyErr_Format(PyExc_ValueError,
1977 "fast mode: can't pickle cyclic objects "
1978 "including object type %.200s at %p",
1979 obj->ob_type->tp_name, obj);
1980 self->fast_nesting = -1;
1981 return 0;
1982 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001983 if (PyErr_Occurred()) {
Mat Mf76231f2017-11-13 02:50:16 -05001984 Py_DECREF(key);
1985 self->fast_nesting = -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08001986 return 0;
1987 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001988 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
1989 Py_DECREF(key);
1990 self->fast_nesting = -1;
1991 return 0;
1992 }
1993 Py_DECREF(key);
1994 }
1995 return 1;
1996}
1997
1998static int
1999fast_save_leave(PicklerObject *self, PyObject *obj)
2000{
2001 if (self->fast_nesting-- >= FAST_NESTING_LIMIT) {
2002 PyObject *key = PyLong_FromVoidPtr(obj);
2003 if (key == NULL)
2004 return 0;
2005 if (PyDict_DelItem(self->fast_memo, key) < 0) {
2006 Py_DECREF(key);
2007 return 0;
2008 }
2009 Py_DECREF(key);
2010 }
2011 return 1;
2012}
2013
2014static int
2015save_none(PicklerObject *self, PyObject *obj)
2016{
2017 const char none_op = NONE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002018 if (_Pickler_Write(self, &none_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002019 return -1;
2020
2021 return 0;
2022}
2023
2024static int
2025save_bool(PicklerObject *self, PyObject *obj)
2026{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002027 if (self->proto >= 2) {
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08002028 const char bool_op = (obj == Py_True) ? NEWTRUE : NEWFALSE;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002029 if (_Pickler_Write(self, &bool_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002030 return -1;
2031 }
Alexandre Vassalotti8a67f522013-11-24 21:40:18 -08002032 else {
2033 /* These aren't opcodes -- they're ways to pickle bools before protocol 2
2034 * so that unpicklers written before bools were introduced unpickle them
2035 * as ints, but unpicklers after can recognize that bools were intended.
2036 * Note that protocol 2 added direct ways to pickle bools.
2037 */
2038 const char *bool_str = (obj == Py_True) ? "I01\n" : "I00\n";
2039 if (_Pickler_Write(self, bool_str, strlen(bool_str)) < 0)
2040 return -1;
2041 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002042 return 0;
2043}
2044
2045static int
Alexandre Vassalottided929b2013-11-24 22:41:13 -08002046save_long(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002047{
Alexandre Vassalottided929b2013-11-24 22:41:13 -08002048 PyObject *repr = NULL;
2049 Py_ssize_t size;
2050 long val;
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002051 int overflow;
Alexandre Vassalottided929b2013-11-24 22:41:13 -08002052 int status = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002053
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002054 val= PyLong_AsLongAndOverflow(obj, &overflow);
2055 if (!overflow && (sizeof(long) <= 4 ||
2056 (val <= 0x7fffffffL && val >= (-0x7fffffffL - 1))))
2057 {
Larry Hastings61272b72014-01-07 12:41:53 -08002058 /* result fits in a signed 4-byte integer.
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002059
2060 Note: we can't use -0x80000000L in the above condition because some
2061 compilers (e.g., MSVC) will promote 0x80000000L to an unsigned type
2062 before applying the unary minus when sizeof(long) <= 4. The
2063 resulting value stays unsigned which is commonly not what we want,
2064 so MSVC happily warns us about it. However, that result would have
2065 been fine because we guard for sizeof(long) <= 4 which turns the
2066 condition true in that particular case. */
Alexandre Vassalottided929b2013-11-24 22:41:13 -08002067 char pdata[32];
2068 Py_ssize_t len = 0;
2069
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002070 if (self->bin) {
2071 pdata[1] = (unsigned char)(val & 0xff);
2072 pdata[2] = (unsigned char)((val >> 8) & 0xff);
2073 pdata[3] = (unsigned char)((val >> 16) & 0xff);
2074 pdata[4] = (unsigned char)((val >> 24) & 0xff);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002075
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002076 if ((pdata[4] != 0) || (pdata[3] != 0)) {
2077 pdata[0] = BININT;
2078 len = 5;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002079 }
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002080 else if (pdata[2] != 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002081 pdata[0] = BININT2;
2082 len = 3;
2083 }
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002084 else {
2085 pdata[0] = BININT1;
2086 len = 2;
2087 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002088 }
2089 else {
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002090 sprintf(pdata, "%c%ld\n", INT, val);
2091 len = strlen(pdata);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002092 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002093 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002094 return -1;
Alexandre Vassalottided929b2013-11-24 22:41:13 -08002095
2096 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002097 }
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002098 assert(!PyErr_Occurred());
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002099
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002100 if (self->proto >= 2) {
2101 /* Linear-time pickling. */
2102 size_t nbits;
2103 size_t nbytes;
2104 unsigned char *pdata;
2105 char header[5];
2106 int i;
2107 int sign = _PyLong_Sign(obj);
2108
2109 if (sign == 0) {
2110 header[0] = LONG1;
2111 header[1] = 0; /* It's 0 -- an empty bytestring. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002112 if (_Pickler_Write(self, header, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002113 goto error;
2114 return 0;
2115 }
2116 nbits = _PyLong_NumBits(obj);
2117 if (nbits == (size_t)-1 && PyErr_Occurred())
2118 goto error;
2119 /* How many bytes do we need? There are nbits >> 3 full
2120 * bytes of data, and nbits & 7 leftover bits. If there
2121 * are any leftover bits, then we clearly need another
Kyle Stanley24b5b362019-07-21 22:48:45 -04002122 * byte. What's not so obvious is that we *probably*
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002123 * need another byte even if there aren't any leftovers:
2124 * the most-significant bit of the most-significant byte
2125 * acts like a sign bit, and it's usually got a sense
Serhiy Storchaka95949422013-08-27 19:40:23 +03002126 * opposite of the one we need. The exception is ints
2127 * of the form -(2**(8*j-1)) for j > 0. Such an int is
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002128 * its own 256's-complement, so has the right sign bit
2129 * even without the extra byte. That's a pain to check
2130 * for in advance, though, so we always grab an extra
2131 * byte at the start, and cut it back later if possible.
2132 */
2133 nbytes = (nbits >> 3) + 1;
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01002134 if (nbytes > 0x7fffffffL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002135 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03002136 "int too large to pickle");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002137 goto error;
2138 }
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00002139 repr = PyBytes_FromStringAndSize(NULL, (Py_ssize_t)nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002140 if (repr == NULL)
2141 goto error;
Neal Norwitz6ae2eb22008-08-24 23:50:08 +00002142 pdata = (unsigned char *)PyBytes_AS_STRING(repr);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002143 i = _PyLong_AsByteArray((PyLongObject *)obj,
2144 pdata, nbytes,
2145 1 /* little endian */ , 1 /* signed */ );
2146 if (i < 0)
2147 goto error;
Serhiy Storchaka95949422013-08-27 19:40:23 +03002148 /* If the int is negative, this may be a byte more than
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002149 * needed. This is so iff the MSB is all redundant sign
2150 * bits.
2151 */
2152 if (sign < 0 &&
Victor Stinner121aab42011-09-29 23:40:53 +02002153 nbytes > 1 &&
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002154 pdata[nbytes - 1] == 0xff &&
2155 (pdata[nbytes - 2] & 0x80) != 0) {
2156 nbytes--;
2157 }
2158
2159 if (nbytes < 256) {
2160 header[0] = LONG1;
2161 header[1] = (unsigned char)nbytes;
2162 size = 2;
2163 }
2164 else {
2165 header[0] = LONG4;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002166 size = (Py_ssize_t) nbytes;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002167 for (i = 1; i < 5; i++) {
2168 header[i] = (unsigned char)(size & 0xff);
2169 size >>= 8;
2170 }
2171 size = 5;
2172 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002173 if (_Pickler_Write(self, header, size) < 0 ||
2174 _Pickler_Write(self, (char *)pdata, (int)nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002175 goto error;
2176 }
2177 else {
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +02002178 const char long_op = LONG;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02002179 const char *string;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002180
Mark Dickinson8dd05142009-01-20 20:43:58 +00002181 /* proto < 2: write the repr and newline. This is quadratic-time (in
2182 the number of digits), in both directions. We add a trailing 'L'
2183 to the repr, for compatibility with Python 2.x. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002184
2185 repr = PyObject_Repr(obj);
2186 if (repr == NULL)
2187 goto error;
2188
Serhiy Storchaka06515832016-11-20 09:13:07 +02002189 string = PyUnicode_AsUTF8AndSize(repr, &size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002190 if (string == NULL)
2191 goto error;
2192
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002193 if (_Pickler_Write(self, &long_op, 1) < 0 ||
2194 _Pickler_Write(self, string, size) < 0 ||
2195 _Pickler_Write(self, "L\n", 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002196 goto error;
2197 }
2198
2199 if (0) {
2200 error:
2201 status = -1;
2202 }
2203 Py_XDECREF(repr);
2204
2205 return status;
2206}
2207
2208static int
2209save_float(PicklerObject *self, PyObject *obj)
2210{
2211 double x = PyFloat_AS_DOUBLE((PyFloatObject *)obj);
2212
2213 if (self->bin) {
2214 char pdata[9];
2215 pdata[0] = BINFLOAT;
2216 if (_PyFloat_Pack8(x, (unsigned char *)&pdata[1], 0) < 0)
2217 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002218 if (_Pickler_Write(self, pdata, 9) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002219 return -1;
Victor Stinner121aab42011-09-29 23:40:53 +02002220 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002221 else {
Eric Smith0923d1d2009-04-16 20:16:10 +00002222 int result = -1;
2223 char *buf = NULL;
2224 char op = FLOAT;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002225
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002226 if (_Pickler_Write(self, &op, 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00002227 goto done;
2228
Serhiy Storchakac86ca262015-02-15 14:18:32 +02002229 buf = PyOS_double_to_string(x, 'r', 0, Py_DTSF_ADD_DOT_0, NULL);
Eric Smith0923d1d2009-04-16 20:16:10 +00002230 if (!buf) {
2231 PyErr_NoMemory();
2232 goto done;
2233 }
2234
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002235 if (_Pickler_Write(self, buf, strlen(buf)) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00002236 goto done;
2237
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002238 if (_Pickler_Write(self, "\n", 1) < 0)
Eric Smith0923d1d2009-04-16 20:16:10 +00002239 goto done;
2240
2241 result = 0;
2242done:
2243 PyMem_Free(buf);
2244 return result;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002245 }
2246
2247 return 0;
2248}
2249
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002250/* Perform direct write of the header and payload of the binary object.
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002251
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002252 The large contiguous data is written directly into the underlying file
2253 object, bypassing the output_buffer of the Pickler. We intentionally
2254 do not insert a protocol 4 frame opcode to make it possible to optimize
2255 file.read calls in the loader.
2256 */
2257static int
2258_Pickler_write_bytes(PicklerObject *self,
2259 const char *header, Py_ssize_t header_size,
2260 const char *data, Py_ssize_t data_size,
2261 PyObject *payload)
2262{
2263 int bypass_buffer = (data_size >= FRAME_SIZE_TARGET);
2264 int framing = self->framing;
2265
2266 if (bypass_buffer) {
2267 assert(self->output_buffer != NULL);
2268 /* Commit the previous frame. */
2269 if (_Pickler_CommitFrame(self)) {
2270 return -1;
2271 }
2272 /* Disable framing temporarily */
2273 self->framing = 0;
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002274 }
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002275
2276 if (_Pickler_Write(self, header, header_size) < 0) {
2277 return -1;
2278 }
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002279
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002280 if (bypass_buffer && self->write != NULL) {
2281 /* Bypass the in-memory buffer to directly stream large data
2282 into the underlying file object. */
2283 PyObject *result, *mem = NULL;
2284 /* Dump the output buffer to the file. */
2285 if (_Pickler_FlushToFile(self) < 0) {
2286 return -1;
2287 }
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002288
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002289 /* Stream write the payload into the file without going through the
2290 output buffer. */
2291 if (payload == NULL) {
Serhiy Storchaka5b76bdb2018-01-13 00:28:31 +02002292 /* TODO: It would be better to use a memoryview with a linked
2293 original string if this is possible. */
2294 payload = mem = PyBytes_FromStringAndSize(data, data_size);
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002295 if (payload == NULL) {
2296 return -1;
2297 }
2298 }
2299 result = PyObject_CallFunctionObjArgs(self->write, payload, NULL);
2300 Py_XDECREF(mem);
2301 if (result == NULL) {
2302 return -1;
2303 }
2304 Py_DECREF(result);
2305
2306 /* Reinitialize the buffer for subsequent calls to _Pickler_Write. */
2307 if (_Pickler_ClearBuffer(self) < 0) {
2308 return -1;
2309 }
2310 }
2311 else {
2312 if (_Pickler_Write(self, data, data_size) < 0) {
2313 return -1;
2314 }
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002315 }
2316
2317 /* Re-enable framing for subsequent calls to _Pickler_Write. */
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002318 self->framing = framing;
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002319
2320 return 0;
2321}
2322
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002323static int
Antoine Pitrou91f43802019-05-26 17:10:09 +02002324_save_bytes_data(PicklerObject *self, PyObject *obj, const char *data,
2325 Py_ssize_t size)
2326{
2327 assert(self->proto >= 3);
2328
2329 char header[9];
2330 Py_ssize_t len;
2331
2332 if (size < 0)
2333 return -1;
2334
2335 if (size <= 0xff) {
2336 header[0] = SHORT_BINBYTES;
2337 header[1] = (unsigned char)size;
2338 len = 2;
2339 }
2340 else if ((size_t)size <= 0xffffffffUL) {
2341 header[0] = BINBYTES;
2342 header[1] = (unsigned char)(size & 0xff);
2343 header[2] = (unsigned char)((size >> 8) & 0xff);
2344 header[3] = (unsigned char)((size >> 16) & 0xff);
2345 header[4] = (unsigned char)((size >> 24) & 0xff);
2346 len = 5;
2347 }
2348 else if (self->proto >= 4) {
2349 header[0] = BINBYTES8;
2350 _write_size64(header + 1, size);
2351 len = 9;
2352 }
2353 else {
2354 PyErr_SetString(PyExc_OverflowError,
2355 "serializing a bytes object larger than 4 GiB "
2356 "requires pickle protocol 4 or higher");
2357 return -1;
2358 }
2359
2360 if (_Pickler_write_bytes(self, header, len, data, size, obj) < 0) {
2361 return -1;
2362 }
2363
2364 if (memo_put(self, obj) < 0) {
2365 return -1;
2366 }
2367
2368 return 0;
2369}
2370
2371static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002372save_bytes(PicklerObject *self, PyObject *obj)
2373{
2374 if (self->proto < 3) {
2375 /* Older pickle protocols do not have an opcode for pickling bytes
2376 objects. Therefore, we need to fake the copy protocol (i.e.,
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002377 the __reduce__ method) to permit bytes object unpickling.
2378
2379 Here we use a hack to be compatible with Python 2. Since in Python
2380 2 'bytes' is just an alias for 'str' (which has different
2381 parameters than the actual bytes object), we use codecs.encode
2382 to create the appropriate 'str' object when unpickled using
2383 Python 2 *and* the appropriate 'bytes' object when unpickled
2384 using Python 3. Again this is a hack and we don't need to do this
2385 with newer protocols. */
Pierre Glaser289f1f82019-05-08 23:08:25 +02002386 PyObject *reduce_value;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002387 int status;
2388
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002389 if (PyBytes_GET_SIZE(obj) == 0) {
2390 reduce_value = Py_BuildValue("(O())", (PyObject*)&PyBytes_Type);
2391 }
2392 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002393 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002394 PyObject *unicode_str =
2395 PyUnicode_DecodeLatin1(PyBytes_AS_STRING(obj),
2396 PyBytes_GET_SIZE(obj),
2397 "strict");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002398 _Py_IDENTIFIER(latin1);
2399
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002400 if (unicode_str == NULL)
2401 return -1;
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002402 reduce_value = Py_BuildValue("(O(OO))",
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08002403 st->codecs_encode, unicode_str,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002404 _PyUnicode_FromId(&PyId_latin1));
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -05002405 Py_DECREF(unicode_str);
2406 }
2407
2408 if (reduce_value == NULL)
2409 return -1;
2410
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002411 /* save_reduce() will memoize the object automatically. */
2412 status = save_reduce(self, reduce_value, obj);
2413 Py_DECREF(reduce_value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002414 return status;
2415 }
2416 else {
Antoine Pitrou91f43802019-05-26 17:10:09 +02002417 return _save_bytes_data(self, obj, PyBytes_AS_STRING(obj),
2418 PyBytes_GET_SIZE(obj));
2419 }
2420}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002421
Antoine Pitrou91f43802019-05-26 17:10:09 +02002422static int
2423_save_bytearray_data(PicklerObject *self, PyObject *obj, const char *data,
2424 Py_ssize_t size)
2425{
2426 assert(self->proto >= 5);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002427
Antoine Pitrou91f43802019-05-26 17:10:09 +02002428 char header[9];
2429 Py_ssize_t len;
2430
2431 if (size < 0)
2432 return -1;
2433
2434 header[0] = BYTEARRAY8;
2435 _write_size64(header + 1, size);
2436 len = 9;
2437
2438 if (_Pickler_write_bytes(self, header, len, data, size, obj) < 0) {
2439 return -1;
2440 }
2441
2442 if (memo_put(self, obj) < 0) {
2443 return -1;
2444 }
2445
2446 return 0;
2447}
2448
2449static int
2450save_bytearray(PicklerObject *self, PyObject *obj)
2451{
2452 if (self->proto < 5) {
2453 /* Older pickle protocols do not have an opcode for pickling
2454 * bytearrays. */
2455 PyObject *reduce_value = NULL;
2456 int status;
2457
2458 if (PyByteArray_GET_SIZE(obj) == 0) {
2459 reduce_value = Py_BuildValue("(O())",
2460 (PyObject *) &PyByteArray_Type);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002461 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002462 else {
Antoine Pitrou91f43802019-05-26 17:10:09 +02002463 PyObject *bytes_obj = PyBytes_FromObject(obj);
2464 if (bytes_obj != NULL) {
2465 reduce_value = Py_BuildValue("(O(O))",
2466 (PyObject *) &PyByteArray_Type,
2467 bytes_obj);
2468 Py_DECREF(bytes_obj);
2469 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002470 }
Antoine Pitrou91f43802019-05-26 17:10:09 +02002471 if (reduce_value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002472 return -1;
2473
Antoine Pitrou91f43802019-05-26 17:10:09 +02002474 /* save_reduce() will memoize the object automatically. */
2475 status = save_reduce(self, reduce_value, obj);
2476 Py_DECREF(reduce_value);
2477 return status;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002478 }
Antoine Pitrou91f43802019-05-26 17:10:09 +02002479 else {
2480 return _save_bytearray_data(self, obj, PyByteArray_AS_STRING(obj),
2481 PyByteArray_GET_SIZE(obj));
2482 }
2483}
2484
2485static int
2486save_picklebuffer(PicklerObject *self, PyObject *obj)
2487{
2488 if (self->proto < 5) {
2489 PickleState *st = _Pickle_GetGlobalState();
2490 PyErr_SetString(st->PicklingError,
2491 "PickleBuffer can only pickled with protocol >= 5");
2492 return -1;
2493 }
2494 const Py_buffer* view = PyPickleBuffer_GetBuffer(obj);
2495 if (view == NULL) {
2496 return -1;
2497 }
2498 if (view->suboffsets != NULL || !PyBuffer_IsContiguous(view, 'A')) {
2499 PickleState *st = _Pickle_GetGlobalState();
2500 PyErr_SetString(st->PicklingError,
2501 "PickleBuffer can not be pickled when "
2502 "pointing to a non-contiguous buffer");
2503 return -1;
2504 }
2505 int in_band = 1;
2506 if (self->buffer_callback != NULL) {
2507 PyObject *ret = PyObject_CallFunctionObjArgs(self->buffer_callback,
2508 obj, NULL);
2509 if (ret == NULL) {
2510 return -1;
2511 }
2512 in_band = PyObject_IsTrue(ret);
2513 Py_DECREF(ret);
2514 if (in_band == -1) {
2515 return -1;
2516 }
2517 }
2518 if (in_band) {
2519 /* Write data in-band */
2520 if (view->readonly) {
2521 return _save_bytes_data(self, obj, (const char*) view->buf,
2522 view->len);
2523 }
2524 else {
2525 return _save_bytearray_data(self, obj, (const char*) view->buf,
2526 view->len);
2527 }
2528 }
2529 else {
2530 /* Write data out-of-band */
2531 const char next_buffer_op = NEXT_BUFFER;
2532 if (_Pickler_Write(self, &next_buffer_op, 1) < 0) {
2533 return -1;
2534 }
2535 if (view->readonly) {
2536 const char readonly_buffer_op = READONLY_BUFFER;
2537 if (_Pickler_Write(self, &readonly_buffer_op, 1) < 0) {
2538 return -1;
2539 }
2540 }
2541 }
2542 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002543}
2544
2545/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
2546 backslash and newline characters to \uXXXX escapes. */
2547static PyObject *
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002548raw_unicode_escape(PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002549{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002550 char *p;
Victor Stinner049e5092014-08-17 22:20:00 +02002551 Py_ssize_t i, size;
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002552 void *data;
2553 unsigned int kind;
Victor Stinner358af132015-10-12 22:36:57 +02002554 _PyBytesWriter writer;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002555
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002556 if (PyUnicode_READY(obj))
2557 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002558
Victor Stinner358af132015-10-12 22:36:57 +02002559 _PyBytesWriter_Init(&writer);
2560
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002561 size = PyUnicode_GET_LENGTH(obj);
2562 data = PyUnicode_DATA(obj);
2563 kind = PyUnicode_KIND(obj);
Victor Stinner121aab42011-09-29 23:40:53 +02002564
Victor Stinner358af132015-10-12 22:36:57 +02002565 p = _PyBytesWriter_Alloc(&writer, size);
2566 if (p == NULL)
2567 goto error;
2568 writer.overallocate = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002569
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002570 for (i=0; i < size; i++) {
2571 Py_UCS4 ch = PyUnicode_READ(kind, data, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002572 /* Map 32-bit characters to '\Uxxxxxxxx' */
2573 if (ch >= 0x10000) {
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002574 /* -1: subtract 1 preallocated byte */
Victor Stinner358af132015-10-12 22:36:57 +02002575 p = _PyBytesWriter_Prepare(&writer, p, 10-1);
2576 if (p == NULL)
2577 goto error;
2578
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002579 *p++ = '\\';
2580 *p++ = 'U';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002581 *p++ = Py_hexdigits[(ch >> 28) & 0xf];
2582 *p++ = Py_hexdigits[(ch >> 24) & 0xf];
2583 *p++ = Py_hexdigits[(ch >> 20) & 0xf];
2584 *p++ = Py_hexdigits[(ch >> 16) & 0xf];
2585 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2586 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2587 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2588 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002589 }
Victor Stinner358af132015-10-12 22:36:57 +02002590 /* Map 16-bit characters, '\\' and '\n' to '\uxxxx' */
Serhiy Storchaka38ab7d42019-05-31 11:29:39 +03002591 else if (ch >= 256 ||
2592 ch == '\\' || ch == 0 || ch == '\n' || ch == '\r' ||
2593 ch == 0x1a)
2594 {
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07002595 /* -1: subtract 1 preallocated byte */
Victor Stinner358af132015-10-12 22:36:57 +02002596 p = _PyBytesWriter_Prepare(&writer, p, 6-1);
2597 if (p == NULL)
2598 goto error;
2599
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002600 *p++ = '\\';
2601 *p++ = 'u';
Victor Stinnerf5cff562011-10-14 02:13:11 +02002602 *p++ = Py_hexdigits[(ch >> 12) & 0xf];
2603 *p++ = Py_hexdigits[(ch >> 8) & 0xf];
2604 *p++ = Py_hexdigits[(ch >> 4) & 0xf];
2605 *p++ = Py_hexdigits[ch & 15];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002606 }
Alexandre Vassalotti554d8782008-12-27 07:32:41 +00002607 /* Copy everything else as-is */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002608 else
2609 *p++ = (char) ch;
2610 }
Victor Stinner358af132015-10-12 22:36:57 +02002611
2612 return _PyBytesWriter_Finish(&writer, p);
2613
2614error:
2615 _PyBytesWriter_Dealloc(&writer);
2616 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002617}
2618
2619static int
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002620write_unicode_binary(PicklerObject *self, PyObject *obj)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002621{
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002622 char header[9];
2623 Py_ssize_t len;
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002624 PyObject *encoded = NULL;
2625 Py_ssize_t size;
2626 const char *data;
2627
2628 if (PyUnicode_READY(obj))
2629 return -1;
2630
2631 data = PyUnicode_AsUTF8AndSize(obj, &size);
2632 if (data == NULL) {
2633 /* Issue #8383: for strings with lone surrogates, fallback on the
2634 "surrogatepass" error handler. */
2635 PyErr_Clear();
2636 encoded = PyUnicode_AsEncodedString(obj, "utf-8", "surrogatepass");
2637 if (encoded == NULL)
2638 return -1;
2639
2640 data = PyBytes_AS_STRING(encoded);
2641 size = PyBytes_GET_SIZE(encoded);
2642 }
Antoine Pitrou299978d2013-04-07 17:38:11 +02002643
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002644 assert(size >= 0);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002645 if (size <= 0xff && self->proto >= 4) {
2646 header[0] = SHORT_BINUNICODE;
2647 header[1] = (unsigned char)(size & 0xff);
2648 len = 2;
2649 }
Victor Stinnerf13c46c2014-08-17 21:05:55 +02002650 else if ((size_t)size <= 0xffffffffUL) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002651 header[0] = BINUNICODE;
2652 header[1] = (unsigned char)(size & 0xff);
2653 header[2] = (unsigned char)((size >> 8) & 0xff);
2654 header[3] = (unsigned char)((size >> 16) & 0xff);
2655 header[4] = (unsigned char)((size >> 24) & 0xff);
2656 len = 5;
2657 }
2658 else if (self->proto >= 4) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002659 header[0] = BINUNICODE8;
Alexandre Vassalotti1048fb52013-11-25 11:35:46 -08002660 _write_size64(header + 1, size);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01002661 len = 9;
2662 }
2663 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002664 PyErr_SetString(PyExc_OverflowError,
Antoine Pitrou91f43802019-05-26 17:10:09 +02002665 "serializing a string larger than 4 GiB "
2666 "requires pickle protocol 4 or higher");
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002667 Py_XDECREF(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002668 return -1;
2669 }
Antoine Pitrou299978d2013-04-07 17:38:11 +02002670
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002671 if (_Pickler_write_bytes(self, header, len, data, size, encoded) < 0) {
2672 Py_XDECREF(encoded);
2673 return -1;
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +01002674 }
Serhiy Storchaka0a2da502018-01-11 13:03:20 +02002675 Py_XDECREF(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002676 return 0;
2677}
2678
2679static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002680save_unicode(PicklerObject *self, PyObject *obj)
2681{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002682 if (self->bin) {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002683 if (write_unicode_binary(self, obj) < 0)
2684 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002685 }
2686 else {
Antoine Pitrou299978d2013-04-07 17:38:11 +02002687 PyObject *encoded;
2688 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002689 const char unicode_op = UNICODE;
2690
Victor Stinnerc806fdc2011-09-29 23:50:23 +02002691 encoded = raw_unicode_escape(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002692 if (encoded == NULL)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002693 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002694
Antoine Pitrou299978d2013-04-07 17:38:11 +02002695 if (_Pickler_Write(self, &unicode_op, 1) < 0) {
2696 Py_DECREF(encoded);
2697 return -1;
2698 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002699
2700 size = PyBytes_GET_SIZE(encoded);
Antoine Pitrou299978d2013-04-07 17:38:11 +02002701 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded), size) < 0) {
2702 Py_DECREF(encoded);
2703 return -1;
2704 }
2705 Py_DECREF(encoded);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002706
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002707 if (_Pickler_Write(self, "\n", 1) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002708 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002709 }
2710 if (memo_put(self, obj) < 0)
Antoine Pitrou299978d2013-04-07 17:38:11 +02002711 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002712
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002713 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002714}
2715
2716/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
2717static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002718store_tuple_elements(PicklerObject *self, PyObject *t, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002719{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002720 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002721
2722 assert(PyTuple_Size(t) == len);
2723
2724 for (i = 0; i < len; i++) {
2725 PyObject *element = PyTuple_GET_ITEM(t, i);
2726
2727 if (element == NULL)
2728 return -1;
2729 if (save(self, element, 0) < 0)
2730 return -1;
2731 }
2732
2733 return 0;
2734}
2735
2736/* Tuples are ubiquitous in the pickle protocols, so many techniques are
2737 * used across protocols to minimize the space needed to pickle them.
2738 * Tuples are also the only builtin immutable type that can be recursive
2739 * (a tuple can be reached from itself), and that requires some subtle
2740 * magic so that it works in all cases. IOW, this is a long routine.
2741 */
2742static int
2743save_tuple(PicklerObject *self, PyObject *obj)
2744{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002745 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002746
2747 const char mark_op = MARK;
2748 const char tuple_op = TUPLE;
2749 const char pop_op = POP;
2750 const char pop_mark_op = POP_MARK;
2751 const char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
2752
2753 if ((len = PyTuple_Size(obj)) < 0)
2754 return -1;
2755
2756 if (len == 0) {
2757 char pdata[2];
2758
2759 if (self->proto) {
2760 pdata[0] = EMPTY_TUPLE;
2761 len = 1;
2762 }
2763 else {
2764 pdata[0] = MARK;
2765 pdata[1] = TUPLE;
2766 len = 2;
2767 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002768 if (_Pickler_Write(self, pdata, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002769 return -1;
2770 return 0;
2771 }
2772
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002773 /* The tuple isn't in the memo now. If it shows up there after
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002774 * saving the tuple elements, the tuple must be recursive, in
2775 * which case we'll pop everything we put on the stack, and fetch
2776 * its value from the memo.
2777 */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002778 if (len <= 3 && self->proto >= 2) {
2779 /* Use TUPLE{1,2,3} opcodes. */
2780 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002781 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002782
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002783 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002784 /* pop the len elements */
2785 for (i = 0; i < len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002786 if (_Pickler_Write(self, &pop_op, 1) < 0)
2787 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002788 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002789 if (memo_get(self, obj) < 0)
2790 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002791
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002792 return 0;
2793 }
2794 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002795 if (_Pickler_Write(self, len2opcode + len, 1) < 0)
2796 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002797 }
2798 goto memoize;
2799 }
2800
2801 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
2802 * Generate MARK e1 e2 ... TUPLE
2803 */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002804 if (_Pickler_Write(self, &mark_op, 1) < 0)
2805 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002806
2807 if (store_tuple_elements(self, obj, len) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002808 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002809
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002810 if (PyMemoTable_Get(self->memo, obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002811 /* pop the stack stuff we pushed */
2812 if (self->bin) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002813 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
2814 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002815 }
2816 else {
2817 /* Note that we pop one more than len, to remove
2818 * the MARK too.
2819 */
2820 for (i = 0; i <= len; i++)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002821 if (_Pickler_Write(self, &pop_op, 1) < 0)
2822 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002823 }
2824 /* fetch from memo */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002825 if (memo_get(self, obj) < 0)
2826 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002827
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002828 return 0;
2829 }
2830 else { /* Not recursive. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002831 if (_Pickler_Write(self, &tuple_op, 1) < 0)
2832 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002833 }
2834
2835 memoize:
2836 if (memo_put(self, obj) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002837 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002838
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002839 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002840}
2841
2842/* iter is an iterator giving items, and we batch up chunks of
2843 * MARK item item ... item APPENDS
2844 * opcode sequences. Calling code should have arranged to first create an
2845 * empty list, or list-like object, for the APPENDS to operate on.
2846 * Returns 0 on success, <0 on error.
2847 */
2848static int
2849batch_list(PicklerObject *self, PyObject *iter)
2850{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002851 PyObject *obj = NULL;
2852 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002853 int i, n;
2854
2855 const char mark_op = MARK;
2856 const char append_op = APPEND;
2857 const char appends_op = APPENDS;
2858
2859 assert(iter != NULL);
2860
2861 /* XXX: I think this function could be made faster by avoiding the
2862 iterator interface and fetching objects directly from list using
2863 PyList_GET_ITEM.
2864 */
2865
2866 if (self->proto == 0) {
2867 /* APPENDS isn't available; do one at a time. */
2868 for (;;) {
2869 obj = PyIter_Next(iter);
2870 if (obj == NULL) {
2871 if (PyErr_Occurred())
2872 return -1;
2873 break;
2874 }
2875 i = save(self, obj, 0);
2876 Py_DECREF(obj);
2877 if (i < 0)
2878 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002879 if (_Pickler_Write(self, &append_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002880 return -1;
2881 }
2882 return 0;
2883 }
2884
2885 /* proto > 0: write in batches of BATCHSIZE. */
2886 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002887 /* Get first item */
2888 firstitem = PyIter_Next(iter);
2889 if (firstitem == NULL) {
2890 if (PyErr_Occurred())
2891 goto error;
2892
2893 /* nothing more to add */
2894 break;
2895 }
2896
2897 /* Try to get a second item */
2898 obj = PyIter_Next(iter);
2899 if (obj == NULL) {
2900 if (PyErr_Occurred())
2901 goto error;
2902
2903 /* Only one item to write */
2904 if (save(self, firstitem, 0) < 0)
2905 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002906 if (_Pickler_Write(self, &append_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002907 goto error;
2908 Py_CLEAR(firstitem);
2909 break;
2910 }
2911
2912 /* More than one item to write */
2913
2914 /* Pump out MARK, items, APPENDS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002915 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002916 goto error;
2917
2918 if (save(self, firstitem, 0) < 0)
2919 goto error;
2920 Py_CLEAR(firstitem);
2921 n = 1;
2922
2923 /* Fetch and save up to BATCHSIZE items */
2924 while (obj) {
2925 if (save(self, obj, 0) < 0)
2926 goto error;
2927 Py_CLEAR(obj);
2928 n += 1;
2929
2930 if (n == BATCHSIZE)
2931 break;
2932
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002933 obj = PyIter_Next(iter);
2934 if (obj == NULL) {
2935 if (PyErr_Occurred())
2936 goto error;
2937 break;
2938 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002939 }
2940
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002941 if (_Pickler_Write(self, &appends_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002942 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002943
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002944 } while (n == BATCHSIZE);
2945 return 0;
2946
2947 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00002948 Py_XDECREF(firstitem);
2949 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00002950 return -1;
2951}
2952
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002953/* This is a variant of batch_list() above, specialized for lists (with no
2954 * support for list subclasses). Like batch_list(), we batch up chunks of
2955 * MARK item item ... item APPENDS
2956 * opcode sequences. Calling code should have arranged to first create an
2957 * empty list, or list-like object, for the APPENDS to operate on.
2958 * Returns 0 on success, -1 on error.
2959 *
2960 * This version is considerably faster than batch_list(), if less general.
2961 *
2962 * Note that this only works for protocols > 0.
2963 */
2964static int
2965batch_list_exact(PicklerObject *self, PyObject *obj)
2966{
2967 PyObject *item = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02002968 Py_ssize_t this_batch, total;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00002969
2970 const char append_op = APPEND;
2971 const char appends_op = APPENDS;
2972 const char mark_op = MARK;
2973
2974 assert(obj != NULL);
2975 assert(self->proto > 0);
2976 assert(PyList_CheckExact(obj));
2977
2978 if (PyList_GET_SIZE(obj) == 1) {
2979 item = PyList_GET_ITEM(obj, 0);
2980 if (save(self, item, 0) < 0)
2981 return -1;
2982 if (_Pickler_Write(self, &append_op, 1) < 0)
2983 return -1;
2984 return 0;
2985 }
2986
2987 /* Write in batches of BATCHSIZE. */
2988 total = 0;
2989 do {
2990 this_batch = 0;
2991 if (_Pickler_Write(self, &mark_op, 1) < 0)
2992 return -1;
2993 while (total < PyList_GET_SIZE(obj)) {
2994 item = PyList_GET_ITEM(obj, total);
2995 if (save(self, item, 0) < 0)
2996 return -1;
2997 total++;
2998 if (++this_batch == BATCHSIZE)
2999 break;
3000 }
3001 if (_Pickler_Write(self, &appends_op, 1) < 0)
3002 return -1;
3003
3004 } while (total < PyList_GET_SIZE(obj));
3005
3006 return 0;
3007}
3008
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003009static int
3010save_list(PicklerObject *self, PyObject *obj)
3011{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003012 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003013 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003014 int status = 0;
3015
3016 if (self->fast && !fast_save_enter(self, obj))
3017 goto error;
3018
3019 /* Create an empty list. */
3020 if (self->bin) {
3021 header[0] = EMPTY_LIST;
3022 len = 1;
3023 }
3024 else {
3025 header[0] = MARK;
3026 header[1] = LIST;
3027 len = 2;
3028 }
3029
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003030 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003031 goto error;
3032
3033 /* Get list length, and bow out early if empty. */
3034 if ((len = PyList_Size(obj)) < 0)
3035 goto error;
3036
3037 if (memo_put(self, obj) < 0)
3038 goto error;
3039
3040 if (len != 0) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003041 /* Materialize the list elements. */
3042 if (PyList_CheckExact(obj) && self->proto > 0) {
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003043 if (Py_EnterRecursiveCall(" while pickling an object"))
3044 goto error;
3045 status = batch_list_exact(self, obj);
3046 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003047 } else {
3048 PyObject *iter = PyObject_GetIter(obj);
3049 if (iter == NULL)
3050 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003051
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003052 if (Py_EnterRecursiveCall(" while pickling an object")) {
3053 Py_DECREF(iter);
3054 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003055 }
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003056 status = batch_list(self, iter);
3057 Py_LeaveRecursiveCall();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003058 Py_DECREF(iter);
3059 }
3060 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003061 if (0) {
3062 error:
3063 status = -1;
3064 }
3065
3066 if (self->fast && !fast_save_leave(self, obj))
3067 status = -1;
3068
3069 return status;
3070}
3071
3072/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
3073 * MARK key value ... key value SETITEMS
3074 * opcode sequences. Calling code should have arranged to first create an
3075 * empty dict, or dict-like object, for the SETITEMS to operate on.
3076 * Returns 0 on success, <0 on error.
3077 *
3078 * This is very much like batch_list(). The difference between saving
3079 * elements directly, and picking apart two-tuples, is so long-winded at
3080 * the C level, though, that attempts to combine these routines were too
3081 * ugly to bear.
3082 */
3083static int
3084batch_dict(PicklerObject *self, PyObject *iter)
3085{
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003086 PyObject *obj = NULL;
3087 PyObject *firstitem = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003088 int i, n;
3089
3090 const char mark_op = MARK;
3091 const char setitem_op = SETITEM;
3092 const char setitems_op = SETITEMS;
3093
3094 assert(iter != NULL);
3095
3096 if (self->proto == 0) {
3097 /* SETITEMS isn't available; do one at a time. */
3098 for (;;) {
3099 obj = PyIter_Next(iter);
3100 if (obj == NULL) {
3101 if (PyErr_Occurred())
3102 return -1;
3103 break;
3104 }
3105 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
3106 PyErr_SetString(PyExc_TypeError, "dict items "
3107 "iterator must return 2-tuples");
3108 return -1;
3109 }
3110 i = save(self, PyTuple_GET_ITEM(obj, 0), 0);
3111 if (i >= 0)
3112 i = save(self, PyTuple_GET_ITEM(obj, 1), 0);
3113 Py_DECREF(obj);
3114 if (i < 0)
3115 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003116 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003117 return -1;
3118 }
3119 return 0;
3120 }
3121
3122 /* proto > 0: write in batches of BATCHSIZE. */
3123 do {
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003124 /* Get first item */
3125 firstitem = PyIter_Next(iter);
3126 if (firstitem == NULL) {
3127 if (PyErr_Occurred())
3128 goto error;
3129
3130 /* nothing more to add */
3131 break;
3132 }
3133 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {
3134 PyErr_SetString(PyExc_TypeError, "dict items "
3135 "iterator must return 2-tuples");
3136 goto error;
3137 }
3138
3139 /* Try to get a second item */
3140 obj = PyIter_Next(iter);
3141 if (obj == NULL) {
3142 if (PyErr_Occurred())
3143 goto error;
3144
3145 /* Only one item to write */
3146 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
3147 goto error;
3148 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
3149 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003150 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003151 goto error;
3152 Py_CLEAR(firstitem);
3153 break;
3154 }
3155
3156 /* More than one item to write */
3157
3158 /* Pump out MARK, items, SETITEMS. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003159 if (_Pickler_Write(self, &mark_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003160 goto error;
3161
3162 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)
3163 goto error;
3164 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)
3165 goto error;
3166 Py_CLEAR(firstitem);
3167 n = 1;
3168
3169 /* Fetch and save up to BATCHSIZE items */
3170 while (obj) {
3171 if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) {
3172 PyErr_SetString(PyExc_TypeError, "dict items "
3173 "iterator must return 2-tuples");
3174 goto error;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003175 }
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003176 if (save(self, PyTuple_GET_ITEM(obj, 0), 0) < 0 ||
3177 save(self, PyTuple_GET_ITEM(obj, 1), 0) < 0)
3178 goto error;
3179 Py_CLEAR(obj);
3180 n += 1;
3181
3182 if (n == BATCHSIZE)
3183 break;
3184
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003185 obj = PyIter_Next(iter);
3186 if (obj == NULL) {
3187 if (PyErr_Occurred())
3188 goto error;
3189 break;
3190 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003191 }
3192
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003193 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003194 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003195
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003196 } while (n == BATCHSIZE);
3197 return 0;
3198
3199 error:
Amaury Forgeot d'Arcfb1a5eb2008-09-11 21:03:37 +00003200 Py_XDECREF(firstitem);
3201 Py_XDECREF(obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003202 return -1;
3203}
3204
Collin Winter5c9b02d2009-05-25 05:43:30 +00003205/* This is a variant of batch_dict() above that specializes for dicts, with no
3206 * support for dict subclasses. Like batch_dict(), we batch up chunks of
3207 * MARK key value ... key value SETITEMS
3208 * opcode sequences. Calling code should have arranged to first create an
3209 * empty dict, or dict-like object, for the SETITEMS to operate on.
3210 * Returns 0 on success, -1 on error.
3211 *
3212 * Note that this currently doesn't work for protocol 0.
3213 */
3214static int
3215batch_dict_exact(PicklerObject *self, PyObject *obj)
3216{
3217 PyObject *key = NULL, *value = NULL;
3218 int i;
3219 Py_ssize_t dict_size, ppos = 0;
3220
Alexandre Vassalottif70b1292009-05-25 18:00:52 +00003221 const char mark_op = MARK;
3222 const char setitem_op = SETITEM;
3223 const char setitems_op = SETITEMS;
Collin Winter5c9b02d2009-05-25 05:43:30 +00003224
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003225 assert(obj != NULL && PyDict_CheckExact(obj));
Collin Winter5c9b02d2009-05-25 05:43:30 +00003226 assert(self->proto > 0);
3227
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003228 dict_size = PyDict_GET_SIZE(obj);
Collin Winter5c9b02d2009-05-25 05:43:30 +00003229
3230 /* Special-case len(d) == 1 to save space. */
3231 if (dict_size == 1) {
3232 PyDict_Next(obj, &ppos, &key, &value);
3233 if (save(self, key, 0) < 0)
3234 return -1;
3235 if (save(self, value, 0) < 0)
3236 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003237 if (_Pickler_Write(self, &setitem_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00003238 return -1;
3239 return 0;
3240 }
3241
3242 /* Write in batches of BATCHSIZE. */
3243 do {
3244 i = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003245 if (_Pickler_Write(self, &mark_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00003246 return -1;
3247 while (PyDict_Next(obj, &ppos, &key, &value)) {
3248 if (save(self, key, 0) < 0)
3249 return -1;
3250 if (save(self, value, 0) < 0)
3251 return -1;
3252 if (++i == BATCHSIZE)
3253 break;
3254 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003255 if (_Pickler_Write(self, &setitems_op, 1) < 0)
Collin Winter5c9b02d2009-05-25 05:43:30 +00003256 return -1;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003257 if (PyDict_GET_SIZE(obj) != dict_size) {
Collin Winter5c9b02d2009-05-25 05:43:30 +00003258 PyErr_Format(
3259 PyExc_RuntimeError,
3260 "dictionary changed size during iteration");
3261 return -1;
3262 }
3263
3264 } while (i == BATCHSIZE);
3265 return 0;
3266}
3267
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003268static int
3269save_dict(PicklerObject *self, PyObject *obj)
3270{
3271 PyObject *items, *iter;
3272 char header[3];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003273 Py_ssize_t len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003274 int status = 0;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003275 assert(PyDict_Check(obj));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003276
3277 if (self->fast && !fast_save_enter(self, obj))
3278 goto error;
3279
3280 /* Create an empty dict. */
3281 if (self->bin) {
3282 header[0] = EMPTY_DICT;
3283 len = 1;
3284 }
3285 else {
3286 header[0] = MARK;
3287 header[1] = DICT;
3288 len = 2;
3289 }
3290
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003291 if (_Pickler_Write(self, header, len) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003292 goto error;
3293
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003294 if (memo_put(self, obj) < 0)
3295 goto error;
3296
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02003297 if (PyDict_GET_SIZE(obj)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003298 /* Save the dict items. */
Collin Winter5c9b02d2009-05-25 05:43:30 +00003299 if (PyDict_CheckExact(obj) && self->proto > 0) {
3300 /* We can take certain shortcuts if we know this is a dict and
3301 not a dict subclass. */
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003302 if (Py_EnterRecursiveCall(" while pickling an object"))
3303 goto error;
3304 status = batch_dict_exact(self, obj);
3305 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00003306 } else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02003307 _Py_IDENTIFIER(items);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02003308
Victor Stinnerad8c83a2016-09-05 17:53:15 -07003309 items = _PyObject_CallMethodId(obj, &PyId_items, NULL);
Collin Winter5c9b02d2009-05-25 05:43:30 +00003310 if (items == NULL)
3311 goto error;
3312 iter = PyObject_GetIter(items);
3313 Py_DECREF(items);
3314 if (iter == NULL)
3315 goto error;
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003316 if (Py_EnterRecursiveCall(" while pickling an object")) {
3317 Py_DECREF(iter);
3318 goto error;
3319 }
Collin Winter5c9b02d2009-05-25 05:43:30 +00003320 status = batch_dict(self, iter);
Antoine Pitroue6d4c5b2011-01-23 17:12:25 +00003321 Py_LeaveRecursiveCall();
Collin Winter5c9b02d2009-05-25 05:43:30 +00003322 Py_DECREF(iter);
3323 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003324 }
3325
3326 if (0) {
3327 error:
3328 status = -1;
3329 }
3330
3331 if (self->fast && !fast_save_leave(self, obj))
3332 status = -1;
3333
3334 return status;
3335}
3336
3337static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003338save_set(PicklerObject *self, PyObject *obj)
3339{
3340 PyObject *item;
3341 int i;
3342 Py_ssize_t set_size, ppos = 0;
3343 Py_hash_t hash;
3344
3345 const char empty_set_op = EMPTY_SET;
3346 const char mark_op = MARK;
3347 const char additems_op = ADDITEMS;
3348
3349 if (self->proto < 4) {
3350 PyObject *items;
3351 PyObject *reduce_value;
3352 int status;
3353
3354 items = PySequence_List(obj);
3355 if (items == NULL) {
3356 return -1;
3357 }
3358 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PySet_Type, items);
3359 Py_DECREF(items);
3360 if (reduce_value == NULL) {
3361 return -1;
3362 }
3363 /* save_reduce() will memoize the object automatically. */
3364 status = save_reduce(self, reduce_value, obj);
3365 Py_DECREF(reduce_value);
3366 return status;
3367 }
3368
3369 if (_Pickler_Write(self, &empty_set_op, 1) < 0)
3370 return -1;
3371
3372 if (memo_put(self, obj) < 0)
3373 return -1;
3374
3375 set_size = PySet_GET_SIZE(obj);
3376 if (set_size == 0)
3377 return 0; /* nothing to do */
3378
3379 /* Write in batches of BATCHSIZE. */
3380 do {
3381 i = 0;
3382 if (_Pickler_Write(self, &mark_op, 1) < 0)
3383 return -1;
3384 while (_PySet_NextEntry(obj, &ppos, &item, &hash)) {
3385 if (save(self, item, 0) < 0)
3386 return -1;
3387 if (++i == BATCHSIZE)
3388 break;
3389 }
3390 if (_Pickler_Write(self, &additems_op, 1) < 0)
3391 return -1;
3392 if (PySet_GET_SIZE(obj) != set_size) {
3393 PyErr_Format(
3394 PyExc_RuntimeError,
3395 "set changed size during iteration");
3396 return -1;
3397 }
3398 } while (i == BATCHSIZE);
3399
3400 return 0;
3401}
3402
3403static int
3404save_frozenset(PicklerObject *self, PyObject *obj)
3405{
3406 PyObject *iter;
3407
3408 const char mark_op = MARK;
3409 const char frozenset_op = FROZENSET;
3410
3411 if (self->fast && !fast_save_enter(self, obj))
3412 return -1;
3413
3414 if (self->proto < 4) {
3415 PyObject *items;
3416 PyObject *reduce_value;
3417 int status;
3418
3419 items = PySequence_List(obj);
3420 if (items == NULL) {
3421 return -1;
3422 }
3423 reduce_value = Py_BuildValue("(O(O))", (PyObject*)&PyFrozenSet_Type,
3424 items);
3425 Py_DECREF(items);
3426 if (reduce_value == NULL) {
3427 return -1;
3428 }
3429 /* save_reduce() will memoize the object automatically. */
3430 status = save_reduce(self, reduce_value, obj);
3431 Py_DECREF(reduce_value);
3432 return status;
3433 }
3434
3435 if (_Pickler_Write(self, &mark_op, 1) < 0)
3436 return -1;
3437
3438 iter = PyObject_GetIter(obj);
Christian Heimesb3d3ee42013-11-23 21:01:40 +01003439 if (iter == NULL) {
Christian Heimes74d8d632013-11-23 21:05:31 +01003440 return -1;
Christian Heimesb3d3ee42013-11-23 21:01:40 +01003441 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003442 for (;;) {
3443 PyObject *item;
3444
3445 item = PyIter_Next(iter);
3446 if (item == NULL) {
3447 if (PyErr_Occurred()) {
3448 Py_DECREF(iter);
3449 return -1;
3450 }
3451 break;
3452 }
3453 if (save(self, item, 0) < 0) {
3454 Py_DECREF(item);
3455 Py_DECREF(iter);
3456 return -1;
3457 }
3458 Py_DECREF(item);
3459 }
3460 Py_DECREF(iter);
3461
3462 /* If the object is already in the memo, this means it is
3463 recursive. In this case, throw away everything we put on the
3464 stack, and fetch the object back from the memo. */
3465 if (PyMemoTable_Get(self->memo, obj)) {
3466 const char pop_mark_op = POP_MARK;
3467
3468 if (_Pickler_Write(self, &pop_mark_op, 1) < 0)
3469 return -1;
3470 if (memo_get(self, obj) < 0)
3471 return -1;
3472 return 0;
3473 }
3474
3475 if (_Pickler_Write(self, &frozenset_op, 1) < 0)
3476 return -1;
3477 if (memo_put(self, obj) < 0)
3478 return -1;
3479
3480 return 0;
3481}
3482
3483static int
3484fix_imports(PyObject **module_name, PyObject **global_name)
3485{
3486 PyObject *key;
3487 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003488 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003489
3490 key = PyTuple_Pack(2, *module_name, *global_name);
3491 if (key == NULL)
3492 return -1;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003493 item = PyDict_GetItemWithError(st->name_mapping_3to2, key);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003494 Py_DECREF(key);
3495 if (item) {
3496 PyObject *fixed_module_name;
3497 PyObject *fixed_global_name;
3498
3499 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
3500 PyErr_Format(PyExc_RuntimeError,
3501 "_compat_pickle.REVERSE_NAME_MAPPING values "
3502 "should be 2-tuples, not %.200s",
3503 Py_TYPE(item)->tp_name);
3504 return -1;
3505 }
3506 fixed_module_name = PyTuple_GET_ITEM(item, 0);
3507 fixed_global_name = PyTuple_GET_ITEM(item, 1);
3508 if (!PyUnicode_Check(fixed_module_name) ||
3509 !PyUnicode_Check(fixed_global_name)) {
3510 PyErr_Format(PyExc_RuntimeError,
3511 "_compat_pickle.REVERSE_NAME_MAPPING values "
3512 "should be pairs of str, not (%.200s, %.200s)",
3513 Py_TYPE(fixed_module_name)->tp_name,
3514 Py_TYPE(fixed_global_name)->tp_name);
3515 return -1;
3516 }
3517
3518 Py_CLEAR(*module_name);
3519 Py_CLEAR(*global_name);
3520 Py_INCREF(fixed_module_name);
3521 Py_INCREF(fixed_global_name);
3522 *module_name = fixed_module_name;
3523 *global_name = fixed_global_name;
Serhiy Storchakabfe18242015-03-31 13:12:37 +03003524 return 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003525 }
3526 else if (PyErr_Occurred()) {
3527 return -1;
3528 }
3529
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003530 item = PyDict_GetItemWithError(st->import_mapping_3to2, *module_name);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003531 if (item) {
3532 if (!PyUnicode_Check(item)) {
3533 PyErr_Format(PyExc_RuntimeError,
3534 "_compat_pickle.REVERSE_IMPORT_MAPPING values "
3535 "should be strings, not %.200s",
3536 Py_TYPE(item)->tp_name);
3537 return -1;
3538 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003539 Py_INCREF(item);
Serhiy Storchaka48842712016-04-06 09:45:48 +03003540 Py_XSETREF(*module_name, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003541 }
3542 else if (PyErr_Occurred()) {
3543 return -1;
3544 }
3545
3546 return 0;
3547}
3548
3549static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003550save_global(PicklerObject *self, PyObject *obj, PyObject *name)
3551{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003552 PyObject *global_name = NULL;
3553 PyObject *module_name = NULL;
3554 PyObject *module = NULL;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003555 PyObject *parent = NULL;
3556 PyObject *dotted_path = NULL;
3557 PyObject *lastname = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003558 PyObject *cls;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003559 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003560 int status = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003561 _Py_IDENTIFIER(__name__);
3562 _Py_IDENTIFIER(__qualname__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003563
3564 const char global_op = GLOBAL;
3565
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003566 if (name) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003567 Py_INCREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003568 global_name = name;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003569 }
3570 else {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003571 if (_PyObject_LookupAttrId(obj, &PyId___qualname__, &global_name) < 0)
3572 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003573 if (global_name == NULL) {
3574 global_name = _PyObject_GetAttrId(obj, &PyId___name__);
3575 if (global_name == NULL)
3576 goto error;
3577 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003578 }
3579
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003580 dotted_path = get_dotted_path(module, global_name);
3581 if (dotted_path == NULL)
3582 goto error;
3583 module_name = whichmodule(obj, dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003584 if (module_name == NULL)
3585 goto error;
3586
3587 /* XXX: Change to use the import C API directly with level=0 to disallow
3588 relative imports.
3589
3590 XXX: PyImport_ImportModuleLevel could be used. However, this bypasses
3591 builtins.__import__. Therefore, _pickle, unlike pickle.py, will ignore
3592 custom import functions (IMHO, this would be a nice security
3593 feature). The import C API would need to be extended to support the
3594 extra parameters of __import__ to fix that. */
3595 module = PyImport_Import(module_name);
3596 if (module == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003597 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003598 "Can't pickle %R: import of module %R failed",
3599 obj, module_name);
3600 goto error;
3601 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003602 lastname = PyList_GET_ITEM(dotted_path, PyList_GET_SIZE(dotted_path)-1);
3603 Py_INCREF(lastname);
3604 cls = get_deep_attribute(module, dotted_path, &parent);
3605 Py_CLEAR(dotted_path);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003606 if (cls == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003607 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003608 "Can't pickle %R: attribute lookup %S on %S failed",
3609 obj, global_name, module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003610 goto error;
3611 }
3612 if (cls != obj) {
3613 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003614 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003615 "Can't pickle %R: it's not the same object as %S.%S",
3616 obj, module_name, global_name);
3617 goto error;
3618 }
3619 Py_DECREF(cls);
3620
3621 if (self->proto >= 2) {
3622 /* See whether this is in the extension registry, and if
3623 * so generate an EXT opcode.
3624 */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003625 PyObject *extension_key;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003626 PyObject *code_obj; /* extension code as Python object */
3627 long code; /* extension code as C value */
3628 char pdata[5];
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003629 Py_ssize_t n;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003630
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003631 extension_key = PyTuple_Pack(2, module_name, global_name);
3632 if (extension_key == NULL) {
3633 goto error;
3634 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003635 code_obj = PyDict_GetItemWithError(st->extension_registry,
3636 extension_key);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003637 Py_DECREF(extension_key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003638 /* The object is not registered in the extension registry.
3639 This is the most likely code path. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003640 if (code_obj == NULL) {
3641 if (PyErr_Occurred()) {
3642 goto error;
3643 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003644 goto gen_global;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08003645 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003646
3647 /* XXX: pickle.py doesn't check neither the type, nor the range
3648 of the value returned by the extension_registry. It should for
3649 consistency. */
3650
3651 /* Verify code_obj has the right type and value. */
3652 if (!PyLong_Check(code_obj)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003653 PyErr_Format(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003654 "Can't pickle %R: extension code %R isn't an integer",
3655 obj, code_obj);
3656 goto error;
3657 }
3658 code = PyLong_AS_LONG(code_obj);
3659 if (code <= 0 || code > 0x7fffffffL) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02003660 if (!PyErr_Occurred())
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003661 PyErr_Format(st->PicklingError, "Can't pickle %R: extension "
3662 "code %ld is out of range", obj, code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003663 goto error;
3664 }
3665
3666 /* Generate an EXT opcode. */
3667 if (code <= 0xff) {
3668 pdata[0] = EXT1;
3669 pdata[1] = (unsigned char)code;
3670 n = 2;
3671 }
3672 else if (code <= 0xffff) {
3673 pdata[0] = EXT2;
3674 pdata[1] = (unsigned char)(code & 0xff);
3675 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3676 n = 3;
3677 }
3678 else {
3679 pdata[0] = EXT4;
3680 pdata[1] = (unsigned char)(code & 0xff);
3681 pdata[2] = (unsigned char)((code >> 8) & 0xff);
3682 pdata[3] = (unsigned char)((code >> 16) & 0xff);
3683 pdata[4] = (unsigned char)((code >> 24) & 0xff);
3684 n = 5;
3685 }
3686
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003687 if (_Pickler_Write(self, pdata, n) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003688 goto error;
3689 }
3690 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003691 gen_global:
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003692 if (parent == module) {
3693 Py_INCREF(lastname);
3694 Py_DECREF(global_name);
3695 global_name = lastname;
3696 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003697 if (self->proto >= 4) {
3698 const char stack_global_op = STACK_GLOBAL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003699
Christian Heimese8b1ba12013-11-23 21:13:39 +01003700 if (save(self, module_name, 0) < 0)
3701 goto error;
3702 if (save(self, global_name, 0) < 0)
3703 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003704
3705 if (_Pickler_Write(self, &stack_global_op, 1) < 0)
3706 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003707 }
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003708 else if (parent != module) {
3709 PickleState *st = _Pickle_GetGlobalState();
3710 PyObject *reduce_value = Py_BuildValue("(O(OO))",
3711 st->getattr, parent, lastname);
Alexey Izbyshevf8c06b02018-08-22 07:51:25 +03003712 if (reduce_value == NULL)
3713 goto error;
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003714 status = save_reduce(self, reduce_value, NULL);
3715 Py_DECREF(reduce_value);
3716 if (status < 0)
3717 goto error;
3718 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003719 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003720 /* Generate a normal global opcode if we are using a pickle
3721 protocol < 4, or if the object is not registered in the
3722 extension registry. */
3723 PyObject *encoded;
3724 PyObject *(*unicode_encoder)(PyObject *);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003725
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003726 if (_Pickler_Write(self, &global_op, 1) < 0)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003727 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003728
3729 /* For protocol < 3 and if the user didn't request against doing
3730 so, we convert module names to the old 2.x module names. */
3731 if (self->proto < 3 && self->fix_imports) {
3732 if (fix_imports(&module_name, &global_name) < 0) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003733 goto error;
3734 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003735 }
3736
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003737 /* Since Python 3.0 now supports non-ASCII identifiers, we encode
3738 both the module name and the global name using UTF-8. We do so
3739 only when we are using the pickle protocol newer than version
3740 3. This is to ensure compatibility with older Unpickler running
3741 on Python 2.x. */
3742 if (self->proto == 3) {
3743 unicode_encoder = PyUnicode_AsUTF8String;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003744 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003745 else {
3746 unicode_encoder = PyUnicode_AsASCIIString;
3747 }
3748 encoded = unicode_encoder(module_name);
3749 if (encoded == NULL) {
3750 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003751 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003752 "can't pickle module identifier '%S' using "
3753 "pickle protocol %i",
3754 module_name, self->proto);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00003755 goto error;
3756 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003757 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3758 PyBytes_GET_SIZE(encoded)) < 0) {
3759 Py_DECREF(encoded);
3760 goto error;
3761 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003762 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003763 if(_Pickler_Write(self, "\n", 1) < 0)
3764 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003765
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003766 /* Save the name of the module. */
3767 encoded = unicode_encoder(global_name);
3768 if (encoded == NULL) {
3769 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError))
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003770 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003771 "can't pickle global identifier '%S' using "
3772 "pickle protocol %i",
3773 global_name, self->proto);
3774 goto error;
3775 }
3776 if (_Pickler_Write(self, PyBytes_AS_STRING(encoded),
3777 PyBytes_GET_SIZE(encoded)) < 0) {
3778 Py_DECREF(encoded);
3779 goto error;
3780 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003781 Py_DECREF(encoded);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003782 if (_Pickler_Write(self, "\n", 1) < 0)
3783 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003784 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003785 /* Memoize the object. */
3786 if (memo_put(self, obj) < 0)
3787 goto error;
3788 }
3789
3790 if (0) {
3791 error:
3792 status = -1;
3793 }
3794 Py_XDECREF(module_name);
3795 Py_XDECREF(global_name);
3796 Py_XDECREF(module);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03003797 Py_XDECREF(parent);
3798 Py_XDECREF(dotted_path);
3799 Py_XDECREF(lastname);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003800
3801 return status;
3802}
3803
3804static int
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003805save_singleton_type(PicklerObject *self, PyObject *obj, PyObject *singleton)
3806{
3807 PyObject *reduce_value;
3808 int status;
3809
3810 reduce_value = Py_BuildValue("O(O)", &PyType_Type, singleton);
3811 if (reduce_value == NULL) {
3812 return -1;
3813 }
3814 status = save_reduce(self, reduce_value, obj);
3815 Py_DECREF(reduce_value);
3816 return status;
3817}
3818
3819static int
3820save_type(PicklerObject *self, PyObject *obj)
3821{
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003822 if (obj == (PyObject *)&_PyNone_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003823 return save_singleton_type(self, obj, Py_None);
3824 }
3825 else if (obj == (PyObject *)&PyEllipsis_Type) {
3826 return save_singleton_type(self, obj, Py_Ellipsis);
3827 }
Alexandre Vassalotti65846c62013-11-30 17:55:48 -08003828 else if (obj == (PyObject *)&_PyNotImplemented_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08003829 return save_singleton_type(self, obj, Py_NotImplemented);
3830 }
3831 return save_global(self, obj, NULL);
3832}
3833
3834static int
Serhiy Storchaka986375e2017-11-30 22:48:31 +02003835save_pers(PicklerObject *self, PyObject *obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003836{
3837 PyObject *pid = NULL;
3838 int status = 0;
3839
3840 const char persid_op = PERSID;
3841 const char binpersid_op = BINPERSID;
3842
Serhiy Storchaka986375e2017-11-30 22:48:31 +02003843 pid = call_method(self->pers_func, self->pers_func_self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003844 if (pid == NULL)
3845 return -1;
3846
3847 if (pid != Py_None) {
3848 if (self->bin) {
3849 if (save(self, pid, 1) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003850 _Pickler_Write(self, &binpersid_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003851 goto error;
3852 }
3853 else {
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003854 PyObject *pid_str;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003855
3856 pid_str = PyObject_Str(pid);
3857 if (pid_str == NULL)
3858 goto error;
3859
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003860 /* XXX: Should it check whether the pid contains embedded
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003861 newlines? */
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003862 if (!PyUnicode_IS_ASCII(pid_str)) {
3863 PyErr_SetString(_Pickle_GetGlobalState()->PicklingError,
3864 "persistent IDs in protocol 0 must be "
3865 "ASCII strings");
3866 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003867 goto error;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003868 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003869
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00003870 if (_Pickler_Write(self, &persid_op, 1) < 0 ||
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003871 _Pickler_Write(self, PyUnicode_DATA(pid_str),
3872 PyUnicode_GET_LENGTH(pid_str)) < 0 ||
3873 _Pickler_Write(self, "\n", 1) < 0) {
3874 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003875 goto error;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03003876 }
3877 Py_DECREF(pid_str);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003878 }
3879 status = 1;
3880 }
3881
3882 if (0) {
3883 error:
3884 status = -1;
3885 }
3886 Py_XDECREF(pid);
3887
3888 return status;
3889}
3890
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003891static PyObject *
3892get_class(PyObject *obj)
3893{
3894 PyObject *cls;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003895 _Py_IDENTIFIER(__class__);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003896
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003897 if (_PyObject_LookupAttrId(obj, &PyId___class__, &cls) == 0) {
3898 cls = (PyObject *) Py_TYPE(obj);
3899 Py_INCREF(cls);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003900 }
3901 return cls;
3902}
3903
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003904/* We're saving obj, and args is the 2-thru-5 tuple returned by the
3905 * appropriate __reduce__ method for obj.
3906 */
3907static int
3908save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
3909{
3910 PyObject *callable;
3911 PyObject *argtup;
3912 PyObject *state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003913 PyObject *listitems = Py_None;
3914 PyObject *dictitems = Py_None;
Pierre Glaser65d98d02019-05-08 21:40:25 +02003915 PyObject *state_setter = Py_None;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003916 PickleState *st = _Pickle_GetGlobalState();
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003917 Py_ssize_t size;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003918 int use_newobj = 0, use_newobj_ex = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003919
3920 const char reduce_op = REDUCE;
3921 const char build_op = BUILD;
3922 const char newobj_op = NEWOBJ;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003923 const char newobj_ex_op = NEWOBJ_EX;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003924
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003925 size = PyTuple_Size(args);
Pierre Glaser65d98d02019-05-08 21:40:25 +02003926 if (size < 2 || size > 6) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003927 PyErr_SetString(st->PicklingError, "tuple returned by "
Pierre Glaser65d98d02019-05-08 21:40:25 +02003928 "__reduce__ must contain 2 through 6 elements");
Hirokazu Yamamotob46a6332008-11-04 00:35:10 +00003929 return -1;
3930 }
3931
Pierre Glaser65d98d02019-05-08 21:40:25 +02003932 if (!PyArg_UnpackTuple(args, "save_reduce", 2, 6,
3933 &callable, &argtup, &state, &listitems, &dictitems,
3934 &state_setter))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003935 return -1;
3936
3937 if (!PyCallable_Check(callable)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003938 PyErr_SetString(st->PicklingError, "first item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003939 "returned by __reduce__ must be callable");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003940 return -1;
3941 }
3942 if (!PyTuple_Check(argtup)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003943 PyErr_SetString(st->PicklingError, "second item of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003944 "returned by __reduce__ must be a tuple");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003945 return -1;
3946 }
3947
3948 if (state == Py_None)
3949 state = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003950
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003951 if (listitems == Py_None)
3952 listitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003953 else if (!PyIter_Check(listitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003954 PyErr_Format(st->PicklingError, "fourth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003955 "returned by __reduce__ must be an iterator, not %s",
3956 Py_TYPE(listitems)->tp_name);
3957 return -1;
3958 }
3959
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003960 if (dictitems == Py_None)
3961 dictitems = NULL;
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003962 else if (!PyIter_Check(dictitems)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08003963 PyErr_Format(st->PicklingError, "fifth element of the tuple "
Amaury Forgeot d'Arc424b4812008-10-30 22:25:31 +00003964 "returned by __reduce__ must be an iterator, not %s",
3965 Py_TYPE(dictitems)->tp_name);
3966 return -1;
3967 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003968
Pierre Glaser65d98d02019-05-08 21:40:25 +02003969 if (state_setter == Py_None)
3970 state_setter = NULL;
3971 else if (!PyCallable_Check(state_setter)) {
3972 PyErr_Format(st->PicklingError, "sixth element of the tuple "
3973 "returned by __reduce__ must be a function, not %s",
3974 Py_TYPE(state_setter)->tp_name);
3975 return -1;
3976 }
3977
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003978 if (self->proto >= 2) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01003979 PyObject *name;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003980 _Py_IDENTIFIER(__name__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003981
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003982 if (_PyObject_LookupAttrId(callable, &PyId___name__, &name) < 0) {
3983 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003984 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003985 if (name != NULL && PyUnicode_Check(name)) {
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03003986 _Py_IDENTIFIER(__newobj_ex__);
Serhiy Storchakaf0f35a62017-01-09 10:09:43 +02003987 use_newobj_ex = _PyUnicode_EqualToASCIIId(
3988 name, &PyId___newobj_ex__);
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003989 if (!use_newobj_ex) {
3990 _Py_IDENTIFIER(__newobj__);
Serhiy Storchaka9937d902017-01-09 10:04:34 +02003991 use_newobj = _PyUnicode_EqualToASCIIId(name, &PyId___newobj__);
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003992 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003993 }
Serhiy Storchaka707b5cc2014-12-16 19:43:46 +02003994 Py_XDECREF(name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00003995 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01003996
3997 if (use_newobj_ex) {
3998 PyObject *cls;
3999 PyObject *args;
4000 PyObject *kwargs;
4001
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004002 if (PyTuple_GET_SIZE(argtup) != 3) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004003 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004004 "length of the NEWOBJ_EX argument tuple must be "
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004005 "exactly 3, not %zd", PyTuple_GET_SIZE(argtup));
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004006 return -1;
4007 }
4008
4009 cls = PyTuple_GET_ITEM(argtup, 0);
4010 if (!PyType_Check(cls)) {
Larry Hastings61272b72014-01-07 12:41:53 -08004011 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004012 "first item from NEWOBJ_EX argument tuple must "
4013 "be a class, not %.200s", Py_TYPE(cls)->tp_name);
4014 return -1;
4015 }
4016 args = PyTuple_GET_ITEM(argtup, 1);
4017 if (!PyTuple_Check(args)) {
Larry Hastings61272b72014-01-07 12:41:53 -08004018 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004019 "second item from NEWOBJ_EX argument tuple must "
4020 "be a tuple, not %.200s", Py_TYPE(args)->tp_name);
4021 return -1;
4022 }
4023 kwargs = PyTuple_GET_ITEM(argtup, 2);
4024 if (!PyDict_Check(kwargs)) {
Larry Hastings61272b72014-01-07 12:41:53 -08004025 PyErr_Format(st->PicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004026 "third item from NEWOBJ_EX argument tuple must "
4027 "be a dict, not %.200s", Py_TYPE(kwargs)->tp_name);
4028 return -1;
4029 }
4030
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03004031 if (self->proto >= 4) {
4032 if (save(self, cls, 0) < 0 ||
4033 save(self, args, 0) < 0 ||
4034 save(self, kwargs, 0) < 0 ||
4035 _Pickler_Write(self, &newobj_ex_op, 1) < 0) {
4036 return -1;
4037 }
4038 }
4039 else {
4040 PyObject *newargs;
4041 PyObject *cls_new;
4042 Py_ssize_t i;
4043 _Py_IDENTIFIER(__new__);
4044
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004045 newargs = PyTuple_New(PyTuple_GET_SIZE(args) + 2);
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03004046 if (newargs == NULL)
4047 return -1;
4048
4049 cls_new = _PyObject_GetAttrId(cls, &PyId___new__);
4050 if (cls_new == NULL) {
4051 Py_DECREF(newargs);
4052 return -1;
4053 }
4054 PyTuple_SET_ITEM(newargs, 0, cls_new);
4055 Py_INCREF(cls);
4056 PyTuple_SET_ITEM(newargs, 1, cls);
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004057 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
Serhiy Storchaka0d554d72015-10-10 22:42:18 +03004058 PyObject *item = PyTuple_GET_ITEM(args, i);
4059 Py_INCREF(item);
4060 PyTuple_SET_ITEM(newargs, i + 2, item);
4061 }
4062
4063 callable = PyObject_Call(st->partial, newargs, kwargs);
4064 Py_DECREF(newargs);
4065 if (callable == NULL)
4066 return -1;
4067
4068 newargs = PyTuple_New(0);
4069 if (newargs == NULL) {
4070 Py_DECREF(callable);
4071 return -1;
4072 }
4073
4074 if (save(self, callable, 0) < 0 ||
4075 save(self, newargs, 0) < 0 ||
4076 _Pickler_Write(self, &reduce_op, 1) < 0) {
4077 Py_DECREF(newargs);
4078 Py_DECREF(callable);
4079 return -1;
4080 }
4081 Py_DECREF(newargs);
4082 Py_DECREF(callable);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004083 }
4084 }
4085 else if (use_newobj) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004086 PyObject *cls;
4087 PyObject *newargtup;
4088 PyObject *obj_class;
4089 int p;
4090
4091 /* Sanity checks. */
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004092 if (PyTuple_GET_SIZE(argtup) < 1) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004093 PyErr_SetString(st->PicklingError, "__newobj__ arglist is empty");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004094 return -1;
4095 }
4096
4097 cls = PyTuple_GET_ITEM(argtup, 0);
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01004098 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004099 PyErr_SetString(st->PicklingError, "args[0] from "
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01004100 "__newobj__ args is not a type");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004101 return -1;
4102 }
4103
4104 if (obj != NULL) {
Antoine Pitrou16c4ce12011-03-11 21:30:43 +01004105 obj_class = get_class(obj);
Zackery Spytz25d38972018-12-05 11:29:20 -07004106 if (obj_class == NULL) {
4107 return -1;
4108 }
4109 p = obj_class != cls;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004110 Py_DECREF(obj_class);
4111 if (p) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004112 PyErr_SetString(st->PicklingError, "args[0] from "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004113 "__newobj__ args has the wrong class");
4114 return -1;
4115 }
4116 }
4117 /* XXX: These calls save() are prone to infinite recursion. Imagine
4118 what happen if the value returned by the __reduce__() method of
4119 some extension type contains another object of the same type. Ouch!
4120
4121 Here is a quick example, that I ran into, to illustrate what I
4122 mean:
4123
4124 >>> import pickle, copyreg
4125 >>> copyreg.dispatch_table.pop(complex)
4126 >>> pickle.dumps(1+2j)
4127 Traceback (most recent call last):
4128 ...
Yury Selivanovf488fb42015-07-03 01:04:23 -04004129 RecursionError: maximum recursion depth exceeded
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004130
4131 Removing the complex class from copyreg.dispatch_table made the
4132 __reduce_ex__() method emit another complex object:
4133
4134 >>> (1+1j).__reduce_ex__(2)
4135 (<function __newobj__ at 0xb7b71c3c>,
4136 (<class 'complex'>, (1+1j)), None, None, None)
4137
4138 Thus when save() was called on newargstup (the 2nd item) recursion
4139 ensued. Of course, the bug was in the complex class which had a
4140 broken __getnewargs__() that emitted another complex object. But,
4141 the point, here, is it is quite easy to end up with a broken reduce
4142 function. */
4143
4144 /* Save the class and its __new__ arguments. */
4145 if (save(self, cls, 0) < 0)
4146 return -1;
4147
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004148 newargtup = PyTuple_GetSlice(argtup, 1, PyTuple_GET_SIZE(argtup));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004149 if (newargtup == NULL)
4150 return -1;
4151
4152 p = save(self, newargtup, 0);
4153 Py_DECREF(newargtup);
4154 if (p < 0)
4155 return -1;
4156
4157 /* Add NEWOBJ opcode. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004158 if (_Pickler_Write(self, &newobj_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004159 return -1;
4160 }
4161 else { /* Not using NEWOBJ. */
4162 if (save(self, callable, 0) < 0 ||
4163 save(self, argtup, 0) < 0 ||
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004164 _Pickler_Write(self, &reduce_op, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004165 return -1;
4166 }
4167
4168 /* obj can be NULL when save_reduce() is used directly. A NULL obj means
4169 the caller do not want to memoize the object. Not particularly useful,
4170 but that is to mimic the behavior save_reduce() in pickle.py when
4171 obj is None. */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004172 if (obj != NULL) {
4173 /* If the object is already in the memo, this means it is
4174 recursive. In this case, throw away everything we put on the
4175 stack, and fetch the object back from the memo. */
4176 if (PyMemoTable_Get(self->memo, obj)) {
4177 const char pop_op = POP;
4178
4179 if (_Pickler_Write(self, &pop_op, 1) < 0)
4180 return -1;
4181 if (memo_get(self, obj) < 0)
4182 return -1;
4183
4184 return 0;
4185 }
4186 else if (memo_put(self, obj) < 0)
4187 return -1;
4188 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004189
4190 if (listitems && batch_list(self, listitems) < 0)
4191 return -1;
4192
4193 if (dictitems && batch_dict(self, dictitems) < 0)
4194 return -1;
4195
4196 if (state) {
Pierre Glaser65d98d02019-05-08 21:40:25 +02004197 if (state_setter == NULL) {
4198 if (save(self, state, 0) < 0 ||
4199 _Pickler_Write(self, &build_op, 1) < 0)
4200 return -1;
4201 }
4202 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004203
Pierre Glaser65d98d02019-05-08 21:40:25 +02004204 /* If a state_setter is specified, call it instead of load_build to
4205 * update obj's with its previous state.
4206 * The first 4 save/write instructions push state_setter and its
4207 * tuple of expected arguments (obj, state) onto the stack. The
4208 * REDUCE opcode triggers the state_setter(obj, state) function
4209 * call. Finally, because state-updating routines only do in-place
4210 * modification, the whole operation has to be stack-transparent.
4211 * Thus, we finally pop the call's output from the stack.*/
4212
4213 const char tupletwo_op = TUPLE2;
4214 const char pop_op = POP;
4215 if (save(self, state_setter, 0) < 0 ||
4216 save(self, obj, 0) < 0 || save(self, state, 0) < 0 ||
4217 _Pickler_Write(self, &tupletwo_op, 1) < 0 ||
4218 _Pickler_Write(self, &reduce_op, 1) < 0 ||
4219 _Pickler_Write(self, &pop_op, 1) < 0)
4220 return -1;
4221 }
4222 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004223 return 0;
4224}
4225
4226static int
4227save(PicklerObject *self, PyObject *obj, int pers_save)
4228{
4229 PyTypeObject *type;
4230 PyObject *reduce_func = NULL;
4231 PyObject *reduce_value = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004232 int status = 0;
4233
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08004234 if (_Pickler_OpcodeBoundary(self) < 0)
4235 return -1;
4236
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004237 /* The extra pers_save argument is necessary to avoid calling save_pers()
4238 on its returned object. */
4239 if (!pers_save && self->pers_func) {
4240 /* save_pers() returns:
4241 -1 to signal an error;
4242 0 if it did nothing successfully;
4243 1 if a persistent id was saved.
4244 */
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004245 if ((status = save_pers(self, obj)) != 0)
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004246 return status;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004247 }
4248
4249 type = Py_TYPE(obj);
4250
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004251 /* The old cPickle had an optimization that used switch-case statement
4252 dispatching on the first letter of the type name. This has was removed
4253 since benchmarks shown that this optimization was actually slowing
4254 things down. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004255
4256 /* Atom types; these aren't memoized, so don't check the memo. */
4257
4258 if (obj == Py_None) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004259 return save_none(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004260 }
4261 else if (obj == Py_False || obj == Py_True) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004262 return save_bool(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004263 }
4264 else if (type == &PyLong_Type) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004265 return save_long(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004266 }
4267 else if (type == &PyFloat_Type) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004268 return save_float(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004269 }
4270
4271 /* Check the memo to see if it has the object. If so, generate
4272 a GET (or BINGET) opcode, instead of pickling the object
4273 once again. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004274 if (PyMemoTable_Get(self->memo, obj)) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004275 return memo_get(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004276 }
4277
4278 if (type == &PyBytes_Type) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004279 return save_bytes(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004280 }
4281 else if (type == &PyUnicode_Type) {
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004282 return save_unicode(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004283 }
Serhiy Storchaka5d4cb542018-07-18 10:10:49 +03004284
4285 /* We're only calling Py_EnterRecursiveCall here so that atomic
4286 types above are pickled faster. */
4287 if (Py_EnterRecursiveCall(" while pickling an object")) {
4288 return -1;
4289 }
4290
4291 if (type == &PyDict_Type) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004292 status = save_dict(self, obj);
4293 goto done;
4294 }
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004295 else if (type == &PySet_Type) {
4296 status = save_set(self, obj);
4297 goto done;
4298 }
4299 else if (type == &PyFrozenSet_Type) {
4300 status = save_frozenset(self, obj);
4301 goto done;
4302 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004303 else if (type == &PyList_Type) {
4304 status = save_list(self, obj);
4305 goto done;
4306 }
4307 else if (type == &PyTuple_Type) {
4308 status = save_tuple(self, obj);
4309 goto done;
4310 }
Antoine Pitrou91f43802019-05-26 17:10:09 +02004311 else if (type == &PyByteArray_Type) {
4312 status = save_bytearray(self, obj);
4313 goto done;
4314 }
4315 else if (type == &PyPickleBuffer_Type) {
4316 status = save_picklebuffer(self, obj);
4317 goto done;
4318 }
Pierre Glaser289f1f82019-05-08 23:08:25 +02004319
4320 /* Now, check reducer_override. If it returns NotImplemented,
4321 * fallback to save_type or save_global, and then perhaps to the
4322 * regular reduction mechanism.
4323 */
4324 if (self->reducer_override != NULL) {
4325 reduce_value = PyObject_CallFunctionObjArgs(self->reducer_override,
4326 obj, NULL);
4327 if (reduce_value == NULL) {
4328 goto error;
4329 }
4330 if (reduce_value != Py_NotImplemented) {
4331 goto reduce;
4332 }
4333 Py_DECREF(reduce_value);
4334 reduce_value = NULL;
4335 }
4336
4337 if (type == &PyType_Type) {
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08004338 status = save_type(self, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004339 goto done;
4340 }
4341 else if (type == &PyFunction_Type) {
4342 status = save_global(self, obj, NULL);
Alexandre Vassalottifc912852013-11-24 03:07:35 -08004343 goto done;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004344 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004345
4346 /* XXX: This part needs some unit tests. */
4347
4348 /* Get a reduction callable, and call it. This may come from
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004349 * self.dispatch_table, copyreg.dispatch_table, the object's
4350 * __reduce_ex__ method, or the object's __reduce__ method.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004351 */
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004352 if (self->dispatch_table == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004353 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08004354 reduce_func = PyDict_GetItemWithError(st->dispatch_table,
4355 (PyObject *)type);
4356 if (reduce_func == NULL) {
4357 if (PyErr_Occurred()) {
4358 goto error;
4359 }
4360 } else {
4361 /* PyDict_GetItemWithError() returns a borrowed reference.
4362 Increase the reference count to be consistent with
4363 PyObject_GetItem and _PyObject_GetAttrId used below. */
4364 Py_INCREF(reduce_func);
4365 }
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004366 } else {
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08004367 reduce_func = PyObject_GetItem(self->dispatch_table,
4368 (PyObject *)type);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004369 if (reduce_func == NULL) {
4370 if (PyErr_ExceptionMatches(PyExc_KeyError))
4371 PyErr_Clear();
4372 else
4373 goto error;
4374 }
4375 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004376 if (reduce_func != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004377 Py_INCREF(obj);
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08004378 reduce_value = _Pickle_FastCall(reduce_func, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004379 }
Antoine Pitrouffd41d92011-10-04 09:23:04 +02004380 else if (PyType_IsSubtype(type, &PyType_Type)) {
4381 status = save_global(self, obj, NULL);
4382 goto done;
4383 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004384 else {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004385 _Py_IDENTIFIER(__reduce__);
4386 _Py_IDENTIFIER(__reduce_ex__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004387
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004388 /* XXX: If the __reduce__ method is defined, __reduce_ex__ is
4389 automatically defined as __reduce__. While this is convenient, this
4390 make it impossible to know which method was actually called. Of
4391 course, this is not a big deal. But still, it would be nice to let
4392 the user know which method was called when something go
4393 wrong. Incidentally, this means if __reduce_ex__ is not defined, we
4394 don't actually have to check for a __reduce__ method. */
4395
4396 /* Check for a __reduce_ex__ method. */
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004397 if (_PyObject_LookupAttrId(obj, &PyId___reduce_ex__, &reduce_func) < 0) {
4398 goto error;
4399 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004400 if (reduce_func != NULL) {
4401 PyObject *proto;
4402 proto = PyLong_FromLong(self->proto);
4403 if (proto != NULL) {
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08004404 reduce_value = _Pickle_FastCall(reduce_func, proto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004405 }
4406 }
4407 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004408 /* Check for a __reduce__ method. */
Serhiy Storchaka353053d2019-09-01 14:01:05 +03004409 if (_PyObject_LookupAttrId(obj, &PyId___reduce__, &reduce_func) < 0) {
4410 goto error;
4411 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004412 if (reduce_func != NULL) {
Victor Stinner559bb6a2016-08-22 22:48:54 +02004413 reduce_value = _PyObject_CallNoArg(reduce_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004414 }
4415 else {
Serhiy Storchaka353053d2019-09-01 14:01:05 +03004416 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004417 PyErr_Format(st->PicklingError,
4418 "can't pickle '%.200s' object: %R",
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004419 type->tp_name, obj);
4420 goto error;
4421 }
4422 }
4423 }
4424
4425 if (reduce_value == NULL)
4426 goto error;
4427
Pierre Glaser289f1f82019-05-08 23:08:25 +02004428 reduce:
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004429 if (PyUnicode_Check(reduce_value)) {
4430 status = save_global(self, obj, reduce_value);
4431 goto done;
4432 }
4433
4434 if (!PyTuple_Check(reduce_value)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004435 PickleState *st = _Pickle_GetGlobalState();
4436 PyErr_SetString(st->PicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004437 "__reduce__ must return a string or tuple");
4438 goto error;
4439 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004440
4441 status = save_reduce(self, reduce_value, obj);
4442
4443 if (0) {
4444 error:
4445 status = -1;
4446 }
4447 done:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08004448
Alexandre Vassalottidff18342008-07-13 18:48:30 +00004449 Py_LeaveRecursiveCall();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004450 Py_XDECREF(reduce_func);
4451 Py_XDECREF(reduce_value);
4452
4453 return status;
4454}
4455
4456static int
4457dump(PicklerObject *self, PyObject *obj)
4458{
4459 const char stop_op = STOP;
Antoine Pitrou17236872020-02-02 21:22:57 +01004460 int status = -1;
Pierre Glaser289f1f82019-05-08 23:08:25 +02004461 PyObject *tmp;
4462 _Py_IDENTIFIER(reducer_override);
4463
4464 if (_PyObject_LookupAttrId((PyObject *)self, &PyId_reducer_override,
4465 &tmp) < 0) {
Antoine Pitrou17236872020-02-02 21:22:57 +01004466 goto error;
Pierre Glaser289f1f82019-05-08 23:08:25 +02004467 }
4468 /* Cache the reducer_override method, if it exists. */
4469 if (tmp != NULL) {
4470 Py_XSETREF(self->reducer_override, tmp);
4471 }
4472 else {
4473 Py_CLEAR(self->reducer_override);
4474 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004475
4476 if (self->proto >= 2) {
4477 char header[2];
4478
4479 header[0] = PROTO;
4480 assert(self->proto >= 0 && self->proto < 256);
4481 header[1] = (unsigned char)self->proto;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004482 if (_Pickler_Write(self, header, 2) < 0)
Antoine Pitrou17236872020-02-02 21:22:57 +01004483 goto error;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01004484 if (self->proto >= 4)
4485 self->framing = 1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004486 }
4487
4488 if (save(self, obj, 0) < 0 ||
Serhiy Storchakac8695292018-04-04 00:11:27 +03004489 _Pickler_Write(self, &stop_op, 1) < 0 ||
4490 _Pickler_CommitFrame(self) < 0)
Antoine Pitrou17236872020-02-02 21:22:57 +01004491 goto error;
4492
4493 // Success
4494 status = 0;
4495
4496 error:
Serhiy Storchakac8695292018-04-04 00:11:27 +03004497 self->framing = 0;
Antoine Pitrou17236872020-02-02 21:22:57 +01004498
4499 /* Break the reference cycle we generated at the beginning this function
4500 * call when setting the reducer_override attribute of the Pickler instance
4501 * to a bound method of the same instance. This is important as the Pickler
4502 * instance holds a reference to each object it has pickled (through its
4503 * memo): thus, these objects wont be garbage-collected as long as the
4504 * Pickler itself is not collected. */
4505 Py_CLEAR(self->reducer_override);
4506 return status;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004507}
4508
Larry Hastings61272b72014-01-07 12:41:53 -08004509/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004510
4511_pickle.Pickler.clear_memo
4512
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004513Clears the pickler's "memo".
4514
4515The memo is the data structure that remembers which objects the
4516pickler has already seen, so that shared or recursive objects are
4517pickled by reference and not by value. This method is useful when
4518re-using picklers.
Larry Hastings61272b72014-01-07 12:41:53 -08004519[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004520
Larry Hastings3cceb382014-01-04 11:09:09 -08004521static PyObject *
4522_pickle_Pickler_clear_memo_impl(PicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004523/*[clinic end generated code: output=8665c8658aaa094b input=01bdad52f3d93e56]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004524{
4525 if (self->memo)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004526 PyMemoTable_Clear(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004527
4528 Py_RETURN_NONE;
4529}
4530
Larry Hastings61272b72014-01-07 12:41:53 -08004531/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004532
4533_pickle.Pickler.dump
4534
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004535 obj: object
4536 /
4537
4538Write a pickled representation of the given object to the open file.
Larry Hastings61272b72014-01-07 12:41:53 -08004539[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004540
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004541static PyObject *
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004542_pickle_Pickler_dump(PicklerObject *self, PyObject *obj)
Larry Hastings581ee362014-01-28 05:00:08 -08004543/*[clinic end generated code: output=87ecad1261e02ac7 input=552eb1c0f52260d9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004544{
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00004545 /* Check whether the Pickler was initialized correctly (issue3664).
4546 Developers often forget to call __init__() in their subclasses, which
4547 would trigger a segfault without this check. */
4548 if (self->write == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004549 PickleState *st = _Pickle_GetGlobalState();
4550 PyErr_Format(st->PicklingError,
Amaury Forgeot d'Arc87eee632008-10-17 20:15:53 +00004551 "Pickler.__init__() was not called by %s.__init__()",
4552 Py_TYPE(self)->tp_name);
4553 return NULL;
4554 }
4555
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004556 if (_Pickler_ClearBuffer(self) < 0)
4557 return NULL;
4558
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004559 if (dump(self, obj) < 0)
4560 return NULL;
4561
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004562 if (_Pickler_FlushToFile(self) < 0)
4563 return NULL;
4564
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004565 Py_RETURN_NONE;
4566}
4567
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004568/*[clinic input]
4569
4570_pickle.Pickler.__sizeof__ -> Py_ssize_t
4571
4572Returns size in memory, in bytes.
4573[clinic start generated code]*/
4574
4575static Py_ssize_t
4576_pickle_Pickler___sizeof___impl(PicklerObject *self)
4577/*[clinic end generated code: output=106edb3123f332e1 input=8cbbec9bd5540d42]*/
4578{
4579 Py_ssize_t res, s;
4580
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02004581 res = _PyObject_SIZE(Py_TYPE(self));
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004582 if (self->memo != NULL) {
4583 res += sizeof(PyMemoTable);
4584 res += self->memo->mt_allocated * sizeof(PyMemoEntry);
4585 }
4586 if (self->output_buffer != NULL) {
4587 s = _PySys_GetSizeOf(self->output_buffer);
4588 if (s == -1)
4589 return -1;
4590 res += s;
4591 }
4592 return res;
4593}
4594
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004595static struct PyMethodDef Pickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004596 _PICKLE_PICKLER_DUMP_METHODDEF
4597 _PICKLE_PICKLER_CLEAR_MEMO_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02004598 _PICKLE_PICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004599 {NULL, NULL} /* sentinel */
4600};
4601
4602static void
4603Pickler_dealloc(PicklerObject *self)
4604{
4605 PyObject_GC_UnTrack(self);
4606
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004607 Py_XDECREF(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004608 Py_XDECREF(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004609 Py_XDECREF(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004610 Py_XDECREF(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004611 Py_XDECREF(self->fast_memo);
Pierre Glaser289f1f82019-05-08 23:08:25 +02004612 Py_XDECREF(self->reducer_override);
Antoine Pitrou91f43802019-05-26 17:10:09 +02004613 Py_XDECREF(self->buffer_callback);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004614
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004615 PyMemoTable_Del(self->memo);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004616
4617 Py_TYPE(self)->tp_free((PyObject *)self);
4618}
4619
4620static int
4621Pickler_traverse(PicklerObject *self, visitproc visit, void *arg)
4622{
4623 Py_VISIT(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004624 Py_VISIT(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004625 Py_VISIT(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004626 Py_VISIT(self->fast_memo);
Pierre Glaser289f1f82019-05-08 23:08:25 +02004627 Py_VISIT(self->reducer_override);
Antoine Pitrou91f43802019-05-26 17:10:09 +02004628 Py_VISIT(self->buffer_callback);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004629 return 0;
4630}
4631
4632static int
4633Pickler_clear(PicklerObject *self)
4634{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004635 Py_CLEAR(self->output_buffer);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004636 Py_CLEAR(self->write);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004637 Py_CLEAR(self->pers_func);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004638 Py_CLEAR(self->dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004639 Py_CLEAR(self->fast_memo);
Pierre Glaser289f1f82019-05-08 23:08:25 +02004640 Py_CLEAR(self->reducer_override);
Antoine Pitrou91f43802019-05-26 17:10:09 +02004641 Py_CLEAR(self->buffer_callback);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004642
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004643 if (self->memo != NULL) {
4644 PyMemoTable *memo = self->memo;
4645 self->memo = NULL;
4646 PyMemoTable_Del(memo);
4647 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004648 return 0;
4649}
4650
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004651
Larry Hastings61272b72014-01-07 12:41:53 -08004652/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004653
4654_pickle.Pickler.__init__
4655
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004656 file: object
Serhiy Storchakad322abb2019-09-14 13:31:50 +03004657 protocol: object = None
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004658 fix_imports: bool = True
Serhiy Storchakad322abb2019-09-14 13:31:50 +03004659 buffer_callback: object = None
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004660
4661This takes a binary file for writing a pickle data stream.
4662
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004663The optional *protocol* argument tells the pickler to use the given
Miss Islington (bot)a46728a2020-01-24 02:20:35 -08004664protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default
4665protocol is 4. It was introduced in Python 3.4, and is incompatible
4666with previous versions.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004667
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004668Specifying a negative protocol version selects the highest protocol
4669version supported. The higher the protocol used, the more recent the
4670version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004671
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004672The *file* argument must have a write() method that accepts a single
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004673bytes argument. It can thus be a file object opened for binary
Martin Panter7462b6492015-11-02 03:37:02 +00004674writing, an io.BytesIO instance, or any other custom object that meets
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004675this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004676
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08004677If *fix_imports* is True and protocol is less than 3, pickle will try
4678to map the new Python 3 names to the old module names used in Python
46792, so that the pickle data stream is readable with Python 2.
Antoine Pitrou91f43802019-05-26 17:10:09 +02004680
4681If *buffer_callback* is None (the default), buffer views are
4682serialized into *file* as part of the pickle stream.
4683
4684If *buffer_callback* is not None, then it can be called any number
4685of times with a buffer view. If the callback returns a false value
4686(such as None), the given buffer is out-of-band; otherwise the
4687buffer is serialized in-band, i.e. inside the pickle stream.
4688
4689It is an error if *buffer_callback* is not None and *protocol*
4690is None or smaller than 5.
4691
Larry Hastings61272b72014-01-07 12:41:53 -08004692[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004693
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004694static int
Larry Hastings89964c42015-04-14 18:07:59 -04004695_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file,
Antoine Pitrou91f43802019-05-26 17:10:09 +02004696 PyObject *protocol, int fix_imports,
4697 PyObject *buffer_callback)
Miss Islington (bot)a46728a2020-01-24 02:20:35 -08004698/*[clinic end generated code: output=0abedc50590d259b input=a7c969699bf5dad3]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004699{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02004700 _Py_IDENTIFIER(persistent_id);
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01004701 _Py_IDENTIFIER(dispatch_table);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004702
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004703 /* In case of multiple __init__() calls, clear previous content. */
4704 if (self->write != NULL)
4705 (void)Pickler_clear(self);
4706
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004707 if (_Pickler_SetProtocol(self, protocol, fix_imports) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004708 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004709
4710 if (_Pickler_SetOutputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004711 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004712
Antoine Pitrou91f43802019-05-26 17:10:09 +02004713 if (_Pickler_SetBufferCallback(self, buffer_callback) < 0)
4714 return -1;
4715
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004716 /* memo and output_buffer may have already been created in _Pickler_New */
4717 if (self->memo == NULL) {
4718 self->memo = PyMemoTable_New();
4719 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004720 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004721 }
4722 self->output_len = 0;
4723 if (self->output_buffer == NULL) {
4724 self->max_output_len = WRITE_BUF_SIZE;
4725 self->output_buffer = PyBytes_FromStringAndSize(NULL,
4726 self->max_output_len);
4727 if (self->output_buffer == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004728 return -1;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004729 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004730
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00004731 self->fast = 0;
4732 self->fast_nesting = 0;
4733 self->fast_memo = NULL;
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03004734
Serhiy Storchaka986375e2017-11-30 22:48:31 +02004735 if (init_method_ref((PyObject *)self, &PyId_persistent_id,
4736 &self->pers_func, &self->pers_func_self) < 0)
4737 {
4738 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004739 }
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03004740
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004741 if (_PyObject_LookupAttrId((PyObject *)self,
4742 &PyId_dispatch_table, &self->dispatch_table) < 0) {
4743 return -1;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004744 }
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08004745
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004746 return 0;
4747}
4748
Larry Hastingsb7ccb202014-01-18 23:50:21 -08004749
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004750/* Define a proxy object for the Pickler's internal memo object. This is to
4751 * avoid breaking code like:
4752 * pickler.memo.clear()
4753 * and
4754 * pickler.memo = saved_memo
4755 * Is this a good idea? Not really, but we don't want to break code that uses
4756 * it. Note that we don't implement the entire mapping API here. This is
4757 * intentional, as these should be treated as black-box implementation details.
4758 */
4759
Larry Hastings61272b72014-01-07 12:41:53 -08004760/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004761_pickle.PicklerMemoProxy.clear
4762
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004763Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08004764[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004765
Larry Hastings3cceb382014-01-04 11:09:09 -08004766static PyObject *
4767_pickle_PicklerMemoProxy_clear_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004768/*[clinic end generated code: output=5fb9370d48ae8b05 input=ccc186dacd0f1405]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004769{
4770 if (self->pickler->memo)
4771 PyMemoTable_Clear(self->pickler->memo);
4772 Py_RETURN_NONE;
4773}
4774
Larry Hastings61272b72014-01-07 12:41:53 -08004775/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004776_pickle.PicklerMemoProxy.copy
4777
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004778Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08004779[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004780
Larry Hastings3cceb382014-01-04 11:09:09 -08004781static PyObject *
4782_pickle_PicklerMemoProxy_copy_impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004783/*[clinic end generated code: output=bb83a919d29225ef input=b73043485ac30b36]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004784{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004785 PyMemoTable *memo;
4786 PyObject *new_memo = PyDict_New();
4787 if (new_memo == NULL)
4788 return NULL;
4789
4790 memo = self->pickler->memo;
Benjamin Petersona4ae8282018-09-20 18:36:40 -07004791 for (size_t i = 0; i < memo->mt_allocated; ++i) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004792 PyMemoEntry entry = memo->mt_table[i];
4793 if (entry.me_key != NULL) {
4794 int status;
4795 PyObject *key, *value;
4796
4797 key = PyLong_FromVoidPtr(entry.me_key);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004798 value = Py_BuildValue("nO", entry.me_value, entry.me_key);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004799
4800 if (key == NULL || value == NULL) {
4801 Py_XDECREF(key);
4802 Py_XDECREF(value);
4803 goto error;
4804 }
4805 status = PyDict_SetItem(new_memo, key, value);
4806 Py_DECREF(key);
4807 Py_DECREF(value);
4808 if (status < 0)
4809 goto error;
4810 }
4811 }
4812 return new_memo;
4813
4814 error:
4815 Py_XDECREF(new_memo);
4816 return NULL;
4817}
4818
Larry Hastings61272b72014-01-07 12:41:53 -08004819/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004820_pickle.PicklerMemoProxy.__reduce__
4821
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004822Implement pickle support.
Larry Hastings61272b72014-01-07 12:41:53 -08004823[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004824
Larry Hastings3cceb382014-01-04 11:09:09 -08004825static PyObject *
4826_pickle_PicklerMemoProxy___reduce___impl(PicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08004827/*[clinic end generated code: output=bebba1168863ab1d input=2f7c540e24b7aae4]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004828{
4829 PyObject *reduce_value, *dict_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08004830 PyObject *contents = _pickle_PicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004831 if (contents == NULL)
4832 return NULL;
4833
4834 reduce_value = PyTuple_New(2);
4835 if (reduce_value == NULL) {
4836 Py_DECREF(contents);
4837 return NULL;
4838 }
4839 dict_args = PyTuple_New(1);
4840 if (dict_args == NULL) {
4841 Py_DECREF(contents);
4842 Py_DECREF(reduce_value);
4843 return NULL;
4844 }
4845 PyTuple_SET_ITEM(dict_args, 0, contents);
4846 Py_INCREF((PyObject *)&PyDict_Type);
4847 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
4848 PyTuple_SET_ITEM(reduce_value, 1, dict_args);
4849 return reduce_value;
4850}
4851
4852static PyMethodDef picklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08004853 _PICKLE_PICKLERMEMOPROXY_CLEAR_METHODDEF
4854 _PICKLE_PICKLERMEMOPROXY_COPY_METHODDEF
4855 _PICKLE_PICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004856 {NULL, NULL} /* sentinel */
4857};
4858
4859static void
4860PicklerMemoProxy_dealloc(PicklerMemoProxyObject *self)
4861{
4862 PyObject_GC_UnTrack(self);
4863 Py_XDECREF(self->pickler);
4864 PyObject_GC_Del((PyObject *)self);
4865}
4866
4867static int
4868PicklerMemoProxy_traverse(PicklerMemoProxyObject *self,
4869 visitproc visit, void *arg)
4870{
4871 Py_VISIT(self->pickler);
4872 return 0;
4873}
4874
4875static int
4876PicklerMemoProxy_clear(PicklerMemoProxyObject *self)
4877{
4878 Py_CLEAR(self->pickler);
4879 return 0;
4880}
4881
4882static PyTypeObject PicklerMemoProxyType = {
4883 PyVarObject_HEAD_INIT(NULL, 0)
4884 "_pickle.PicklerMemoProxy", /*tp_name*/
4885 sizeof(PicklerMemoProxyObject), /*tp_basicsize*/
4886 0,
4887 (destructor)PicklerMemoProxy_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02004888 0, /* tp_vectorcall_offset */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004889 0, /* tp_getattr */
4890 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02004891 0, /* tp_as_async */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004892 0, /* tp_repr */
4893 0, /* tp_as_number */
4894 0, /* tp_as_sequence */
4895 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00004896 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004897 0, /* tp_call */
4898 0, /* tp_str */
4899 PyObject_GenericGetAttr, /* tp_getattro */
4900 PyObject_GenericSetAttr, /* tp_setattro */
4901 0, /* tp_as_buffer */
4902 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4903 0, /* tp_doc */
4904 (traverseproc)PicklerMemoProxy_traverse, /* tp_traverse */
4905 (inquiry)PicklerMemoProxy_clear, /* tp_clear */
4906 0, /* tp_richcompare */
4907 0, /* tp_weaklistoffset */
4908 0, /* tp_iter */
4909 0, /* tp_iternext */
4910 picklerproxy_methods, /* tp_methods */
4911};
4912
4913static PyObject *
4914PicklerMemoProxy_New(PicklerObject *pickler)
4915{
4916 PicklerMemoProxyObject *self;
4917
4918 self = PyObject_GC_New(PicklerMemoProxyObject, &PicklerMemoProxyType);
4919 if (self == NULL)
4920 return NULL;
4921 Py_INCREF(pickler);
4922 self->pickler = pickler;
4923 PyObject_GC_Track(self);
4924 return (PyObject *)self;
4925}
4926
4927/*****************************************************************************/
4928
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004929static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02004930Pickler_get_memo(PicklerObject *self, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004931{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004932 return PicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004933}
4934
4935static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02004936Pickler_set_memo(PicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004937{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004938 PyMemoTable *new_memo = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004939
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004940 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004941 PyErr_SetString(PyExc_TypeError,
4942 "attribute deletion is not supported");
4943 return -1;
4944 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004945
4946 if (Py_TYPE(obj) == &PicklerMemoProxyType) {
4947 PicklerObject *pickler =
4948 ((PicklerMemoProxyObject *)obj)->pickler;
4949
4950 new_memo = PyMemoTable_Copy(pickler->memo);
4951 if (new_memo == NULL)
4952 return -1;
4953 }
4954 else if (PyDict_Check(obj)) {
4955 Py_ssize_t i = 0;
4956 PyObject *key, *value;
4957
4958 new_memo = PyMemoTable_New();
4959 if (new_memo == NULL)
4960 return -1;
4961
4962 while (PyDict_Next(obj, &i, &key, &value)) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004963 Py_ssize_t memo_id;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004964 PyObject *memo_obj;
4965
Serhiy Storchakafff9a312017-03-21 08:53:25 +02004966 if (!PyTuple_Check(value) || PyTuple_GET_SIZE(value) != 2) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004967 PyErr_SetString(PyExc_TypeError,
4968 "'memo' values must be 2-item tuples");
4969 goto error;
4970 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02004971 memo_id = PyLong_AsSsize_t(PyTuple_GET_ITEM(value, 0));
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004972 if (memo_id == -1 && PyErr_Occurred())
4973 goto error;
4974 memo_obj = PyTuple_GET_ITEM(value, 1);
4975 if (PyMemoTable_Set(new_memo, memo_obj, memo_id) < 0)
4976 goto error;
4977 }
4978 }
4979 else {
4980 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02004981 "'memo' attribute must be a PicklerMemoProxy object "
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004982 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004983 return -1;
4984 }
4985
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004986 PyMemoTable_Del(self->memo);
4987 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004988
4989 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00004990
4991 error:
4992 if (new_memo)
4993 PyMemoTable_Del(new_memo);
4994 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004995}
4996
4997static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02004998Pickler_get_persid(PicklerObject *self, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00004999{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02005000 if (self->pers_func == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005001 PyErr_SetString(PyExc_AttributeError, "persistent_id");
Serhiy Storchaka986375e2017-11-30 22:48:31 +02005002 return NULL;
5003 }
5004 return reconstruct_method(self->pers_func, self->pers_func_self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005005}
5006
5007static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02005008Pickler_set_persid(PicklerObject *self, PyObject *value, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005009{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005010 if (value == NULL) {
5011 PyErr_SetString(PyExc_TypeError,
5012 "attribute deletion is not supported");
5013 return -1;
5014 }
5015 if (!PyCallable_Check(value)) {
5016 PyErr_SetString(PyExc_TypeError,
5017 "persistent_id must be a callable taking one argument");
5018 return -1;
5019 }
5020
Serhiy Storchaka986375e2017-11-30 22:48:31 +02005021 self->pers_func_self = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005022 Py_INCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +03005023 Py_XSETREF(self->pers_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005024
5025 return 0;
5026}
5027
5028static PyMemberDef Pickler_members[] = {
5029 {"bin", T_INT, offsetof(PicklerObject, bin)},
5030 {"fast", T_INT, offsetof(PicklerObject, fast)},
Antoine Pitrou8d3c2902012-03-04 18:31:48 +01005031 {"dispatch_table", T_OBJECT_EX, offsetof(PicklerObject, dispatch_table)},
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005032 {NULL}
5033};
5034
5035static PyGetSetDef Pickler_getsets[] = {
5036 {"memo", (getter)Pickler_get_memo,
5037 (setter)Pickler_set_memo},
5038 {"persistent_id", (getter)Pickler_get_persid,
5039 (setter)Pickler_set_persid},
5040 {NULL}
5041};
5042
5043static PyTypeObject Pickler_Type = {
5044 PyVarObject_HEAD_INIT(NULL, 0)
5045 "_pickle.Pickler" , /*tp_name*/
5046 sizeof(PicklerObject), /*tp_basicsize*/
5047 0, /*tp_itemsize*/
5048 (destructor)Pickler_dealloc, /*tp_dealloc*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005049 0, /*tp_vectorcall_offset*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005050 0, /*tp_getattr*/
5051 0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005052 0, /*tp_as_async*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005053 0, /*tp_repr*/
5054 0, /*tp_as_number*/
5055 0, /*tp_as_sequence*/
5056 0, /*tp_as_mapping*/
5057 0, /*tp_hash*/
5058 0, /*tp_call*/
5059 0, /*tp_str*/
5060 0, /*tp_getattro*/
5061 0, /*tp_setattro*/
5062 0, /*tp_as_buffer*/
5063 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08005064 _pickle_Pickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005065 (traverseproc)Pickler_traverse, /*tp_traverse*/
5066 (inquiry)Pickler_clear, /*tp_clear*/
5067 0, /*tp_richcompare*/
5068 0, /*tp_weaklistoffset*/
5069 0, /*tp_iter*/
5070 0, /*tp_iternext*/
5071 Pickler_methods, /*tp_methods*/
5072 Pickler_members, /*tp_members*/
5073 Pickler_getsets, /*tp_getset*/
5074 0, /*tp_base*/
5075 0, /*tp_dict*/
5076 0, /*tp_descr_get*/
5077 0, /*tp_descr_set*/
5078 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08005079 _pickle_Pickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005080 PyType_GenericAlloc, /*tp_alloc*/
5081 PyType_GenericNew, /*tp_new*/
5082 PyObject_GC_Del, /*tp_free*/
5083 0, /*tp_is_gc*/
5084};
5085
Victor Stinner121aab42011-09-29 23:40:53 +02005086/* Temporary helper for calling self.find_class().
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005087
5088 XXX: It would be nice to able to avoid Python function call overhead, by
5089 using directly the C version of find_class(), when find_class() is not
5090 overridden by a subclass. Although, this could become rather hackish. A
5091 simpler optimization would be to call the C function when self is not a
5092 subclass instance. */
5093static PyObject *
5094find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name)
5095{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005096 _Py_IDENTIFIER(find_class);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005097
Victor Stinner55ba38a2016-12-09 16:09:30 +01005098 return _PyObject_CallMethodIdObjArgs((PyObject *)self, &PyId_find_class,
5099 module_name, global_name, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005100}
5101
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005102static Py_ssize_t
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005103marker(UnpicklerObject *self)
5104{
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005105 Py_ssize_t mark;
5106
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005107 if (self->num_marks < 1) {
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005108 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005109 PyErr_SetString(st->UnpicklingError, "could not find MARK");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005110 return -1;
5111 }
5112
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005113 mark = self->marks[--self->num_marks];
5114 self->stack->mark_set = self->num_marks != 0;
5115 self->stack->fence = self->num_marks ?
5116 self->marks[self->num_marks - 1] : 0;
5117 return mark;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005118}
5119
5120static int
5121load_none(UnpicklerObject *self)
5122{
5123 PDATA_APPEND(self->stack, Py_None, -1);
5124 return 0;
5125}
5126
5127static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005128load_int(UnpicklerObject *self)
5129{
5130 PyObject *value;
5131 char *endptr, *s;
5132 Py_ssize_t len;
5133 long x;
5134
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005135 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005136 return -1;
5137 if (len < 2)
5138 return bad_readline();
5139
5140 errno = 0;
Victor Stinner121aab42011-09-29 23:40:53 +02005141 /* XXX: Should the base argument of strtol() be explicitly set to 10?
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005142 XXX(avassalotti): Should this uses PyOS_strtol()? */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005143 x = strtol(s, &endptr, 0);
5144
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005145 if (errno || (*endptr != '\n' && *endptr != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005146 /* Hm, maybe we've got something long. Let's try reading
Serhiy Storchaka95949422013-08-27 19:40:23 +03005147 * it as a Python int object. */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005148 errno = 0;
5149 /* XXX: Same thing about the base here. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005150 value = PyLong_FromString(s, NULL, 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005151 if (value == NULL) {
5152 PyErr_SetString(PyExc_ValueError,
5153 "could not convert string to int");
5154 return -1;
5155 }
5156 }
5157 else {
5158 if (len == 3 && (x == 0 || x == 1)) {
5159 if ((value = PyBool_FromLong(x)) == NULL)
5160 return -1;
5161 }
5162 else {
5163 if ((value = PyLong_FromLong(x)) == NULL)
5164 return -1;
5165 }
5166 }
5167
5168 PDATA_PUSH(self->stack, value, -1);
5169 return 0;
5170}
5171
5172static int
5173load_bool(UnpicklerObject *self, PyObject *boolean)
5174{
5175 assert(boolean == Py_True || boolean == Py_False);
5176 PDATA_APPEND(self->stack, boolean, -1);
5177 return 0;
5178}
5179
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005180/* s contains x bytes of an unsigned little-endian integer. Return its value
5181 * as a C Py_ssize_t, or -1 if it's higher than PY_SSIZE_T_MAX.
5182 */
5183static Py_ssize_t
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005184calc_binsize(char *bytes, int nbytes)
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005185{
5186 unsigned char *s = (unsigned char *)bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005187 int i;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005188 size_t x = 0;
5189
Serhiy Storchakae0606192015-09-29 22:10:07 +03005190 if (nbytes > (int)sizeof(size_t)) {
5191 /* Check for integer overflow. BINBYTES8 and BINUNICODE8 opcodes
5192 * have 64-bit size that can't be represented on 32-bit platform.
5193 */
5194 for (i = (int)sizeof(size_t); i < nbytes; i++) {
5195 if (s[i])
5196 return -1;
5197 }
5198 nbytes = (int)sizeof(size_t);
5199 }
5200 for (i = 0; i < nbytes; i++) {
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005201 x |= (size_t) s[i] << (8 * i);
5202 }
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005203
5204 if (x > PY_SSIZE_T_MAX)
5205 return -1;
5206 else
5207 return (Py_ssize_t) x;
5208}
5209
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005210/* s contains x bytes of a little-endian integer. Return its value as a
5211 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03005212 * int, but when x is 4 it's a signed one. This is a historical source
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005213 * of x-platform bugs.
5214 */
5215static long
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005216calc_binint(char *bytes, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005217{
5218 unsigned char *s = (unsigned char *)bytes;
Victor Stinnerf13c46c2014-08-17 21:05:55 +02005219 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005220 long x = 0;
5221
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005222 for (i = 0; i < nbytes; i++) {
5223 x |= (long)s[i] << (8 * i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005224 }
5225
5226 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
5227 * is signed, so on a box with longs bigger than 4 bytes we need
5228 * to extend a BININT's sign bit to the full width.
5229 */
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005230 if (SIZEOF_LONG > 4 && nbytes == 4) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005231 x |= -(x & (1L << 31));
5232 }
5233
5234 return x;
5235}
5236
5237static int
5238load_binintx(UnpicklerObject *self, char *s, int size)
5239{
5240 PyObject *value;
5241 long x;
5242
5243 x = calc_binint(s, size);
5244
5245 if ((value = PyLong_FromLong(x)) == NULL)
5246 return -1;
5247
5248 PDATA_PUSH(self->stack, value, -1);
5249 return 0;
5250}
5251
5252static int
5253load_binint(UnpicklerObject *self)
5254{
5255 char *s;
5256
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005257 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005258 return -1;
5259
5260 return load_binintx(self, s, 4);
5261}
5262
5263static int
5264load_binint1(UnpicklerObject *self)
5265{
5266 char *s;
5267
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005268 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005269 return -1;
5270
5271 return load_binintx(self, s, 1);
5272}
5273
5274static int
5275load_binint2(UnpicklerObject *self)
5276{
5277 char *s;
5278
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005279 if (_Unpickler_Read(self, &s, 2) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005280 return -1;
5281
5282 return load_binintx(self, s, 2);
5283}
5284
5285static int
5286load_long(UnpicklerObject *self)
5287{
5288 PyObject *value;
Victor Stinnerb110dad2016-12-09 17:06:43 +01005289 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005290 Py_ssize_t len;
5291
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005292 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005293 return -1;
5294 if (len < 2)
5295 return bad_readline();
5296
Mark Dickinson8dd05142009-01-20 20:43:58 +00005297 /* s[len-2] will usually be 'L' (and s[len-1] is '\n'); we need to remove
5298 the 'L' before calling PyLong_FromString. In order to maintain
5299 compatibility with Python 3.0.0, we don't actually *require*
5300 the 'L' to be present. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005301 if (s[len-2] == 'L')
Alexandre Vassalotti446f7ff2009-01-23 04:43:46 +00005302 s[len-2] = '\0';
Alexandre Vassalottie4bccb72009-01-24 01:47:57 +00005303 /* XXX: Should the base argument explicitly set to 10? */
5304 value = PyLong_FromString(s, NULL, 0);
Mark Dickinson8dd05142009-01-20 20:43:58 +00005305 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005306 return -1;
5307
5308 PDATA_PUSH(self->stack, value, -1);
5309 return 0;
5310}
5311
5312/* 'size' bytes contain the # of bytes of little-endian 256's-complement
5313 * data following.
5314 */
5315static int
5316load_counted_long(UnpicklerObject *self, int size)
5317{
5318 PyObject *value;
5319 char *nbytes;
5320 char *pdata;
5321
5322 assert(size == 1 || size == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005323 if (_Unpickler_Read(self, &nbytes, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005324 return -1;
5325
5326 size = calc_binint(nbytes, size);
5327 if (size < 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005328 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005329 /* Corrupt or hostile pickle -- we never write one like this */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005330 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005331 "LONG pickle has negative byte count");
5332 return -1;
5333 }
5334
5335 if (size == 0)
5336 value = PyLong_FromLong(0L);
5337 else {
5338 /* Read the raw little-endian bytes and convert. */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005339 if (_Unpickler_Read(self, &pdata, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005340 return -1;
5341 value = _PyLong_FromByteArray((unsigned char *)pdata, (size_t)size,
5342 1 /* little endian */ , 1 /* signed */ );
5343 }
5344 if (value == NULL)
5345 return -1;
5346 PDATA_PUSH(self->stack, value, -1);
5347 return 0;
5348}
5349
5350static int
5351load_float(UnpicklerObject *self)
5352{
5353 PyObject *value;
5354 char *endptr, *s;
5355 Py_ssize_t len;
5356 double d;
5357
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005358 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005359 return -1;
5360 if (len < 2)
5361 return bad_readline();
5362
5363 errno = 0;
Mark Dickinson725bfd82009-05-03 20:33:40 +00005364 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);
5365 if (d == -1.0 && PyErr_Occurred())
5366 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005367 if ((endptr[0] != '\n') && (endptr[0] != '\0')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005368 PyErr_SetString(PyExc_ValueError, "could not convert string to float");
5369 return -1;
5370 }
Mark Dickinson725bfd82009-05-03 20:33:40 +00005371 value = PyFloat_FromDouble(d);
5372 if (value == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005373 return -1;
5374
5375 PDATA_PUSH(self->stack, value, -1);
5376 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005377}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005378
5379static int
5380load_binfloat(UnpicklerObject *self)
5381{
5382 PyObject *value;
5383 double x;
5384 char *s;
5385
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005386 if (_Unpickler_Read(self, &s, 8) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005387 return -1;
5388
5389 x = _PyFloat_Unpack8((unsigned char *)s, 0);
5390 if (x == -1.0 && PyErr_Occurred())
5391 return -1;
5392
5393 if ((value = PyFloat_FromDouble(x)) == NULL)
5394 return -1;
5395
5396 PDATA_PUSH(self->stack, value, -1);
5397 return 0;
5398}
5399
5400static int
5401load_string(UnpicklerObject *self)
5402{
5403 PyObject *bytes;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08005404 PyObject *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005405 Py_ssize_t len;
5406 char *s, *p;
5407
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005408 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005409 return -1;
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005410 /* Strip the newline */
5411 len--;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005412 /* Strip outermost quotes */
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005413 if (len >= 2 && s[0] == s[len - 1] && (s[0] == '\'' || s[0] == '"')) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005414 p = s + 1;
5415 len -= 2;
5416 }
5417 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005418 PickleState *st = _Pickle_GetGlobalState();
5419 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005420 "the STRING opcode argument must be quoted");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005421 return -1;
5422 }
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07005423 assert(len >= 0);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005424
5425 /* Use the PyBytes API to decode the string, since that is what is used
5426 to encode, and then coerce the result to Unicode. */
5427 bytes = PyBytes_DecodeEscape(p, len, NULL, 0, NULL);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005428 if (bytes == NULL)
5429 return -1;
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08005430
5431 /* Leave the Python 2.x strings as bytes if the *encoding* given to the
5432 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
5433 if (strcmp(self->encoding, "bytes") == 0) {
5434 obj = bytes;
5435 }
5436 else {
5437 obj = PyUnicode_FromEncodedObject(bytes, self->encoding, self->errors);
5438 Py_DECREF(bytes);
5439 if (obj == NULL) {
5440 return -1;
5441 }
5442 }
5443
5444 PDATA_PUSH(self->stack, obj, -1);
5445 return 0;
5446}
5447
5448static int
5449load_counted_binstring(UnpicklerObject *self, int nbytes)
5450{
5451 PyObject *obj;
5452 Py_ssize_t size;
5453 char *s;
5454
5455 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005456 return -1;
5457
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08005458 size = calc_binsize(s, nbytes);
5459 if (size < 0) {
5460 PickleState *st = _Pickle_GetGlobalState();
5461 PyErr_Format(st->UnpicklingError,
5462 "BINSTRING exceeds system's maximum size of %zd bytes",
5463 PY_SSIZE_T_MAX);
5464 return -1;
5465 }
5466
5467 if (_Unpickler_Read(self, &s, size) < 0)
5468 return -1;
5469
5470 /* Convert Python 2.x strings to bytes if the *encoding* given to the
5471 Unpickler was 'bytes'. Otherwise, convert them to unicode. */
5472 if (strcmp(self->encoding, "bytes") == 0) {
5473 obj = PyBytes_FromStringAndSize(s, size);
5474 }
5475 else {
5476 obj = PyUnicode_Decode(s, size, self->encoding, self->errors);
5477 }
5478 if (obj == NULL) {
5479 return -1;
5480 }
5481
5482 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005483 return 0;
5484}
5485
5486static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005487load_counted_binbytes(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005488{
5489 PyObject *bytes;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005490 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005491 char *s;
5492
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005493 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005494 return -1;
5495
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005496 size = calc_binsize(s, nbytes);
5497 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005498 PyErr_Format(PyExc_OverflowError,
5499 "BINBYTES exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07005500 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005501 return -1;
5502 }
5503
Antoine Pitrou91f43802019-05-26 17:10:09 +02005504 bytes = PyBytes_FromStringAndSize(NULL, size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005505 if (bytes == NULL)
5506 return -1;
Antoine Pitrou91f43802019-05-26 17:10:09 +02005507 if (_Unpickler_ReadInto(self, PyBytes_AS_STRING(bytes), size) < 0) {
5508 Py_DECREF(bytes);
5509 return -1;
5510 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005511
5512 PDATA_PUSH(self->stack, bytes, -1);
5513 return 0;
5514}
5515
5516static int
Antoine Pitrou91f43802019-05-26 17:10:09 +02005517load_counted_bytearray(UnpicklerObject *self)
5518{
5519 PyObject *bytearray;
5520 Py_ssize_t size;
5521 char *s;
5522
5523 if (_Unpickler_Read(self, &s, 8) < 0) {
5524 return -1;
5525 }
5526
5527 size = calc_binsize(s, 8);
5528 if (size < 0) {
5529 PyErr_Format(PyExc_OverflowError,
5530 "BYTEARRAY8 exceeds system's maximum size of %zd bytes",
5531 PY_SSIZE_T_MAX);
5532 return -1;
5533 }
5534
5535 bytearray = PyByteArray_FromStringAndSize(NULL, size);
5536 if (bytearray == NULL) {
5537 return -1;
5538 }
5539 if (_Unpickler_ReadInto(self, PyByteArray_AS_STRING(bytearray), size) < 0) {
5540 Py_DECREF(bytearray);
5541 return -1;
5542 }
5543
5544 PDATA_PUSH(self->stack, bytearray, -1);
5545 return 0;
5546}
5547
5548static int
5549load_next_buffer(UnpicklerObject *self)
5550{
5551 if (self->buffers == NULL) {
5552 PickleState *st = _Pickle_GetGlobalState();
5553 PyErr_SetString(st->UnpicklingError,
5554 "pickle stream refers to out-of-band data "
5555 "but no *buffers* argument was given");
5556 return -1;
5557 }
5558 PyObject *buf = PyIter_Next(self->buffers);
5559 if (buf == NULL) {
5560 if (!PyErr_Occurred()) {
5561 PickleState *st = _Pickle_GetGlobalState();
5562 PyErr_SetString(st->UnpicklingError,
5563 "not enough out-of-band buffers");
5564 }
5565 return -1;
5566 }
5567
5568 PDATA_PUSH(self->stack, buf, -1);
5569 return 0;
5570}
5571
5572static int
5573load_readonly_buffer(UnpicklerObject *self)
5574{
5575 Py_ssize_t len = Py_SIZE(self->stack);
5576 if (len <= self->stack->fence) {
5577 return Pdata_stack_underflow(self->stack);
5578 }
5579
5580 PyObject *obj = self->stack->data[len - 1];
5581 PyObject *view = PyMemoryView_FromObject(obj);
5582 if (view == NULL) {
5583 return -1;
5584 }
5585 if (!PyMemoryView_GET_BUFFER(view)->readonly) {
5586 /* Original object is writable */
5587 PyMemoryView_GET_BUFFER(view)->readonly = 1;
5588 self->stack->data[len - 1] = view;
5589 Py_DECREF(obj);
5590 }
5591 else {
5592 /* Original object is read-only, no need to replace it */
5593 Py_DECREF(view);
5594 }
5595 return 0;
5596}
5597
5598static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005599load_unicode(UnpicklerObject *self)
5600{
5601 PyObject *str;
5602 Py_ssize_t len;
Victor Stinnerb110dad2016-12-09 17:06:43 +01005603 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005604
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005605 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005606 return -1;
5607 if (len < 1)
5608 return bad_readline();
5609
5610 str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL);
5611 if (str == NULL)
5612 return -1;
5613
5614 PDATA_PUSH(self->stack, str, -1);
5615 return 0;
5616}
5617
5618static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005619load_counted_binunicode(UnpicklerObject *self, int nbytes)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005620{
5621 PyObject *str;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005622 Py_ssize_t size;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005623 char *s;
5624
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005625 if (_Unpickler_Read(self, &s, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005626 return -1;
5627
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005628 size = calc_binsize(s, nbytes);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005629 if (size < 0) {
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005630 PyErr_Format(PyExc_OverflowError,
5631 "BINUNICODE exceeds system's maximum size of %zd bytes",
Alexandre Vassalotticc757172013-04-14 02:25:10 -07005632 PY_SSIZE_T_MAX);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005633 return -1;
5634 }
5635
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005636 if (_Unpickler_Read(self, &s, size) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005637 return -1;
5638
Victor Stinner485fb562010-04-13 11:07:24 +00005639 str = PyUnicode_DecodeUTF8(s, size, "surrogatepass");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005640 if (str == NULL)
5641 return -1;
5642
5643 PDATA_PUSH(self->stack, str, -1);
5644 return 0;
5645}
5646
5647static int
Victor Stinner21b47112016-03-14 18:09:39 +01005648load_counted_tuple(UnpicklerObject *self, Py_ssize_t len)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005649{
5650 PyObject *tuple;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005651
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005652 if (Py_SIZE(self->stack) < len)
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005653 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005654
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005655 tuple = Pdata_poptuple(self->stack, Py_SIZE(self->stack) - len);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005656 if (tuple == NULL)
5657 return -1;
5658 PDATA_PUSH(self->stack, tuple, -1);
5659 return 0;
5660}
5661
5662static int
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005663load_tuple(UnpicklerObject *self)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005664{
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005665 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005666
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005667 if ((i = marker(self)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005668 return -1;
5669
Serhiy Storchakaa49de6b2015-11-25 15:01:53 +02005670 return load_counted_tuple(self, Py_SIZE(self->stack) - i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005671}
5672
5673static int
5674load_empty_list(UnpicklerObject *self)
5675{
5676 PyObject *list;
5677
5678 if ((list = PyList_New(0)) == NULL)
5679 return -1;
5680 PDATA_PUSH(self->stack, list, -1);
5681 return 0;
5682}
5683
5684static int
5685load_empty_dict(UnpicklerObject *self)
5686{
5687 PyObject *dict;
5688
5689 if ((dict = PyDict_New()) == NULL)
5690 return -1;
5691 PDATA_PUSH(self->stack, dict, -1);
5692 return 0;
5693}
5694
5695static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005696load_empty_set(UnpicklerObject *self)
5697{
5698 PyObject *set;
5699
5700 if ((set = PySet_New(NULL)) == NULL)
5701 return -1;
5702 PDATA_PUSH(self->stack, set, -1);
5703 return 0;
5704}
5705
5706static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005707load_list(UnpicklerObject *self)
5708{
5709 PyObject *list;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005710 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005711
5712 if ((i = marker(self)) < 0)
5713 return -1;
5714
5715 list = Pdata_poplist(self->stack, i);
5716 if (list == NULL)
5717 return -1;
5718 PDATA_PUSH(self->stack, list, -1);
5719 return 0;
5720}
5721
5722static int
5723load_dict(UnpicklerObject *self)
5724{
5725 PyObject *dict, *key, *value;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005726 Py_ssize_t i, j, k;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005727
5728 if ((i = marker(self)) < 0)
5729 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005730 j = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005731
5732 if ((dict = PyDict_New()) == NULL)
5733 return -1;
5734
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005735 if ((j - i) % 2 != 0) {
5736 PickleState *st = _Pickle_GetGlobalState();
5737 PyErr_SetString(st->UnpicklingError, "odd number of items for DICT");
Serhiy Storchaka3ac53802015-12-07 11:32:00 +02005738 Py_DECREF(dict);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005739 return -1;
5740 }
5741
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005742 for (k = i + 1; k < j; k += 2) {
5743 key = self->stack->data[k - 1];
5744 value = self->stack->data[k];
5745 if (PyDict_SetItem(dict, key, value) < 0) {
5746 Py_DECREF(dict);
5747 return -1;
5748 }
5749 }
5750 Pdata_clear(self->stack, i);
5751 PDATA_PUSH(self->stack, dict, -1);
5752 return 0;
5753}
5754
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005755static int
5756load_frozenset(UnpicklerObject *self)
5757{
5758 PyObject *items;
5759 PyObject *frozenset;
5760 Py_ssize_t i;
5761
5762 if ((i = marker(self)) < 0)
5763 return -1;
5764
5765 items = Pdata_poptuple(self->stack, i);
5766 if (items == NULL)
5767 return -1;
5768
5769 frozenset = PyFrozenSet_New(items);
5770 Py_DECREF(items);
5771 if (frozenset == NULL)
5772 return -1;
5773
5774 PDATA_PUSH(self->stack, frozenset, -1);
5775 return 0;
5776}
5777
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005778static PyObject *
5779instantiate(PyObject *cls, PyObject *args)
5780{
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005781 /* Caller must assure args are a tuple. Normally, args come from
5782 Pdata_poptuple which packs objects from the top of the stack
5783 into a newly created tuple. */
5784 assert(PyTuple_Check(args));
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005785 if (!PyTuple_GET_SIZE(args) && PyType_Check(cls)) {
5786 _Py_IDENTIFIER(__getinitargs__);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005787 _Py_IDENTIFIER(__new__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005788 PyObject *func;
5789 if (_PyObject_LookupAttrId(cls, &PyId___getinitargs__, &func) < 0) {
5790 return NULL;
5791 }
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005792 if (func == NULL) {
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005793 return _PyObject_CallMethodIdObjArgs(cls, &PyId___new__, cls, NULL);
5794 }
5795 Py_DECREF(func);
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005796 }
Serhiy Storchaka04e36af2017-10-22 21:31:34 +03005797 return PyObject_CallObject(cls, args);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005798}
5799
5800static int
5801load_obj(UnpicklerObject *self)
5802{
5803 PyObject *cls, *args, *obj = NULL;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005804 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005805
5806 if ((i = marker(self)) < 0)
5807 return -1;
5808
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005809 if (Py_SIZE(self->stack) - i < 1)
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02005810 return Pdata_stack_underflow(self->stack);
Serhiy Storchakae9b30742015-11-23 15:17:43 +02005811
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005812 args = Pdata_poptuple(self->stack, i + 1);
5813 if (args == NULL)
5814 return -1;
5815
5816 PDATA_POP(self->stack, cls);
5817 if (cls) {
5818 obj = instantiate(cls, args);
5819 Py_DECREF(cls);
5820 }
5821 Py_DECREF(args);
5822 if (obj == NULL)
5823 return -1;
5824
5825 PDATA_PUSH(self->stack, obj, -1);
5826 return 0;
5827}
5828
5829static int
5830load_inst(UnpicklerObject *self)
5831{
5832 PyObject *cls = NULL;
5833 PyObject *args = NULL;
5834 PyObject *obj = NULL;
5835 PyObject *module_name;
5836 PyObject *class_name;
5837 Py_ssize_t len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02005838 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005839 char *s;
5840
5841 if ((i = marker(self)) < 0)
5842 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005843 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005844 return -1;
5845 if (len < 2)
5846 return bad_readline();
5847
5848 /* Here it is safe to use PyUnicode_DecodeASCII(), even though non-ASCII
5849 identifiers are permitted in Python 3.0, since the INST opcode is only
5850 supported by older protocols on Python 2.x. */
5851 module_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
5852 if (module_name == NULL)
5853 return -1;
5854
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005855 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Serhiy Storchakaca28eba2015-12-01 00:18:23 +02005856 if (len < 2) {
5857 Py_DECREF(module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005858 return bad_readline();
Serhiy Storchakaca28eba2015-12-01 00:18:23 +02005859 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005860 class_name = PyUnicode_DecodeASCII(s, len - 1, "strict");
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00005861 if (class_name != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005862 cls = find_class(self, module_name, class_name);
5863 Py_DECREF(class_name);
5864 }
5865 }
5866 Py_DECREF(module_name);
5867
5868 if (cls == NULL)
5869 return -1;
5870
5871 if ((args = Pdata_poptuple(self->stack, i)) != NULL) {
5872 obj = instantiate(cls, args);
5873 Py_DECREF(args);
5874 }
5875 Py_DECREF(cls);
5876
5877 if (obj == NULL)
5878 return -1;
5879
5880 PDATA_PUSH(self->stack, obj, -1);
5881 return 0;
5882}
5883
5884static int
5885load_newobj(UnpicklerObject *self)
5886{
5887 PyObject *args = NULL;
5888 PyObject *clsraw = NULL;
5889 PyTypeObject *cls; /* clsraw cast to its true type */
5890 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005891 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005892
5893 /* Stack is ... cls argtuple, and we want to call
5894 * cls.__new__(cls, *argtuple).
5895 */
5896 PDATA_POP(self->stack, args);
5897 if (args == NULL)
5898 goto error;
5899 if (!PyTuple_Check(args)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005900 PyErr_SetString(st->UnpicklingError,
5901 "NEWOBJ expected an arg " "tuple.");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005902 goto error;
5903 }
5904
5905 PDATA_POP(self->stack, clsraw);
5906 cls = (PyTypeObject *)clsraw;
5907 if (cls == NULL)
5908 goto error;
5909 if (!PyType_Check(cls)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005910 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005911 "isn't a type object");
5912 goto error;
5913 }
5914 if (cls->tp_new == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005915 PyErr_SetString(st->UnpicklingError, "NEWOBJ class argument "
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005916 "has NULL tp_new");
5917 goto error;
5918 }
5919
5920 /* Call __new__. */
5921 obj = cls->tp_new(cls, args, NULL);
5922 if (obj == NULL)
5923 goto error;
5924
5925 Py_DECREF(args);
5926 Py_DECREF(clsraw);
5927 PDATA_PUSH(self->stack, obj, -1);
5928 return 0;
5929
5930 error:
5931 Py_XDECREF(args);
5932 Py_XDECREF(clsraw);
5933 return -1;
5934}
5935
5936static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005937load_newobj_ex(UnpicklerObject *self)
5938{
5939 PyObject *cls, *args, *kwargs;
5940 PyObject *obj;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005941 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005942
5943 PDATA_POP(self->stack, kwargs);
5944 if (kwargs == NULL) {
5945 return -1;
5946 }
5947 PDATA_POP(self->stack, args);
5948 if (args == NULL) {
5949 Py_DECREF(kwargs);
5950 return -1;
5951 }
5952 PDATA_POP(self->stack, cls);
5953 if (cls == NULL) {
5954 Py_DECREF(kwargs);
5955 Py_DECREF(args);
5956 return -1;
5957 }
Larry Hastings61272b72014-01-07 12:41:53 -08005958
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005959 if (!PyType_Check(cls)) {
5960 Py_DECREF(kwargs);
5961 Py_DECREF(args);
Larry Hastings61272b72014-01-07 12:41:53 -08005962 PyErr_Format(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005963 "NEWOBJ_EX class argument must be a type, not %.200s",
5964 Py_TYPE(cls)->tp_name);
Benjamin Peterson80f78a32015-07-02 16:18:38 -05005965 Py_DECREF(cls);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005966 return -1;
5967 }
5968
5969 if (((PyTypeObject *)cls)->tp_new == NULL) {
5970 Py_DECREF(kwargs);
5971 Py_DECREF(args);
5972 Py_DECREF(cls);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08005973 PyErr_SetString(st->UnpicklingError,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01005974 "NEWOBJ_EX class argument doesn't have __new__");
5975 return -1;
5976 }
5977 obj = ((PyTypeObject *)cls)->tp_new((PyTypeObject *)cls, args, kwargs);
5978 Py_DECREF(kwargs);
5979 Py_DECREF(args);
5980 Py_DECREF(cls);
5981 if (obj == NULL) {
5982 return -1;
5983 }
5984 PDATA_PUSH(self->stack, obj, -1);
5985 return 0;
5986}
5987
5988static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005989load_global(UnpicklerObject *self)
5990{
5991 PyObject *global = NULL;
5992 PyObject *module_name;
5993 PyObject *global_name;
5994 Py_ssize_t len;
5995 char *s;
5996
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00005997 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00005998 return -1;
5999 if (len < 2)
6000 return bad_readline();
6001 module_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
6002 if (!module_name)
6003 return -1;
6004
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006005 if ((len = _Unpickler_Readline(self, &s)) >= 0) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006006 if (len < 2) {
6007 Py_DECREF(module_name);
6008 return bad_readline();
6009 }
6010 global_name = PyUnicode_DecodeUTF8(s, len - 1, "strict");
6011 if (global_name) {
6012 global = find_class(self, module_name, global_name);
6013 Py_DECREF(global_name);
6014 }
6015 }
6016 Py_DECREF(module_name);
6017
6018 if (global == NULL)
6019 return -1;
6020 PDATA_PUSH(self->stack, global, -1);
6021 return 0;
6022}
6023
6024static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006025load_stack_global(UnpicklerObject *self)
6026{
6027 PyObject *global;
6028 PyObject *module_name;
6029 PyObject *global_name;
6030
6031 PDATA_POP(self->stack, global_name);
6032 PDATA_POP(self->stack, module_name);
6033 if (module_name == NULL || !PyUnicode_CheckExact(module_name) ||
6034 global_name == NULL || !PyUnicode_CheckExact(global_name)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006035 PickleState *st = _Pickle_GetGlobalState();
6036 PyErr_SetString(st->UnpicklingError, "STACK_GLOBAL requires str");
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006037 Py_XDECREF(global_name);
6038 Py_XDECREF(module_name);
6039 return -1;
6040 }
6041 global = find_class(self, module_name, global_name);
6042 Py_DECREF(global_name);
6043 Py_DECREF(module_name);
6044 if (global == NULL)
6045 return -1;
6046 PDATA_PUSH(self->stack, global, -1);
6047 return 0;
6048}
6049
6050static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006051load_persid(UnpicklerObject *self)
6052{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006053 PyObject *pid, *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006054 Py_ssize_t len;
6055 char *s;
6056
6057 if (self->pers_func) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006058 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006059 return -1;
Alexandre Vassalotti896414f2013-11-30 13:52:35 -08006060 if (len < 1)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006061 return bad_readline();
6062
Serhiy Storchakadec25af2016-07-17 11:24:17 +03006063 pid = PyUnicode_DecodeASCII(s, len - 1, "strict");
6064 if (pid == NULL) {
6065 if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) {
6066 PyErr_SetString(_Pickle_GetGlobalState()->UnpicklingError,
6067 "persistent IDs in protocol 0 must be "
6068 "ASCII strings");
6069 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006070 return -1;
Serhiy Storchakadec25af2016-07-17 11:24:17 +03006071 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006072
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006073 obj = call_method(self->pers_func, self->pers_func_self, pid);
6074 Py_DECREF(pid);
6075 if (obj == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006076 return -1;
6077
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006078 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006079 return 0;
6080 }
6081 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006082 PickleState *st = _Pickle_GetGlobalState();
6083 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006084 "A load persistent id instruction was encountered,\n"
6085 "but no persistent_load function was specified.");
6086 return -1;
6087 }
6088}
6089
6090static int
6091load_binpersid(UnpicklerObject *self)
6092{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006093 PyObject *pid, *obj;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006094
6095 if (self->pers_func) {
6096 PDATA_POP(self->stack, pid);
6097 if (pid == NULL)
6098 return -1;
6099
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006100 obj = call_method(self->pers_func, self->pers_func_self, pid);
6101 Py_DECREF(pid);
6102 if (obj == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006103 return -1;
6104
Serhiy Storchaka986375e2017-11-30 22:48:31 +02006105 PDATA_PUSH(self->stack, obj, -1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006106 return 0;
6107 }
6108 else {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006109 PickleState *st = _Pickle_GetGlobalState();
6110 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006111 "A load persistent id instruction was encountered,\n"
6112 "but no persistent_load function was specified.");
6113 return -1;
6114 }
6115}
6116
6117static int
6118load_pop(UnpicklerObject *self)
6119{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006120 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006121
6122 /* Note that we split the (pickle.py) stack into two stacks,
6123 * an object stack and a mark stack. We have to be clever and
6124 * pop the right one. We do this by looking at the top of the
Collin Winter8ca69de2009-05-26 16:53:41 +00006125 * mark stack first, and only signalling a stack underflow if
6126 * the object stack is empty and the mark stack doesn't match
6127 * our expectations.
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006128 */
Collin Winter8ca69de2009-05-26 16:53:41 +00006129 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006130 self->num_marks--;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006131 self->stack->mark_set = self->num_marks != 0;
6132 self->stack->fence = self->num_marks ?
6133 self->marks[self->num_marks - 1] : 0;
6134 } else if (len <= self->stack->fence)
6135 return Pdata_stack_underflow(self->stack);
6136 else {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006137 len--;
6138 Py_DECREF(self->stack->data[len]);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006139 Py_SIZE(self->stack) = len;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006140 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006141 return 0;
6142}
6143
6144static int
6145load_pop_mark(UnpicklerObject *self)
6146{
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006147 Py_ssize_t i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006148
6149 if ((i = marker(self)) < 0)
6150 return -1;
6151
6152 Pdata_clear(self->stack, i);
6153
6154 return 0;
6155}
6156
6157static int
6158load_dup(UnpicklerObject *self)
6159{
6160 PyObject *last;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006161 Py_ssize_t len = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006162
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006163 if (len <= self->stack->fence)
6164 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006165 last = self->stack->data[len - 1];
6166 PDATA_APPEND(self->stack, last, -1);
6167 return 0;
6168}
6169
6170static int
6171load_get(UnpicklerObject *self)
6172{
6173 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006174 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006175 Py_ssize_t len;
6176 char *s;
6177
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006178 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006179 return -1;
6180 if (len < 2)
6181 return bad_readline();
6182
6183 key = PyLong_FromString(s, NULL, 10);
6184 if (key == NULL)
6185 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006186 idx = PyLong_AsSsize_t(key);
6187 if (idx == -1 && PyErr_Occurred()) {
6188 Py_DECREF(key);
6189 return -1;
6190 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006191
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006192 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006193 if (value == NULL) {
6194 if (!PyErr_Occurred())
6195 PyErr_SetObject(PyExc_KeyError, key);
6196 Py_DECREF(key);
6197 return -1;
6198 }
6199 Py_DECREF(key);
6200
6201 PDATA_APPEND(self->stack, value, -1);
6202 return 0;
6203}
6204
6205static int
6206load_binget(UnpicklerObject *self)
6207{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006208 PyObject *value;
6209 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006210 char *s;
6211
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006212 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006213 return -1;
6214
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006215 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006216
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006217 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006218 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006219 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02006220 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006221 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02006222 Py_DECREF(key);
6223 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006224 return -1;
6225 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006226
6227 PDATA_APPEND(self->stack, value, -1);
6228 return 0;
6229}
6230
6231static int
6232load_long_binget(UnpicklerObject *self)
6233{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006234 PyObject *value;
6235 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006236 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006237
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006238 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006239 return -1;
6240
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006241 idx = calc_binsize(s, 4);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006242
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006243 value = _Unpickler_MemoGet(self, idx);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006244 if (value == NULL) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006245 PyObject *key = PyLong_FromSsize_t(idx);
Christian Heimes9ee5c372013-07-26 22:45:00 +02006246 if (key != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006247 PyErr_SetObject(PyExc_KeyError, key);
Christian Heimes9ee5c372013-07-26 22:45:00 +02006248 Py_DECREF(key);
6249 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006250 return -1;
6251 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006252
6253 PDATA_APPEND(self->stack, value, -1);
6254 return 0;
6255}
6256
6257/* Push an object from the extension registry (EXT[124]). nbytes is
6258 * the number of bytes following the opcode, holding the index (code) value.
6259 */
6260static int
6261load_extension(UnpicklerObject *self, int nbytes)
6262{
6263 char *codebytes; /* the nbytes bytes after the opcode */
6264 long code; /* calc_binint returns long */
6265 PyObject *py_code; /* code as a Python int */
6266 PyObject *obj; /* the object to push */
6267 PyObject *pair; /* (module_name, class_name) */
6268 PyObject *module_name, *class_name;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006269 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006270
6271 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006272 if (_Unpickler_Read(self, &codebytes, nbytes) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006273 return -1;
6274 code = calc_binint(codebytes, nbytes);
6275 if (code <= 0) { /* note that 0 is forbidden */
6276 /* Corrupt or hostile pickle. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006277 PyErr_SetString(st->UnpicklingError, "EXT specifies code <= 0");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006278 return -1;
6279 }
6280
6281 /* Look for the code in the cache. */
6282 py_code = PyLong_FromLong(code);
6283 if (py_code == NULL)
6284 return -1;
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08006285 obj = PyDict_GetItemWithError(st->extension_cache, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006286 if (obj != NULL) {
6287 /* Bingo. */
6288 Py_DECREF(py_code);
6289 PDATA_APPEND(self->stack, obj, -1);
6290 return 0;
6291 }
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08006292 if (PyErr_Occurred()) {
6293 Py_DECREF(py_code);
6294 return -1;
6295 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006296
6297 /* Look up the (module_name, class_name) pair. */
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08006298 pair = PyDict_GetItemWithError(st->inverted_registry, py_code);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006299 if (pair == NULL) {
6300 Py_DECREF(py_code);
Alexandre Vassalotti567eba12013-11-28 17:09:16 -08006301 if (!PyErr_Occurred()) {
6302 PyErr_Format(PyExc_ValueError, "unregistered extension "
6303 "code %ld", code);
6304 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006305 return -1;
6306 }
6307 /* Since the extension registry is manipulable via Python code,
6308 * confirm that pair is really a 2-tuple of strings.
6309 */
Victor Stinnerb37672d2018-11-22 03:37:50 +01006310 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2) {
6311 goto error;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006312 }
Victor Stinnerb37672d2018-11-22 03:37:50 +01006313
6314 module_name = PyTuple_GET_ITEM(pair, 0);
6315 if (!PyUnicode_Check(module_name)) {
6316 goto error;
6317 }
6318
6319 class_name = PyTuple_GET_ITEM(pair, 1);
6320 if (!PyUnicode_Check(class_name)) {
6321 goto error;
6322 }
6323
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006324 /* Load the object. */
6325 obj = find_class(self, module_name, class_name);
6326 if (obj == NULL) {
6327 Py_DECREF(py_code);
6328 return -1;
6329 }
6330 /* Cache code -> obj. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006331 code = PyDict_SetItem(st->extension_cache, py_code, obj);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006332 Py_DECREF(py_code);
6333 if (code < 0) {
6334 Py_DECREF(obj);
6335 return -1;
6336 }
6337 PDATA_PUSH(self->stack, obj, -1);
6338 return 0;
Victor Stinnerb37672d2018-11-22 03:37:50 +01006339
6340error:
6341 Py_DECREF(py_code);
6342 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
6343 "isn't a 2-tuple of strings", code);
6344 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006345}
6346
6347static int
6348load_put(UnpicklerObject *self)
6349{
6350 PyObject *key, *value;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006351 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006352 Py_ssize_t len;
Victor Stinnerb110dad2016-12-09 17:06:43 +01006353 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006354
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006355 if ((len = _Unpickler_Readline(self, &s)) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006356 return -1;
6357 if (len < 2)
6358 return bad_readline();
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006359 if (Py_SIZE(self->stack) <= self->stack->fence)
6360 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006361 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006362
6363 key = PyLong_FromString(s, NULL, 10);
6364 if (key == NULL)
6365 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006366 idx = PyLong_AsSsize_t(key);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006367 Py_DECREF(key);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02006368 if (idx < 0) {
6369 if (!PyErr_Occurred())
6370 PyErr_SetString(PyExc_ValueError,
6371 "negative PUT argument");
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006372 return -1;
Antoine Pitrou55549ec2011-08-30 00:27:10 +02006373 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006374
6375 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006376}
6377
6378static int
6379load_binput(UnpicklerObject *self)
6380{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006381 PyObject *value;
6382 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006383 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006384
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006385 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006386 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006387
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006388 if (Py_SIZE(self->stack) <= self->stack->fence)
6389 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006390 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006391
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006392 idx = Py_CHARMASK(s[0]);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006393
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006394 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006395}
6396
6397static int
6398load_long_binput(UnpicklerObject *self)
6399{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006400 PyObject *value;
6401 Py_ssize_t idx;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006402 char *s;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006403
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006404 if (_Unpickler_Read(self, &s, 4) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006405 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006406
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006407 if (Py_SIZE(self->stack) <= self->stack->fence)
6408 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006409 value = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006410
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006411 idx = calc_binsize(s, 4);
Antoine Pitrou55549ec2011-08-30 00:27:10 +02006412 if (idx < 0) {
6413 PyErr_SetString(PyExc_ValueError,
6414 "negative LONG_BINPUT argument");
6415 return -1;
6416 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006417
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006418 return _Unpickler_MemoPut(self, idx, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006419}
6420
6421static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006422load_memoize(UnpicklerObject *self)
6423{
6424 PyObject *value;
6425
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006426 if (Py_SIZE(self->stack) <= self->stack->fence)
6427 return Pdata_stack_underflow(self->stack);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006428 value = self->stack->data[Py_SIZE(self->stack) - 1];
6429
6430 return _Unpickler_MemoPut(self, self->memo_len, value);
6431}
6432
6433static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006434do_append(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006435{
6436 PyObject *value;
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006437 PyObject *slice;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006438 PyObject *list;
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006439 PyObject *result;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006440 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006441
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006442 len = Py_SIZE(self->stack);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006443 if (x > len || x <= self->stack->fence)
6444 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006445 if (len == x) /* nothing to do */
6446 return 0;
6447
6448 list = self->stack->data[x - 1];
6449
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006450 if (PyList_CheckExact(list)) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006451 Py_ssize_t list_len;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006452 int ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006453
6454 slice = Pdata_poplist(self->stack, x);
6455 if (!slice)
6456 return -1;
6457 list_len = PyList_GET_SIZE(list);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006458 ret = PyList_SetSlice(list, list_len, list_len, slice);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006459 Py_DECREF(slice);
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006460 return ret;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006461 }
6462 else {
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006463 PyObject *extend_func;
6464 _Py_IDENTIFIER(extend);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006465
Serhiy Storchaka353053d2019-09-01 14:01:05 +03006466 if (_PyObject_LookupAttrId(list, &PyId_extend, &extend_func) < 0) {
6467 return -1;
6468 }
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006469 if (extend_func != NULL) {
6470 slice = Pdata_poplist(self->stack, x);
6471 if (!slice) {
6472 Py_DECREF(extend_func);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006473 return -1;
6474 }
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006475 result = _Pickle_FastCall(extend_func, slice);
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006476 Py_DECREF(extend_func);
6477 if (result == NULL)
6478 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006479 Py_DECREF(result);
6480 }
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006481 else {
6482 PyObject *append_func;
6483 _Py_IDENTIFIER(append);
6484
6485 /* Even if the PEP 307 requires extend() and append() methods,
6486 fall back on append() if the object has no extend() method
6487 for backward compatibility. */
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02006488 append_func = _PyObject_GetAttrId(list, &PyId_append);
6489 if (append_func == NULL)
6490 return -1;
6491 for (i = x; i < len; i++) {
6492 value = self->stack->data[i];
6493 result = _Pickle_FastCall(append_func, value);
6494 if (result == NULL) {
6495 Pdata_clear(self->stack, i + 1);
6496 Py_SIZE(self->stack) = x;
6497 Py_DECREF(append_func);
6498 return -1;
6499 }
6500 Py_DECREF(result);
6501 }
6502 Py_SIZE(self->stack) = x;
6503 Py_DECREF(append_func);
6504 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006505 }
6506
6507 return 0;
6508}
6509
6510static int
6511load_append(UnpicklerObject *self)
6512{
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006513 if (Py_SIZE(self->stack) - 1 <= self->stack->fence)
6514 return Pdata_stack_underflow(self->stack);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006515 return do_append(self, Py_SIZE(self->stack) - 1);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006516}
6517
6518static int
6519load_appends(UnpicklerObject *self)
6520{
Serhiy Storchakae9b30742015-11-23 15:17:43 +02006521 Py_ssize_t i = marker(self);
6522 if (i < 0)
6523 return -1;
6524 return do_append(self, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006525}
6526
6527static int
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006528do_setitems(UnpicklerObject *self, Py_ssize_t x)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006529{
6530 PyObject *value, *key;
6531 PyObject *dict;
Antoine Pitrou82be19f2011-08-29 23:09:33 +02006532 Py_ssize_t len, i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006533 int status = 0;
6534
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006535 len = Py_SIZE(self->stack);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006536 if (x > len || x <= self->stack->fence)
6537 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006538 if (len == x) /* nothing to do */
6539 return 0;
Victor Stinner121aab42011-09-29 23:40:53 +02006540 if ((len - x) % 2 != 0) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006541 PickleState *st = _Pickle_GetGlobalState();
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006542 /* Currupt or hostile pickle -- we never write one like this. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006543 PyErr_SetString(st->UnpicklingError,
6544 "odd number of items for SETITEMS");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006545 return -1;
6546 }
6547
6548 /* Here, dict does not actually need to be a PyDict; it could be anything
6549 that supports the __setitem__ attribute. */
6550 dict = self->stack->data[x - 1];
6551
6552 for (i = x + 1; i < len; i += 2) {
6553 key = self->stack->data[i - 1];
6554 value = self->stack->data[i];
6555 if (PyObject_SetItem(dict, key, value) < 0) {
6556 status = -1;
6557 break;
6558 }
6559 }
6560
6561 Pdata_clear(self->stack, x);
6562 return status;
6563}
6564
6565static int
6566load_setitem(UnpicklerObject *self)
6567{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006568 return do_setitems(self, Py_SIZE(self->stack) - 2);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006569}
6570
6571static int
6572load_setitems(UnpicklerObject *self)
6573{
Serhiy Storchakae9b30742015-11-23 15:17:43 +02006574 Py_ssize_t i = marker(self);
6575 if (i < 0)
6576 return -1;
6577 return do_setitems(self, i);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006578}
6579
6580static int
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006581load_additems(UnpicklerObject *self)
6582{
6583 PyObject *set;
6584 Py_ssize_t mark, len, i;
6585
6586 mark = marker(self);
Serhiy Storchakae9b30742015-11-23 15:17:43 +02006587 if (mark < 0)
6588 return -1;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006589 len = Py_SIZE(self->stack);
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006590 if (mark > len || mark <= self->stack->fence)
6591 return Pdata_stack_underflow(self->stack);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006592 if (len == mark) /* nothing to do */
6593 return 0;
6594
6595 set = self->stack->data[mark - 1];
6596
6597 if (PySet_Check(set)) {
6598 PyObject *items;
6599 int status;
6600
6601 items = Pdata_poptuple(self->stack, mark);
6602 if (items == NULL)
6603 return -1;
6604
6605 status = _PySet_Update(set, items);
6606 Py_DECREF(items);
6607 return status;
6608 }
6609 else {
6610 PyObject *add_func;
6611 _Py_IDENTIFIER(add);
6612
6613 add_func = _PyObject_GetAttrId(set, &PyId_add);
6614 if (add_func == NULL)
6615 return -1;
6616 for (i = mark; i < len; i++) {
6617 PyObject *result;
6618 PyObject *item;
6619
6620 item = self->stack->data[i];
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08006621 result = _Pickle_FastCall(add_func, item);
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006622 if (result == NULL) {
6623 Pdata_clear(self->stack, i + 1);
6624 Py_SIZE(self->stack) = mark;
6625 return -1;
6626 }
6627 Py_DECREF(result);
6628 }
6629 Py_SIZE(self->stack) = mark;
6630 }
6631
6632 return 0;
6633}
6634
6635static int
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006636load_build(UnpicklerObject *self)
6637{
6638 PyObject *state, *inst, *slotstate;
6639 PyObject *setstate;
6640 int status = 0;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02006641 _Py_IDENTIFIER(__setstate__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006642
6643 /* Stack is ... instance, state. We want to leave instance at
6644 * the stack top, possibly mutated via instance.__setstate__(state).
6645 */
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006646 if (Py_SIZE(self->stack) - 2 < self->stack->fence)
6647 return Pdata_stack_underflow(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006648
6649 PDATA_POP(self->stack, state);
6650 if (state == NULL)
6651 return -1;
6652
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006653 inst = self->stack->data[Py_SIZE(self->stack) - 1];
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006654
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006655 if (_PyObject_LookupAttrId(inst, &PyId___setstate__, &setstate) < 0) {
6656 Py_DECREF(state);
6657 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006658 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006659 if (setstate != NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006660 PyObject *result;
6661
6662 /* The explicit __setstate__ is responsible for everything. */
Alexandre Vassalotti20c28c12013-11-27 02:26:54 -08006663 result = _Pickle_FastCall(setstate, state);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006664 Py_DECREF(setstate);
6665 if (result == NULL)
6666 return -1;
6667 Py_DECREF(result);
6668 return 0;
6669 }
6670
6671 /* A default __setstate__. First see whether state embeds a
6672 * slot state dict too (a proto 2 addition).
6673 */
Serhiy Storchakafff9a312017-03-21 08:53:25 +02006674 if (PyTuple_Check(state) && PyTuple_GET_SIZE(state) == 2) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006675 PyObject *tmp = state;
6676
6677 state = PyTuple_GET_ITEM(tmp, 0);
6678 slotstate = PyTuple_GET_ITEM(tmp, 1);
6679 Py_INCREF(state);
6680 Py_INCREF(slotstate);
6681 Py_DECREF(tmp);
6682 }
6683 else
6684 slotstate = NULL;
6685
6686 /* Set inst.__dict__ from the state dict (if any). */
6687 if (state != Py_None) {
6688 PyObject *dict;
Antoine Pitroua9f48a02009-05-02 21:41:14 +00006689 PyObject *d_key, *d_value;
6690 Py_ssize_t i;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02006691 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006692
6693 if (!PyDict_Check(state)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006694 PickleState *st = _Pickle_GetGlobalState();
6695 PyErr_SetString(st->UnpicklingError, "state is not a dictionary");
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006696 goto error;
6697 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006698 dict = _PyObject_GetAttrId(inst, &PyId___dict__);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006699 if (dict == NULL)
6700 goto error;
6701
Antoine Pitroua9f48a02009-05-02 21:41:14 +00006702 i = 0;
6703 while (PyDict_Next(state, &i, &d_key, &d_value)) {
6704 /* normally the keys for instance attributes are
6705 interned. we should try to do that here. */
6706 Py_INCREF(d_key);
6707 if (PyUnicode_CheckExact(d_key))
6708 PyUnicode_InternInPlace(&d_key);
6709 if (PyObject_SetItem(dict, d_key, d_value) < 0) {
6710 Py_DECREF(d_key);
6711 goto error;
6712 }
6713 Py_DECREF(d_key);
6714 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006715 Py_DECREF(dict);
6716 }
6717
6718 /* Also set instance attributes from the slotstate dict (if any). */
6719 if (slotstate != NULL) {
6720 PyObject *d_key, *d_value;
6721 Py_ssize_t i;
6722
6723 if (!PyDict_Check(slotstate)) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006724 PickleState *st = _Pickle_GetGlobalState();
6725 PyErr_SetString(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006726 "slot state is not a dictionary");
6727 goto error;
6728 }
6729 i = 0;
6730 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
6731 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
6732 goto error;
6733 }
6734 }
6735
6736 if (0) {
6737 error:
6738 status = -1;
6739 }
6740
6741 Py_DECREF(state);
6742 Py_XDECREF(slotstate);
6743 return status;
6744}
6745
6746static int
6747load_mark(UnpicklerObject *self)
6748{
6749
6750 /* Note that we split the (pickle.py) stack into two stacks, an
6751 * object stack and a mark stack. Here we push a mark onto the
6752 * mark stack.
6753 */
6754
Sergey Fedoseev86b89912018-08-25 12:54:40 +05006755 if (self->num_marks >= self->marks_size) {
Sergey Fedoseev90555ec2018-08-25 15:41:58 +05006756 size_t alloc = ((size_t)self->num_marks << 1) + 20;
6757 Py_ssize_t *marks_new = self->marks;
6758 PyMem_RESIZE(marks_new, Py_ssize_t, alloc);
6759 if (marks_new == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006760 PyErr_NoMemory();
6761 return -1;
6762 }
Sergey Fedoseev90555ec2018-08-25 15:41:58 +05006763 self->marks = marks_new;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006764 self->marks_size = (Py_ssize_t)alloc;
6765 }
6766
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006767 self->stack->mark_set = 1;
6768 self->marks[self->num_marks++] = self->stack->fence = Py_SIZE(self->stack);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006769
6770 return 0;
6771}
6772
6773static int
6774load_reduce(UnpicklerObject *self)
6775{
6776 PyObject *callable = NULL;
6777 PyObject *argtup = NULL;
6778 PyObject *obj = NULL;
6779
6780 PDATA_POP(self->stack, argtup);
6781 if (argtup == NULL)
6782 return -1;
6783 PDATA_POP(self->stack, callable);
6784 if (callable) {
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00006785 obj = PyObject_CallObject(callable, argtup);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006786 Py_DECREF(callable);
6787 }
6788 Py_DECREF(argtup);
6789
6790 if (obj == NULL)
6791 return -1;
6792
6793 PDATA_PUSH(self->stack, obj, -1);
6794 return 0;
6795}
6796
6797/* Just raises an error if we don't know the protocol specified. PROTO
6798 * is the first opcode for protocols >= 2.
6799 */
6800static int
6801load_proto(UnpicklerObject *self)
6802{
6803 char *s;
6804 int i;
6805
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006806 if (_Unpickler_Read(self, &s, 1) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006807 return -1;
6808
6809 i = (unsigned char)s[0];
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006810 if (i <= HIGHEST_PROTOCOL) {
6811 self->proto = i;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006812 return 0;
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00006813 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006814
6815 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
6816 return -1;
6817}
6818
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006819static int
6820load_frame(UnpicklerObject *self)
6821{
6822 char *s;
6823 Py_ssize_t frame_len;
6824
6825 if (_Unpickler_Read(self, &s, 8) < 0)
6826 return -1;
6827
6828 frame_len = calc_binsize(s, 8);
6829 if (frame_len < 0) {
6830 PyErr_Format(PyExc_OverflowError,
6831 "FRAME length exceeds system's maximum of %zd bytes",
6832 PY_SSIZE_T_MAX);
6833 return -1;
6834 }
6835
6836 if (_Unpickler_Read(self, &s, frame_len) < 0)
6837 return -1;
6838
6839 /* Rewind to start of frame */
6840 self->next_read_idx -= frame_len;
6841 return 0;
6842}
6843
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006844static PyObject *
6845load(UnpicklerObject *self)
6846{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006847 PyObject *value = NULL;
Christian Heimes27ea78b2014-01-27 01:03:53 +01006848 char *s = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006849
6850 self->num_marks = 0;
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02006851 self->stack->mark_set = 0;
6852 self->stack->fence = 0;
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006853 self->proto = 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00006854 if (Py_SIZE(self->stack))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006855 Pdata_clear(self->stack, 0);
6856
6857 /* Convenient macros for the dispatch while-switch loop just below. */
6858#define OP(opcode, load_func) \
6859 case opcode: if (load_func(self) < 0) break; continue;
6860
6861#define OP_ARG(opcode, load_func, arg) \
6862 case opcode: if (load_func(self, (arg)) < 0) break; continue;
6863
6864 while (1) {
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03006865 if (_Unpickler_Read(self, &s, 1) < 0) {
6866 PickleState *st = _Pickle_GetGlobalState();
6867 if (PyErr_ExceptionMatches(st->UnpicklingError)) {
6868 PyErr_Format(PyExc_EOFError, "Ran out of input");
6869 }
6870 return NULL;
6871 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006872
6873 switch ((enum opcode)s[0]) {
6874 OP(NONE, load_none)
6875 OP(BININT, load_binint)
6876 OP(BININT1, load_binint1)
6877 OP(BININT2, load_binint2)
6878 OP(INT, load_int)
6879 OP(LONG, load_long)
6880 OP_ARG(LONG1, load_counted_long, 1)
6881 OP_ARG(LONG4, load_counted_long, 4)
6882 OP(FLOAT, load_float)
6883 OP(BINFLOAT, load_binfloat)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006884 OP_ARG(SHORT_BINBYTES, load_counted_binbytes, 1)
6885 OP_ARG(BINBYTES, load_counted_binbytes, 4)
6886 OP_ARG(BINBYTES8, load_counted_binbytes, 8)
Antoine Pitrou91f43802019-05-26 17:10:09 +02006887 OP(BYTEARRAY8, load_counted_bytearray)
6888 OP(NEXT_BUFFER, load_next_buffer)
6889 OP(READONLY_BUFFER, load_readonly_buffer)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006890 OP_ARG(SHORT_BINSTRING, load_counted_binstring, 1)
6891 OP_ARG(BINSTRING, load_counted_binstring, 4)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006892 OP(STRING, load_string)
6893 OP(UNICODE, load_unicode)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006894 OP_ARG(SHORT_BINUNICODE, load_counted_binunicode, 1)
6895 OP_ARG(BINUNICODE, load_counted_binunicode, 4)
6896 OP_ARG(BINUNICODE8, load_counted_binunicode, 8)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006897 OP_ARG(EMPTY_TUPLE, load_counted_tuple, 0)
6898 OP_ARG(TUPLE1, load_counted_tuple, 1)
6899 OP_ARG(TUPLE2, load_counted_tuple, 2)
6900 OP_ARG(TUPLE3, load_counted_tuple, 3)
6901 OP(TUPLE, load_tuple)
6902 OP(EMPTY_LIST, load_empty_list)
6903 OP(LIST, load_list)
6904 OP(EMPTY_DICT, load_empty_dict)
6905 OP(DICT, load_dict)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006906 OP(EMPTY_SET, load_empty_set)
6907 OP(ADDITEMS, load_additems)
6908 OP(FROZENSET, load_frozenset)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006909 OP(OBJ, load_obj)
6910 OP(INST, load_inst)
6911 OP(NEWOBJ, load_newobj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006912 OP(NEWOBJ_EX, load_newobj_ex)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006913 OP(GLOBAL, load_global)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006914 OP(STACK_GLOBAL, load_stack_global)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006915 OP(APPEND, load_append)
6916 OP(APPENDS, load_appends)
6917 OP(BUILD, load_build)
6918 OP(DUP, load_dup)
6919 OP(BINGET, load_binget)
6920 OP(LONG_BINGET, load_long_binget)
6921 OP(GET, load_get)
6922 OP(MARK, load_mark)
6923 OP(BINPUT, load_binput)
6924 OP(LONG_BINPUT, load_long_binput)
6925 OP(PUT, load_put)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01006926 OP(MEMOIZE, load_memoize)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006927 OP(POP, load_pop)
6928 OP(POP_MARK, load_pop_mark)
6929 OP(SETITEM, load_setitem)
6930 OP(SETITEMS, load_setitems)
6931 OP(PERSID, load_persid)
6932 OP(BINPERSID, load_binpersid)
6933 OP(REDUCE, load_reduce)
6934 OP(PROTO, load_proto)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006935 OP(FRAME, load_frame)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006936 OP_ARG(EXT1, load_extension, 1)
6937 OP_ARG(EXT2, load_extension, 2)
6938 OP_ARG(EXT4, load_extension, 4)
6939 OP_ARG(NEWTRUE, load_bool, Py_True)
6940 OP_ARG(NEWFALSE, load_bool, Py_False)
6941
6942 case STOP:
6943 break;
6944
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006945 default:
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03006946 {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006947 PickleState *st = _Pickle_GetGlobalState();
Serhiy Storchaka90493ab2016-09-06 23:55:11 +03006948 unsigned char c = (unsigned char) *s;
6949 if (0x20 <= c && c <= 0x7e && c != '\'' && c != '\\') {
6950 PyErr_Format(st->UnpicklingError,
6951 "invalid load key, '%c'.", c);
6952 }
6953 else {
6954 PyErr_Format(st->UnpicklingError,
6955 "invalid load key, '\\x%02x'.", c);
6956 }
6957 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006958 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006959 }
6960
6961 break; /* and we are done! */
6962 }
6963
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08006964 if (PyErr_Occurred()) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006965 return NULL;
6966 }
6967
Victor Stinner2ae57e32013-10-31 13:39:23 +01006968 if (_Unpickler_SkipConsumed(self) < 0)
6969 return NULL;
6970
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006971 PDATA_POP(self->stack, value);
6972 return value;
6973}
6974
Larry Hastings61272b72014-01-07 12:41:53 -08006975/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006976
6977_pickle.Unpickler.load
6978
6979Load a pickle.
6980
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08006981Read a pickled object representation from the open file object given
6982in the constructor, and return the reconstituted object hierarchy
6983specified therein.
Larry Hastings61272b72014-01-07 12:41:53 -08006984[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006985
Larry Hastings3cceb382014-01-04 11:09:09 -08006986static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -08006987_pickle_Unpickler_load_impl(UnpicklerObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08006988/*[clinic end generated code: output=fdcc488aad675b14 input=acbb91a42fa9b7b9]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006989{
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006990 UnpicklerObject *unpickler = (UnpicklerObject*)self;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006991
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006992 /* Check whether the Unpickler was initialized correctly. This prevents
6993 segfaulting if a subclass overridden __init__ with a function that does
6994 not call Unpickler.__init__(). Here, we simply ensure that self->read
6995 is not NULL. */
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08006996 if (unpickler->read == NULL) {
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08006997 PickleState *st = _Pickle_GetGlobalState();
6998 PyErr_Format(st->UnpicklingError,
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00006999 "Unpickler.__init__() was not called by %s.__init__()",
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007000 Py_TYPE(unpickler)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007001 return NULL;
7002 }
7003
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007004 return load(unpickler);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007005}
7006
7007/* The name of find_class() is misleading. In newer pickle protocols, this
7008 function is used for loading any global (i.e., functions), not just
7009 classes. The name is kept only for backward compatibility. */
7010
Larry Hastings61272b72014-01-07 12:41:53 -08007011/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007012
7013_pickle.Unpickler.find_class
7014
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007015 module_name: object
7016 global_name: object
7017 /
7018
7019Return an object from a specified module.
7020
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007021If necessary, the module will be imported. Subclasses may override
7022this method (e.g. to restrict unpickling of arbitrary classes and
7023functions).
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007024
7025This method is called whenever a class or a function object is
7026needed. Both arguments passed are str objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007027[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007028
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007029static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -04007030_pickle_Unpickler_find_class_impl(UnpicklerObject *self,
7031 PyObject *module_name,
7032 PyObject *global_name)
7033/*[clinic end generated code: output=becc08d7f9ed41e3 input=e2e6a865de093ef4]*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007034{
7035 PyObject *global;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007036 PyObject *module;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007037
Steve Dowerb82e17e2019-05-23 08:45:22 -07007038 if (PySys_Audit("pickle.find_class", "OO",
7039 module_name, global_name) < 0) {
7040 return NULL;
7041 }
7042
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007043 /* Try to map the old names used in Python 2.x to the new ones used in
7044 Python 3.x. We do this only with old pickle protocols and when the
7045 user has not disabled the feature. */
7046 if (self->proto < 3 && self->fix_imports) {
7047 PyObject *key;
7048 PyObject *item;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007049 PickleState *st = _Pickle_GetGlobalState();
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007050
7051 /* Check if the global (i.e., a function or a class) was renamed
7052 or moved to another module. */
7053 key = PyTuple_Pack(2, module_name, global_name);
7054 if (key == NULL)
7055 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007056 item = PyDict_GetItemWithError(st->name_mapping_2to3, key);
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007057 Py_DECREF(key);
7058 if (item) {
7059 if (!PyTuple_Check(item) || PyTuple_GET_SIZE(item) != 2) {
7060 PyErr_Format(PyExc_RuntimeError,
7061 "_compat_pickle.NAME_MAPPING values should be "
7062 "2-tuples, not %.200s", Py_TYPE(item)->tp_name);
7063 return NULL;
7064 }
7065 module_name = PyTuple_GET_ITEM(item, 0);
7066 global_name = PyTuple_GET_ITEM(item, 1);
7067 if (!PyUnicode_Check(module_name) ||
7068 !PyUnicode_Check(global_name)) {
7069 PyErr_Format(PyExc_RuntimeError,
7070 "_compat_pickle.NAME_MAPPING values should be "
7071 "pairs of str, not (%.200s, %.200s)",
7072 Py_TYPE(module_name)->tp_name,
7073 Py_TYPE(global_name)->tp_name);
7074 return NULL;
7075 }
7076 }
7077 else if (PyErr_Occurred()) {
7078 return NULL;
7079 }
Serhiy Storchakabfe18242015-03-31 13:12:37 +03007080 else {
7081 /* Check if the module was renamed. */
7082 item = PyDict_GetItemWithError(st->import_mapping_2to3, module_name);
7083 if (item) {
7084 if (!PyUnicode_Check(item)) {
7085 PyErr_Format(PyExc_RuntimeError,
7086 "_compat_pickle.IMPORT_MAPPING values should be "
7087 "strings, not %.200s", Py_TYPE(item)->tp_name);
7088 return NULL;
7089 }
7090 module_name = item;
7091 }
7092 else if (PyErr_Occurred()) {
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007093 return NULL;
7094 }
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007095 }
7096 }
7097
tjb9004371c0a2019-02-18 23:30:51 +08007098 /*
7099 * we don't use PyImport_GetModule here, because it can return partially-
7100 * initialised modules, which then cause the getattribute to fail.
7101 */
7102 module = PyImport_Import(module_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007103 if (module == NULL) {
tjb9004371c0a2019-02-18 23:30:51 +08007104 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007105 }
Eric Snow3f9eee62017-09-15 16:35:20 -06007106 global = getattribute(module, global_name, self->proto >= 4);
7107 Py_DECREF(module);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007108 return global;
7109}
7110
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02007111/*[clinic input]
7112
7113_pickle.Unpickler.__sizeof__ -> Py_ssize_t
7114
7115Returns size in memory, in bytes.
7116[clinic start generated code]*/
7117
7118static Py_ssize_t
7119_pickle_Unpickler___sizeof___impl(UnpicklerObject *self)
7120/*[clinic end generated code: output=119d9d03ad4c7651 input=13333471fdeedf5e]*/
7121{
7122 Py_ssize_t res;
7123
Serhiy Storchaka5c4064e2015-12-19 20:05:25 +02007124 res = _PyObject_SIZE(Py_TYPE(self));
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02007125 if (self->memo != NULL)
7126 res += self->memo_size * sizeof(PyObject *);
7127 if (self->marks != NULL)
7128 res += self->marks_size * sizeof(Py_ssize_t);
7129 if (self->input_line != NULL)
7130 res += strlen(self->input_line) + 1;
7131 if (self->encoding != NULL)
7132 res += strlen(self->encoding) + 1;
7133 if (self->errors != NULL)
7134 res += strlen(self->errors) + 1;
7135 return res;
7136}
7137
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007138static struct PyMethodDef Unpickler_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007139 _PICKLE_UNPICKLER_LOAD_METHODDEF
7140 _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF
Serhiy Storchaka5bbd2312014-12-16 19:39:08 +02007141 _PICKLE_UNPICKLER___SIZEOF___METHODDEF
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007142 {NULL, NULL} /* sentinel */
7143};
7144
7145static void
7146Unpickler_dealloc(UnpicklerObject *self)
7147{
7148 PyObject_GC_UnTrack((PyObject *)self);
7149 Py_XDECREF(self->readline);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007150 Py_XDECREF(self->readinto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007151 Py_XDECREF(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00007152 Py_XDECREF(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007153 Py_XDECREF(self->stack);
7154 Py_XDECREF(self->pers_func);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007155 Py_XDECREF(self->buffers);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007156 if (self->buffer.buf != NULL) {
7157 PyBuffer_Release(&self->buffer);
7158 self->buffer.buf = NULL;
7159 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007160
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007161 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007162 PyMem_Free(self->marks);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007163 PyMem_Free(self->input_line);
Victor Stinner49fc8ec2013-07-07 23:30:24 +02007164 PyMem_Free(self->encoding);
7165 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007166
7167 Py_TYPE(self)->tp_free((PyObject *)self);
7168}
7169
7170static int
7171Unpickler_traverse(UnpicklerObject *self, visitproc visit, void *arg)
7172{
7173 Py_VISIT(self->readline);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007174 Py_VISIT(self->readinto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007175 Py_VISIT(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00007176 Py_VISIT(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007177 Py_VISIT(self->stack);
7178 Py_VISIT(self->pers_func);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007179 Py_VISIT(self->buffers);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007180 return 0;
7181}
7182
7183static int
7184Unpickler_clear(UnpicklerObject *self)
7185{
7186 Py_CLEAR(self->readline);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007187 Py_CLEAR(self->readinto);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007188 Py_CLEAR(self->read);
Antoine Pitrou04248a82010-10-12 20:51:21 +00007189 Py_CLEAR(self->peek);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007190 Py_CLEAR(self->stack);
7191 Py_CLEAR(self->pers_func);
Antoine Pitrou91f43802019-05-26 17:10:09 +02007192 Py_CLEAR(self->buffers);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007193 if (self->buffer.buf != NULL) {
7194 PyBuffer_Release(&self->buffer);
7195 self->buffer.buf = NULL;
7196 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007197
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007198 _Unpickler_MemoCleanup(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007199 PyMem_Free(self->marks);
7200 self->marks = NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007201 PyMem_Free(self->input_line);
7202 self->input_line = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02007203 PyMem_Free(self->encoding);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007204 self->encoding = NULL;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02007205 PyMem_Free(self->errors);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007206 self->errors = NULL;
7207
7208 return 0;
7209}
7210
Larry Hastings61272b72014-01-07 12:41:53 -08007211/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007212
7213_pickle.Unpickler.__init__
7214
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007215 file: object
7216 *
7217 fix_imports: bool = True
7218 encoding: str = 'ASCII'
7219 errors: str = 'strict'
Serhiy Storchakad322abb2019-09-14 13:31:50 +03007220 buffers: object(c_default="NULL") = ()
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007221
7222This takes a binary file for reading a pickle data stream.
7223
7224The protocol version of the pickle is detected automatically, so no
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007225protocol argument is needed. Bytes past the pickled object's
7226representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007227
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007228The argument *file* must have two methods, a read() method that takes
7229an integer argument, and a readline() method that requires no
7230arguments. Both methods should return bytes. Thus *file* can be a
Martin Panter7462b6492015-11-02 03:37:02 +00007231binary file object opened for reading, an io.BytesIO object, or any
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007232other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007233
7234Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00007235which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007236generated by Python 2. If *fix_imports* is True, pickle will try to
7237map the old Python 2 names to the new names used in Python 3. The
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007238*encoding* and *errors* tell pickle how to decode 8-bit string
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007239instances pickled by Python 2; these default to 'ASCII' and 'strict',
7240respectively. The *encoding* can be 'bytes' to read these 8-bit
7241string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007242[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007243
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007244static int
Larry Hastings89964c42015-04-14 18:07:59 -04007245_pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file,
7246 int fix_imports, const char *encoding,
Antoine Pitrou91f43802019-05-26 17:10:09 +02007247 const char *errors, PyObject *buffers)
Serhiy Storchakad322abb2019-09-14 13:31:50 +03007248/*[clinic end generated code: output=09f0192649ea3f85 input=ca4c1faea9553121]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007249{
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02007250 _Py_IDENTIFIER(persistent_load);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007251
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007252 /* In case of multiple __init__() calls, clear previous content. */
7253 if (self->read != NULL)
7254 (void)Unpickler_clear(self);
7255
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007256 if (_Unpickler_SetInputStream(self, file) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007257 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007258
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007259 if (_Unpickler_SetInputEncoding(self, encoding, errors) < 0)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007260 return -1;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007261
Antoine Pitrou91f43802019-05-26 17:10:09 +02007262 if (_Unpickler_SetBuffers(self, buffers) < 0)
7263 return -1;
7264
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007265 self->fix_imports = fix_imports;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007266
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007267 if (init_method_ref((PyObject *)self, &PyId_persistent_load,
7268 &self->pers_func, &self->pers_func_self) < 0)
7269 {
7270 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007271 }
7272
7273 self->stack = (Pdata *)Pdata_New();
7274 if (self->stack == NULL)
Zackery Spytz4b430e52018-09-28 23:48:46 -06007275 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007276
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007277 self->memo_size = 32;
7278 self->memo = _Unpickler_NewMemo(self->memo_size);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007279 if (self->memo == NULL)
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007280 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007281
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00007282 self->proto = 0;
Alexandre Vassalotti0e7aa8c2009-04-03 04:17:41 +00007283
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007284 return 0;
7285}
7286
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007287
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007288/* Define a proxy object for the Unpickler's internal memo object. This is to
7289 * avoid breaking code like:
7290 * unpickler.memo.clear()
7291 * and
7292 * unpickler.memo = saved_memo
7293 * Is this a good idea? Not really, but we don't want to break code that uses
7294 * it. Note that we don't implement the entire mapping API here. This is
7295 * intentional, as these should be treated as black-box implementation details.
7296 *
7297 * We do, however, have to implement pickling/unpickling support because of
Victor Stinner121aab42011-09-29 23:40:53 +02007298 * real-world code like cvs2svn.
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007299 */
7300
Larry Hastings61272b72014-01-07 12:41:53 -08007301/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007302_pickle.UnpicklerMemoProxy.clear
7303
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007304Remove all items from memo.
Larry Hastings61272b72014-01-07 12:41:53 -08007305[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007306
Larry Hastings3cceb382014-01-04 11:09:09 -08007307static PyObject *
7308_pickle_UnpicklerMemoProxy_clear_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08007309/*[clinic end generated code: output=d20cd43f4ba1fb1f input=b1df7c52e7afd9bd]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007310{
7311 _Unpickler_MemoCleanup(self->unpickler);
7312 self->unpickler->memo = _Unpickler_NewMemo(self->unpickler->memo_size);
7313 if (self->unpickler->memo == NULL)
7314 return NULL;
7315 Py_RETURN_NONE;
7316}
7317
Larry Hastings61272b72014-01-07 12:41:53 -08007318/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007319_pickle.UnpicklerMemoProxy.copy
7320
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007321Copy the memo to a new object.
Larry Hastings61272b72014-01-07 12:41:53 -08007322[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007323
Larry Hastings3cceb382014-01-04 11:09:09 -08007324static PyObject *
7325_pickle_UnpicklerMemoProxy_copy_impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08007326/*[clinic end generated code: output=e12af7e9bc1e4c77 input=97769247ce032c1d]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007327{
Benjamin Petersona4ae8282018-09-20 18:36:40 -07007328 size_t i;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007329 PyObject *new_memo = PyDict_New();
7330 if (new_memo == NULL)
7331 return NULL;
7332
7333 for (i = 0; i < self->unpickler->memo_size; i++) {
7334 int status;
7335 PyObject *key, *value;
7336
7337 value = self->unpickler->memo[i];
7338 if (value == NULL)
7339 continue;
7340
7341 key = PyLong_FromSsize_t(i);
7342 if (key == NULL)
7343 goto error;
7344 status = PyDict_SetItem(new_memo, key, value);
7345 Py_DECREF(key);
7346 if (status < 0)
7347 goto error;
7348 }
7349 return new_memo;
7350
7351error:
7352 Py_DECREF(new_memo);
7353 return NULL;
7354}
7355
Larry Hastings61272b72014-01-07 12:41:53 -08007356/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007357_pickle.UnpicklerMemoProxy.__reduce__
7358
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007359Implement pickling support.
Larry Hastings61272b72014-01-07 12:41:53 -08007360[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007361
Larry Hastings3cceb382014-01-04 11:09:09 -08007362static PyObject *
7363_pickle_UnpicklerMemoProxy___reduce___impl(UnpicklerMemoProxyObject *self)
Larry Hastings581ee362014-01-28 05:00:08 -08007364/*[clinic end generated code: output=6da34ac048d94cca input=6920862413407199]*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007365{
7366 PyObject *reduce_value;
7367 PyObject *constructor_args;
Larry Hastings3cceb382014-01-04 11:09:09 -08007368 PyObject *contents = _pickle_UnpicklerMemoProxy_copy_impl(self);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007369 if (contents == NULL)
7370 return NULL;
7371
7372 reduce_value = PyTuple_New(2);
7373 if (reduce_value == NULL) {
7374 Py_DECREF(contents);
7375 return NULL;
7376 }
7377 constructor_args = PyTuple_New(1);
7378 if (constructor_args == NULL) {
7379 Py_DECREF(contents);
7380 Py_DECREF(reduce_value);
7381 return NULL;
7382 }
7383 PyTuple_SET_ITEM(constructor_args, 0, contents);
7384 Py_INCREF((PyObject *)&PyDict_Type);
7385 PyTuple_SET_ITEM(reduce_value, 0, (PyObject *)&PyDict_Type);
7386 PyTuple_SET_ITEM(reduce_value, 1, constructor_args);
7387 return reduce_value;
7388}
7389
7390static PyMethodDef unpicklerproxy_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007391 _PICKLE_UNPICKLERMEMOPROXY_CLEAR_METHODDEF
7392 _PICKLE_UNPICKLERMEMOPROXY_COPY_METHODDEF
7393 _PICKLE_UNPICKLERMEMOPROXY___REDUCE___METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007394 {NULL, NULL} /* sentinel */
7395};
7396
7397static void
7398UnpicklerMemoProxy_dealloc(UnpicklerMemoProxyObject *self)
7399{
7400 PyObject_GC_UnTrack(self);
7401 Py_XDECREF(self->unpickler);
7402 PyObject_GC_Del((PyObject *)self);
7403}
7404
7405static int
7406UnpicklerMemoProxy_traverse(UnpicklerMemoProxyObject *self,
7407 visitproc visit, void *arg)
7408{
7409 Py_VISIT(self->unpickler);
7410 return 0;
7411}
7412
7413static int
7414UnpicklerMemoProxy_clear(UnpicklerMemoProxyObject *self)
7415{
7416 Py_CLEAR(self->unpickler);
7417 return 0;
7418}
7419
7420static PyTypeObject UnpicklerMemoProxyType = {
7421 PyVarObject_HEAD_INIT(NULL, 0)
7422 "_pickle.UnpicklerMemoProxy", /*tp_name*/
7423 sizeof(UnpicklerMemoProxyObject), /*tp_basicsize*/
7424 0,
7425 (destructor)UnpicklerMemoProxy_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02007426 0, /* tp_vectorcall_offset */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007427 0, /* tp_getattr */
7428 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02007429 0, /* tp_as_async */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007430 0, /* tp_repr */
7431 0, /* tp_as_number */
7432 0, /* tp_as_sequence */
7433 0, /* tp_as_mapping */
Georg Brandlf038b322010-10-18 07:35:09 +00007434 PyObject_HashNotImplemented, /* tp_hash */
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007435 0, /* tp_call */
7436 0, /* tp_str */
7437 PyObject_GenericGetAttr, /* tp_getattro */
7438 PyObject_GenericSetAttr, /* tp_setattro */
7439 0, /* tp_as_buffer */
7440 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
7441 0, /* tp_doc */
7442 (traverseproc)UnpicklerMemoProxy_traverse, /* tp_traverse */
7443 (inquiry)UnpicklerMemoProxy_clear, /* tp_clear */
7444 0, /* tp_richcompare */
7445 0, /* tp_weaklistoffset */
7446 0, /* tp_iter */
7447 0, /* tp_iternext */
7448 unpicklerproxy_methods, /* tp_methods */
7449};
7450
7451static PyObject *
7452UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
7453{
7454 UnpicklerMemoProxyObject *self;
7455
7456 self = PyObject_GC_New(UnpicklerMemoProxyObject,
7457 &UnpicklerMemoProxyType);
7458 if (self == NULL)
7459 return NULL;
7460 Py_INCREF(unpickler);
7461 self->unpickler = unpickler;
7462 PyObject_GC_Track(self);
7463 return (PyObject *)self;
7464}
7465
7466/*****************************************************************************/
7467
7468
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007469static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02007470Unpickler_get_memo(UnpicklerObject *self, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007471{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007472 return UnpicklerMemoProxy_New(self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007473}
7474
7475static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02007476Unpickler_set_memo(UnpicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007477{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007478 PyObject **new_memo;
Benjamin Petersona4ae8282018-09-20 18:36:40 -07007479 size_t new_memo_size = 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007480
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007481 if (obj == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007482 PyErr_SetString(PyExc_TypeError,
7483 "attribute deletion is not supported");
7484 return -1;
7485 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007486
7487 if (Py_TYPE(obj) == &UnpicklerMemoProxyType) {
7488 UnpicklerObject *unpickler =
7489 ((UnpicklerMemoProxyObject *)obj)->unpickler;
7490
7491 new_memo_size = unpickler->memo_size;
7492 new_memo = _Unpickler_NewMemo(new_memo_size);
7493 if (new_memo == NULL)
7494 return -1;
7495
Benjamin Petersona4ae8282018-09-20 18:36:40 -07007496 for (size_t i = 0; i < new_memo_size; i++) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007497 Py_XINCREF(unpickler->memo[i]);
7498 new_memo[i] = unpickler->memo[i];
7499 }
7500 }
7501 else if (PyDict_Check(obj)) {
7502 Py_ssize_t i = 0;
7503 PyObject *key, *value;
7504
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02007505 new_memo_size = PyDict_GET_SIZE(obj);
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007506 new_memo = _Unpickler_NewMemo(new_memo_size);
7507 if (new_memo == NULL)
7508 return -1;
7509
7510 while (PyDict_Next(obj, &i, &key, &value)) {
7511 Py_ssize_t idx;
7512 if (!PyLong_Check(key)) {
7513 PyErr_SetString(PyExc_TypeError,
7514 "memo key must be integers");
7515 goto error;
7516 }
7517 idx = PyLong_AsSsize_t(key);
7518 if (idx == -1 && PyErr_Occurred())
7519 goto error;
Christian Heimesa24b4d22013-07-01 15:17:45 +02007520 if (idx < 0) {
7521 PyErr_SetString(PyExc_ValueError,
Christian Heimes80878792013-07-01 15:23:39 +02007522 "memo key must be positive integers.");
Christian Heimesa24b4d22013-07-01 15:17:45 +02007523 goto error;
7524 }
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007525 if (_Unpickler_MemoPut(self, idx, value) < 0)
7526 goto error;
7527 }
7528 }
7529 else {
7530 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02007531 "'memo' attribute must be an UnpicklerMemoProxy object "
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007532 "or dict, not %.200s", Py_TYPE(obj)->tp_name);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007533 return -1;
7534 }
7535
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007536 _Unpickler_MemoCleanup(self);
7537 self->memo_size = new_memo_size;
7538 self->memo = new_memo;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007539
7540 return 0;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007541
7542 error:
7543 if (new_memo_size) {
Benjamin Petersona4ae8282018-09-20 18:36:40 -07007544 for (size_t i = new_memo_size - 1; i != SIZE_MAX; i--) {
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007545 Py_XDECREF(new_memo[i]);
7546 }
7547 PyMem_FREE(new_memo);
7548 }
7549 return -1;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007550}
7551
7552static PyObject *
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02007553Unpickler_get_persload(UnpicklerObject *self, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007554{
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007555 if (self->pers_func == NULL) {
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007556 PyErr_SetString(PyExc_AttributeError, "persistent_load");
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007557 return NULL;
7558 }
7559 return reconstruct_method(self->pers_func, self->pers_func_self);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007560}
7561
7562static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02007563Unpickler_set_persload(UnpicklerObject *self, PyObject *value, void *Py_UNUSED(ignored))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007564{
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007565 if (value == NULL) {
7566 PyErr_SetString(PyExc_TypeError,
7567 "attribute deletion is not supported");
7568 return -1;
7569 }
7570 if (!PyCallable_Check(value)) {
7571 PyErr_SetString(PyExc_TypeError,
7572 "persistent_load must be a callable taking "
7573 "one argument");
7574 return -1;
7575 }
7576
Serhiy Storchaka986375e2017-11-30 22:48:31 +02007577 self->pers_func_self = NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007578 Py_INCREF(value);
Serhiy Storchakaec397562016-04-06 09:50:03 +03007579 Py_XSETREF(self->pers_func, value);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007580
7581 return 0;
7582}
7583
7584static PyGetSetDef Unpickler_getsets[] = {
7585 {"memo", (getter)Unpickler_get_memo, (setter)Unpickler_set_memo},
7586 {"persistent_load", (getter)Unpickler_get_persload,
7587 (setter)Unpickler_set_persload},
7588 {NULL}
7589};
7590
7591static PyTypeObject Unpickler_Type = {
7592 PyVarObject_HEAD_INIT(NULL, 0)
7593 "_pickle.Unpickler", /*tp_name*/
7594 sizeof(UnpicklerObject), /*tp_basicsize*/
7595 0, /*tp_itemsize*/
7596 (destructor)Unpickler_dealloc, /*tp_dealloc*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02007597 0, /*tp_vectorcall_offset*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007598 0, /*tp_getattr*/
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007599 0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02007600 0, /*tp_as_async*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007601 0, /*tp_repr*/
7602 0, /*tp_as_number*/
7603 0, /*tp_as_sequence*/
7604 0, /*tp_as_mapping*/
7605 0, /*tp_hash*/
7606 0, /*tp_call*/
7607 0, /*tp_str*/
7608 0, /*tp_getattro*/
7609 0, /*tp_setattro*/
7610 0, /*tp_as_buffer*/
7611 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007612 _pickle_Unpickler___init____doc__, /*tp_doc*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007613 (traverseproc)Unpickler_traverse, /*tp_traverse*/
7614 (inquiry)Unpickler_clear, /*tp_clear*/
7615 0, /*tp_richcompare*/
7616 0, /*tp_weaklistoffset*/
7617 0, /*tp_iter*/
7618 0, /*tp_iternext*/
7619 Unpickler_methods, /*tp_methods*/
7620 0, /*tp_members*/
7621 Unpickler_getsets, /*tp_getset*/
7622 0, /*tp_base*/
7623 0, /*tp_dict*/
7624 0, /*tp_descr_get*/
7625 0, /*tp_descr_set*/
7626 0, /*tp_dictoffset*/
Larry Hastingsb7ccb202014-01-18 23:50:21 -08007627 _pickle_Unpickler___init__, /*tp_init*/
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007628 PyType_GenericAlloc, /*tp_alloc*/
7629 PyType_GenericNew, /*tp_new*/
7630 PyObject_GC_Del, /*tp_free*/
7631 0, /*tp_is_gc*/
7632};
7633
Larry Hastings61272b72014-01-07 12:41:53 -08007634/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007635
7636_pickle.dump
7637
7638 obj: object
7639 file: object
Serhiy Storchakad322abb2019-09-14 13:31:50 +03007640 protocol: object = None
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007641 *
7642 fix_imports: bool = True
Serhiy Storchakad322abb2019-09-14 13:31:50 +03007643 buffer_callback: object = None
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007644
7645Write a pickled representation of obj to the open file object file.
7646
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007647This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may
7648be more efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007649
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007650The optional *protocol* argument tells the pickler to use the given
Miss Islington (bot)a46728a2020-01-24 02:20:35 -08007651protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default
7652protocol is 4. It was introduced in Python 3.4, and is incompatible
Łukasz Langac51d8c92018-04-03 23:06:53 -07007653with previous versions.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007654
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007655Specifying a negative protocol version selects the highest protocol
7656version supported. The higher the protocol used, the more recent the
7657version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007658
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007659The *file* argument must have a write() method that accepts a single
7660bytes argument. It can thus be a file object opened for binary
Martin Panter7462b6492015-11-02 03:37:02 +00007661writing, an io.BytesIO instance, or any other custom object that meets
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007662this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007663
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007664If *fix_imports* is True and protocol is less than 3, pickle will try
7665to map the new Python 3 names to the old module names used in Python
76662, so that the pickle data stream is readable with Python 2.
Antoine Pitrou91f43802019-05-26 17:10:09 +02007667
7668If *buffer_callback* is None (the default), buffer views are serialized
7669into *file* as part of the pickle stream. It is an error if
7670*buffer_callback* is not None and *protocol* is None or smaller than 5.
7671
Larry Hastings61272b72014-01-07 12:41:53 -08007672[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007673
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007674static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007675_pickle_dump_impl(PyObject *module, PyObject *obj, PyObject *file,
Antoine Pitrou91f43802019-05-26 17:10:09 +02007676 PyObject *protocol, int fix_imports,
7677 PyObject *buffer_callback)
Miss Islington (bot)a46728a2020-01-24 02:20:35 -08007678/*[clinic end generated code: output=706186dba996490c input=5ed6653da99cd97c]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007679{
7680 PicklerObject *pickler = _Pickler_New();
7681
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007682 if (pickler == NULL)
7683 return NULL;
7684
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007685 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007686 goto error;
7687
7688 if (_Pickler_SetOutputStream(pickler, file) < 0)
7689 goto error;
7690
Antoine Pitrou91f43802019-05-26 17:10:09 +02007691 if (_Pickler_SetBufferCallback(pickler, buffer_callback) < 0)
7692 goto error;
7693
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007694 if (dump(pickler, obj) < 0)
7695 goto error;
7696
7697 if (_Pickler_FlushToFile(pickler) < 0)
7698 goto error;
7699
7700 Py_DECREF(pickler);
7701 Py_RETURN_NONE;
7702
7703 error:
7704 Py_XDECREF(pickler);
7705 return NULL;
7706}
7707
Larry Hastings61272b72014-01-07 12:41:53 -08007708/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007709
7710_pickle.dumps
7711
7712 obj: object
Serhiy Storchakad322abb2019-09-14 13:31:50 +03007713 protocol: object = None
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007714 *
7715 fix_imports: bool = True
Serhiy Storchakad322abb2019-09-14 13:31:50 +03007716 buffer_callback: object = None
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007717
7718Return the pickled representation of the object as a bytes object.
7719
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007720The optional *protocol* argument tells the pickler to use the given
Miss Islington (bot)a46728a2020-01-24 02:20:35 -08007721protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default
7722protocol is 4. It was introduced in Python 3.4, and is incompatible
Łukasz Langac51d8c92018-04-03 23:06:53 -07007723with previous versions.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007724
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007725Specifying a negative protocol version selects the highest protocol
7726version supported. The higher the protocol used, the more recent the
7727version of Python needed to read the pickle produced.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007728
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007729If *fix_imports* is True and *protocol* is less than 3, pickle will
7730try to map the new Python 3 names to the old module names used in
7731Python 2, so that the pickle data stream is readable with Python 2.
Antoine Pitrou91f43802019-05-26 17:10:09 +02007732
7733If *buffer_callback* is None (the default), buffer views are serialized
7734into *file* as part of the pickle stream. It is an error if
7735*buffer_callback* is not None and *protocol* is None or smaller than 5.
7736
Larry Hastings61272b72014-01-07 12:41:53 -08007737[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007738
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007739static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007740_pickle_dumps_impl(PyObject *module, PyObject *obj, PyObject *protocol,
Antoine Pitrou91f43802019-05-26 17:10:09 +02007741 int fix_imports, PyObject *buffer_callback)
Miss Islington (bot)a46728a2020-01-24 02:20:35 -08007742/*[clinic end generated code: output=fbab0093a5580fdf input=e543272436c6f987]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007743{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007744 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007745 PicklerObject *pickler = _Pickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007746
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007747 if (pickler == NULL)
7748 return NULL;
7749
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007750 if (_Pickler_SetProtocol(pickler, protocol, fix_imports) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007751 goto error;
7752
Antoine Pitrou91f43802019-05-26 17:10:09 +02007753 if (_Pickler_SetBufferCallback(pickler, buffer_callback) < 0)
7754 goto error;
7755
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007756 if (dump(pickler, obj) < 0)
7757 goto error;
7758
7759 result = _Pickler_GetString(pickler);
7760 Py_DECREF(pickler);
7761 return result;
7762
7763 error:
7764 Py_XDECREF(pickler);
7765 return NULL;
7766}
7767
Larry Hastings61272b72014-01-07 12:41:53 -08007768/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007769
7770_pickle.load
7771
7772 file: object
7773 *
7774 fix_imports: bool = True
7775 encoding: str = 'ASCII'
7776 errors: str = 'strict'
Serhiy Storchakad322abb2019-09-14 13:31:50 +03007777 buffers: object(c_default="NULL") = ()
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007778
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007779Read and return an object from the pickle data stored in a file.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007780
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007781This is equivalent to ``Unpickler(file).load()``, but may be more
7782efficient.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007783
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007784The protocol version of the pickle is detected automatically, so no
7785protocol argument is needed. Bytes past the pickled object's
7786representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007787
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007788The argument *file* must have two methods, a read() method that takes
7789an integer argument, and a readline() method that requires no
7790arguments. Both methods should return bytes. Thus *file* can be a
Martin Panter7462b6492015-11-02 03:37:02 +00007791binary file object opened for reading, an io.BytesIO object, or any
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007792other custom object that meets this interface.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007793
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007794Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00007795which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007796generated by Python 2. If *fix_imports* is True, pickle will try to
7797map the old Python 2 names to the new names used in Python 3. The
7798*encoding* and *errors* tell pickle how to decode 8-bit string
7799instances pickled by Python 2; these default to 'ASCII' and 'strict',
7800respectively. The *encoding* can be 'bytes' to read these 8-bit
7801string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007802[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007803
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007804static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007805_pickle_load_impl(PyObject *module, PyObject *file, int fix_imports,
Antoine Pitrou91f43802019-05-26 17:10:09 +02007806 const char *encoding, const char *errors,
7807 PyObject *buffers)
Serhiy Storchakad322abb2019-09-14 13:31:50 +03007808/*[clinic end generated code: output=250452d141c23e76 input=46c7c31c92f4f371]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007809{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007810 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007811 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007812
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007813 if (unpickler == NULL)
7814 return NULL;
7815
7816 if (_Unpickler_SetInputStream(unpickler, file) < 0)
7817 goto error;
7818
7819 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7820 goto error;
7821
Antoine Pitrou91f43802019-05-26 17:10:09 +02007822 if (_Unpickler_SetBuffers(unpickler, buffers) < 0)
7823 goto error;
7824
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007825 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007826
7827 result = load(unpickler);
7828 Py_DECREF(unpickler);
7829 return result;
7830
7831 error:
7832 Py_XDECREF(unpickler);
7833 return NULL;
7834}
7835
Larry Hastings61272b72014-01-07 12:41:53 -08007836/*[clinic input]
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007837
7838_pickle.loads
7839
7840 data: object
7841 *
7842 fix_imports: bool = True
7843 encoding: str = 'ASCII'
7844 errors: str = 'strict'
Serhiy Storchakad322abb2019-09-14 13:31:50 +03007845 buffers: object(c_default="NULL") = ()
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007846
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007847Read and return an object from the given pickle data.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007848
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007849The protocol version of the pickle is detected automatically, so no
7850protocol argument is needed. Bytes past the pickled object's
7851representation are ignored.
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007852
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007853Optional keyword arguments are *fix_imports*, *encoding* and *errors*,
Martin Panter46f50722016-05-26 05:35:26 +00007854which are used to control compatibility support for pickle stream
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08007855generated by Python 2. If *fix_imports* is True, pickle will try to
7856map the old Python 2 names to the new names used in Python 3. The
7857*encoding* and *errors* tell pickle how to decode 8-bit string
7858instances pickled by Python 2; these default to 'ASCII' and 'strict',
7859respectively. The *encoding* can be 'bytes' to read these 8-bit
7860string instances as bytes objects.
Larry Hastings61272b72014-01-07 12:41:53 -08007861[clinic start generated code]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007862
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007863static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007864_pickle_loads_impl(PyObject *module, PyObject *data, int fix_imports,
Antoine Pitrou91f43802019-05-26 17:10:09 +02007865 const char *encoding, const char *errors,
7866 PyObject *buffers)
Serhiy Storchakad322abb2019-09-14 13:31:50 +03007867/*[clinic end generated code: output=82ac1e6b588e6d02 input=9c2ab6a0960185ea]*/
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007868{
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007869 PyObject *result;
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007870 UnpicklerObject *unpickler = _Unpickler_New();
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007871
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007872 if (unpickler == NULL)
7873 return NULL;
7874
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007875 if (_Unpickler_SetStringInput(unpickler, data) < 0)
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007876 goto error;
7877
7878 if (_Unpickler_SetInputEncoding(unpickler, encoding, errors) < 0)
7879 goto error;
7880
Antoine Pitrou91f43802019-05-26 17:10:09 +02007881 if (_Unpickler_SetBuffers(unpickler, buffers) < 0)
7882 goto error;
7883
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007884 unpickler->fix_imports = fix_imports;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007885
7886 result = load(unpickler);
7887 Py_DECREF(unpickler);
7888 return result;
7889
7890 error:
7891 Py_XDECREF(unpickler);
7892 return NULL;
7893}
7894
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007895static struct PyMethodDef pickle_methods[] = {
Alexandre Vassalottied8c9062013-11-24 12:25:48 -08007896 _PICKLE_DUMP_METHODDEF
7897 _PICKLE_DUMPS_METHODDEF
7898 _PICKLE_LOAD_METHODDEF
7899 _PICKLE_LOADS_METHODDEF
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007900 {NULL, NULL} /* sentinel */
7901};
7902
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007903static int
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007904pickle_clear(PyObject *m)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007905{
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007906 _Pickle_ClearState(_Pickle_GetState(m));
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007907 return 0;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007908}
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007909
Stefan Krahf483b0f2013-12-14 13:43:10 +01007910static void
7911pickle_free(PyObject *m)
7912{
7913 _Pickle_ClearState(_Pickle_GetState(m));
7914}
7915
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007916static int
7917pickle_traverse(PyObject *m, visitproc visit, void *arg)
7918{
7919 PickleState *st = _Pickle_GetState(m);
7920 Py_VISIT(st->PickleError);
7921 Py_VISIT(st->PicklingError);
7922 Py_VISIT(st->UnpicklingError);
7923 Py_VISIT(st->dispatch_table);
7924 Py_VISIT(st->extension_registry);
7925 Py_VISIT(st->extension_cache);
7926 Py_VISIT(st->inverted_registry);
7927 Py_VISIT(st->name_mapping_2to3);
7928 Py_VISIT(st->import_mapping_2to3);
7929 Py_VISIT(st->name_mapping_3to2);
7930 Py_VISIT(st->import_mapping_3to2);
7931 Py_VISIT(st->codecs_encode);
Serhiy Storchaka58e41342015-03-31 14:07:24 +03007932 Py_VISIT(st->getattr);
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007933 return 0;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007934}
7935
7936static struct PyModuleDef _picklemodule = {
7937 PyModuleDef_HEAD_INIT,
Stefan Krahf483b0f2013-12-14 13:43:10 +01007938 "_pickle", /* m_name */
7939 pickle_module_doc, /* m_doc */
7940 sizeof(PickleState), /* m_size */
7941 pickle_methods, /* m_methods */
7942 NULL, /* m_reload */
7943 pickle_traverse, /* m_traverse */
7944 pickle_clear, /* m_clear */
7945 (freefunc)pickle_free /* m_free */
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007946};
7947
7948PyMODINIT_FUNC
7949PyInit__pickle(void)
7950{
7951 PyObject *m;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007952 PickleState *st;
7953
7954 m = PyState_FindModule(&_picklemodule);
7955 if (m) {
7956 Py_INCREF(m);
7957 return m;
7958 }
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007959
7960 if (PyType_Ready(&Unpickler_Type) < 0)
7961 return NULL;
7962 if (PyType_Ready(&Pickler_Type) < 0)
7963 return NULL;
7964 if (PyType_Ready(&Pdata_Type) < 0)
7965 return NULL;
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00007966 if (PyType_Ready(&PicklerMemoProxyType) < 0)
7967 return NULL;
7968 if (PyType_Ready(&UnpicklerMemoProxyType) < 0)
7969 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007970
7971 /* Create the module and add the functions. */
7972 m = PyModule_Create(&_picklemodule);
7973 if (m == NULL)
7974 return NULL;
7975
Antoine Pitrou91f43802019-05-26 17:10:09 +02007976 /* Add types */
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007977 Py_INCREF(&Pickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007978 if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0)
7979 return NULL;
Antoine Pitrou8391cf42011-07-15 21:01:21 +02007980 Py_INCREF(&Unpickler_Type);
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007981 if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0)
7982 return NULL;
Antoine Pitrou91f43802019-05-26 17:10:09 +02007983 Py_INCREF(&PyPickleBuffer_Type);
7984 if (PyModule_AddObject(m, "PickleBuffer",
7985 (PyObject *)&PyPickleBuffer_Type) < 0)
7986 return NULL;
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007987
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007988 st = _Pickle_GetState(m);
7989
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007990 /* Initialize the exceptions. */
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007991 st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
7992 if (st->PickleError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007993 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007994 st->PicklingError = \
7995 PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
7996 if (st->PicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00007997 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08007998 st->UnpicklingError = \
7999 PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
8000 if (st->UnpicklingError == NULL)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00008001 return NULL;
8002
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08008003 Py_INCREF(st->PickleError);
8004 if (PyModule_AddObject(m, "PickleError", st->PickleError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00008005 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08008006 Py_INCREF(st->PicklingError);
8007 if (PyModule_AddObject(m, "PicklingError", st->PicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00008008 return NULL;
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08008009 Py_INCREF(st->UnpicklingError);
8010 if (PyModule_AddObject(m, "UnpicklingError", st->UnpicklingError) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00008011 return NULL;
8012
Alexandre Vassalotti23bdd832013-11-27 19:36:52 -08008013 if (_Pickle_InitState(st) < 0)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00008014 return NULL;
8015
8016 return m;
8017}