blob: 7b583eef1a1ffa1facd10c983d4ed17f574d0f05 [file] [log] [blame]
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001
2/* Write Python objects to files and read them back.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07003 This is primarily intended for writing and reading compiled Python code,
4 even though dicts, lists, sets and frozensets, not commonly seen in
5 code objects, are supported.
6 Version 3 of this protocol properly supports circular links
7 and sharing. */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00008
Thomas Wouters695934a2006-03-01 23:49:13 +00009#define PY_SSIZE_T_CLEAN
10
Guido van Rossum79f25d91997-04-29 20:08:16 +000011#include "Python.h"
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000012#include "longintrepr.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000013#include "code.h"
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000014#include "marshal.h"
Serhiy Storchakace921c622015-02-11 15:53:31 +020015#include "../Modules/hashtable.h"
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000016
Serhiy Storchaka0767ad42017-03-12 09:20:15 +020017/*[clinic input]
18module marshal
19[clinic start generated code]*/
20/*[clinic end generated code: output=da39a3ee5e6b4b0d input=c982b7930dee17db]*/
21
22#include "clinic/marshal.c.h"
23
Fred Drake6da0b912000-06-28 18:47:56 +000024/* High water mark to determine when the marshalled object is dangerously deep
25 * and risks coring the interpreter. When the object stack gets this deep,
26 * raise an exception instead of continuing.
Guido van Rossum63175a12007-08-29 20:39:13 +000027 * On Windows debug builds, reduce this value.
Fred Drake6da0b912000-06-28 18:47:56 +000028 */
Guido van Rossum63175a12007-08-29 20:39:13 +000029#if defined(MS_WINDOWS) && defined(_DEBUG)
Steve Dowerf6c69e62014-11-01 15:15:16 -070030#define MAX_MARSHAL_STACK_DEPTH 1000
Guido van Rossum63175a12007-08-29 20:39:13 +000031#else
Guido van Rossumd59da4b2007-05-22 18:11:13 +000032#define MAX_MARSHAL_STACK_DEPTH 2000
Guido van Rossum63175a12007-08-29 20:39:13 +000033#endif
Fred Drake6da0b912000-06-28 18:47:56 +000034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035#define TYPE_NULL '0'
36#define TYPE_NONE 'N'
37#define TYPE_FALSE 'F'
38#define TYPE_TRUE 'T'
39#define TYPE_STOPITER 'S'
40#define TYPE_ELLIPSIS '.'
41#define TYPE_INT 'i'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042#define TYPE_FLOAT 'f'
43#define TYPE_BINARY_FLOAT 'g'
44#define TYPE_COMPLEX 'x'
45#define TYPE_BINARY_COMPLEX 'y'
46#define TYPE_LONG 'l'
47#define TYPE_STRING 's'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070048#define TYPE_INTERNED 't'
49#define TYPE_REF 'r'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050#define TYPE_TUPLE '('
51#define TYPE_LIST '['
52#define TYPE_DICT '{'
53#define TYPE_CODE 'c'
54#define TYPE_UNICODE 'u'
55#define TYPE_UNKNOWN '?'
56#define TYPE_SET '<'
57#define TYPE_FROZENSET '>'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070058#define FLAG_REF '\x80' /* with a type, add obj to index */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000059
Antoine Pitrou1164dfc2013-10-12 22:25:39 +020060#define TYPE_ASCII 'a'
61#define TYPE_ASCII_INTERNED 'A'
62#define TYPE_SMALL_TUPLE ')'
63#define TYPE_SHORT_ASCII 'z'
64#define TYPE_SHORT_ASCII_INTERNED 'Z'
65
Eric Smithb1a03cf2009-04-21 11:57:38 +000066#define WFERR_OK 0
67#define WFERR_UNMARSHALLABLE 1
68#define WFERR_NESTEDTOODEEP 2
69#define WFERR_NOMEMORY 3
70
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000071typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 FILE *fp;
73 int error; /* see WFERR_* values */
74 int depth;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 PyObject *str;
76 char *ptr;
77 char *end;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +020078 char *buf;
Serhiy Storchakace921c622015-02-11 15:53:31 +020079 _Py_hashtable_t *hashtable;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000080 int version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000081} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000082
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +020083#define w_byte(c, p) do { \
84 if ((p)->ptr != (p)->end || w_reserve((p), 1)) \
85 *(p)->ptr++ = (c); \
86 } while(0)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000087
88static void
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +020089w_flush(WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000090{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +020091 assert(p->fp != NULL);
92 fwrite(p->buf, 1, p->ptr - p->buf, p->fp);
93 p->ptr = p->buf;
94}
95
96static int
97w_reserve(WFILE *p, Py_ssize_t needed)
98{
99 Py_ssize_t pos, size, delta;
100 if (p->ptr == NULL)
101 return 0; /* An error already occurred */
102 if (p->fp != NULL) {
103 w_flush(p);
104 return needed <= p->end - p->ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 }
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200106 assert(p->str != NULL);
107 pos = p->ptr - p->buf;
108 size = PyBytes_Size(p->str);
109 if (size > 16*1024*1024)
110 delta = (size >> 3); /* 12.5% overallocation */
111 else
112 delta = size + 1024;
113 delta = Py_MAX(delta, needed);
114 if (delta > PY_SSIZE_T_MAX - size) {
115 p->error = WFERR_NOMEMORY;
116 return 0;
117 }
118 size += delta;
119 if (_PyBytes_Resize(&p->str, size) != 0) {
120 p->ptr = p->buf = p->end = NULL;
121 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122 }
123 else {
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200124 p->buf = PyBytes_AS_STRING(p->str);
125 p->ptr = p->buf + pos;
126 p->end = p->buf + size;
127 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000129}
130
131static void
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300132w_string(const char *s, Py_ssize_t n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000133{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200134 Py_ssize_t m;
135 if (!n || p->ptr == NULL)
136 return;
137 m = p->end - p->ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 if (p->fp != NULL) {
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200139 if (n <= m) {
Christian Heimesf051e432016-09-13 20:22:02 +0200140 memcpy(p->ptr, s, n);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200141 p->ptr += n;
142 }
143 else {
144 w_flush(p);
145 fwrite(s, 1, n, p->fp);
146 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 }
148 else {
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200149 if (n <= m || w_reserve(p, n - m)) {
Christian Heimesf051e432016-09-13 20:22:02 +0200150 memcpy(p->ptr, s, n);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200151 p->ptr += n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 }
153 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000154}
155
156static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000157w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000158{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000159 w_byte((char)( x & 0xff), p);
160 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000161}
162
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000163static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000164w_long(long x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 w_byte((char)( x & 0xff), p);
167 w_byte((char)((x>> 8) & 0xff), p);
168 w_byte((char)((x>>16) & 0xff), p);
169 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000170}
171
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200172#define SIZE32_MAX 0x7FFFFFFF
173
174#if SIZEOF_SIZE_T > 4
175# define W_SIZE(n, p) do { \
176 if ((n) > SIZE32_MAX) { \
177 (p)->depth--; \
178 (p)->error = WFERR_UNMARSHALLABLE; \
179 return; \
180 } \
181 w_long((long)(n), p); \
182 } while(0)
183#else
184# define W_SIZE w_long
185#endif
186
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300187static void
188w_pstring(const char *s, Py_ssize_t n, WFILE *p)
189{
190 W_SIZE(n, p);
191 w_string(s, n, p);
192}
193
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200194static void
195w_short_pstring(const char *s, Py_ssize_t n, WFILE *p)
196{
Antoine Pitroub30f2712013-10-12 23:14:47 +0200197 w_byte(Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char), p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200198 w_string(s, n, p);
199}
200
Serhiy Storchaka95949422013-08-27 19:40:23 +0300201/* We assume that Python ints are stored internally in base some power of
Mark Dickinsonbd792642009-03-18 20:06:12 +0000202 2**15; for the sake of portability we'll always read and write them in base
203 exactly 2**15. */
204
205#define PyLong_MARSHAL_SHIFT 15
206#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
207#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
208#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
209#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
210#endif
211#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
212
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700213#define W_TYPE(t, p) do { \
214 w_byte((t) | flag, (p)); \
215} while(0)
216
Mark Dickinsonbd792642009-03-18 20:06:12 +0000217static void
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700218w_PyLong(const PyLongObject *ob, char flag, WFILE *p)
Mark Dickinsonbd792642009-03-18 20:06:12 +0000219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 Py_ssize_t i, j, n, l;
221 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000222
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700223 W_TYPE(TYPE_LONG, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 if (Py_SIZE(ob) == 0) {
225 w_long((long)0, p);
226 return;
227 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 /* set l to number of base PyLong_MARSHAL_BASE digits */
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200230 n = Py_ABS(Py_SIZE(ob));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 l = (n-1) * PyLong_MARSHAL_RATIO;
232 d = ob->ob_digit[n-1];
233 assert(d != 0); /* a PyLong is always normalized */
234 do {
235 d >>= PyLong_MARSHAL_SHIFT;
236 l++;
237 } while (d != 0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200238 if (l > SIZE32_MAX) {
239 p->depth--;
240 p->error = WFERR_UNMARSHALLABLE;
241 return;
242 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 for (i=0; i < n-1; i++) {
246 d = ob->ob_digit[i];
247 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
248 w_short(d & PyLong_MARSHAL_MASK, p);
249 d >>= PyLong_MARSHAL_SHIFT;
250 }
251 assert (d == 0);
252 }
253 d = ob->ob_digit[n-1];
254 do {
255 w_short(d & PyLong_MARSHAL_MASK, p);
256 d >>= PyLong_MARSHAL_SHIFT;
257 } while (d != 0);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000258}
259
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700260static int
261w_ref(PyObject *v, char *flag, WFILE *p)
262{
Serhiy Storchakace921c622015-02-11 15:53:31 +0200263 _Py_hashtable_entry_t *entry;
264 int w;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700265
Serhiy Storchakace921c622015-02-11 15:53:31 +0200266 if (p->version < 3 || p->hashtable == NULL)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700267 return 0; /* not writing object references */
268
269 /* if it has only one reference, it definitely isn't shared */
270 if (Py_REFCNT(v) == 1)
271 return 0;
272
Victor Stinner285cf0a2016-03-21 22:00:58 +0100273 entry = _Py_HASHTABLE_GET_ENTRY(p->hashtable, v);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200274 if (entry != NULL) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700275 /* write the reference index to the stream */
Victor Stinnere8c6b2f2016-03-23 09:25:01 +0100276 _Py_HASHTABLE_ENTRY_READ_DATA(p->hashtable, entry, w);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700277 /* we don't store "long" indices in the dict */
278 assert(0 <= w && w <= 0x7fffffff);
279 w_byte(TYPE_REF, p);
280 w_long(w, p);
281 return 1;
282 } else {
Serhiy Storchakace921c622015-02-11 15:53:31 +0200283 size_t s = p->hashtable->entries;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700284 /* we don't support long indices */
285 if (s >= 0x7fffffff) {
286 PyErr_SetString(PyExc_ValueError, "too many objects");
287 goto err;
288 }
Serhiy Storchaka26861b02015-02-16 20:52:17 +0200289 w = (int)s;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200290 Py_INCREF(v);
291 if (_Py_HASHTABLE_SET(p->hashtable, v, w) < 0) {
292 Py_DECREF(v);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700293 goto err;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200294 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700295 *flag |= FLAG_REF;
296 return 0;
297 }
298err:
299 p->error = WFERR_UNMARSHALLABLE;
300 return 1;
301}
302
303static void
304w_complex_object(PyObject *v, char flag, WFILE *p);
305
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000306static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000307w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000308{
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700309 char flag = '\0';
Fred Drake6da0b912000-06-28 18:47:56 +0000310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
314 p->error = WFERR_NESTEDTOODEEP;
315 }
316 else if (v == NULL) {
317 w_byte(TYPE_NULL, p);
318 }
319 else if (v == Py_None) {
320 w_byte(TYPE_NONE, p);
321 }
322 else if (v == PyExc_StopIteration) {
323 w_byte(TYPE_STOPITER, p);
324 }
325 else if (v == Py_Ellipsis) {
326 w_byte(TYPE_ELLIPSIS, p);
327 }
328 else if (v == Py_False) {
329 w_byte(TYPE_FALSE, p);
330 }
331 else if (v == Py_True) {
332 w_byte(TYPE_TRUE, p);
333 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700334 else if (!w_ref(v, &flag, p))
335 w_complex_object(v, flag, p);
336
337 p->depth--;
338}
339
340static void
341w_complex_object(PyObject *v, char flag, WFILE *p)
342{
343 Py_ssize_t i, n;
344
345 if (PyLong_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 long x = PyLong_AsLong(v);
347 if ((x == -1) && PyErr_Occurred()) {
348 PyLongObject *ob = (PyLongObject *)v;
349 PyErr_Clear();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700350 w_PyLong(ob, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 }
352 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000353#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
355 if (y && y != -1) {
Martin v. Löwis7e395722012-07-28 19:44:05 +0200356 /* Too large for TYPE_INT */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700357 w_PyLong((PyLongObject*)v, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 }
359 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000360#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700362 W_TYPE(TYPE_INT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 w_long(x, p);
364 }
365 }
366 }
367 else if (PyFloat_CheckExact(v)) {
368 if (p->version > 1) {
369 unsigned char buf[8];
370 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
371 buf, 1) < 0) {
372 p->error = WFERR_UNMARSHALLABLE;
373 return;
374 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700375 W_TYPE(TYPE_BINARY_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 w_string((char*)buf, 8, p);
377 }
378 else {
379 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
380 'g', 17, 0, NULL);
381 if (!buf) {
382 p->error = WFERR_NOMEMORY;
383 return;
384 }
385 n = strlen(buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700386 W_TYPE(TYPE_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200388 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 PyMem_Free(buf);
390 }
391 }
392 else if (PyComplex_CheckExact(v)) {
393 if (p->version > 1) {
394 unsigned char buf[8];
395 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
396 buf, 1) < 0) {
397 p->error = WFERR_UNMARSHALLABLE;
398 return;
399 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700400 W_TYPE(TYPE_BINARY_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 w_string((char*)buf, 8, p);
402 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
403 buf, 1) < 0) {
404 p->error = WFERR_UNMARSHALLABLE;
405 return;
406 }
407 w_string((char*)buf, 8, p);
408 }
409 else {
410 char *buf;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700411 W_TYPE(TYPE_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
413 'g', 17, 0, NULL);
414 if (!buf) {
415 p->error = WFERR_NOMEMORY;
416 return;
417 }
418 n = strlen(buf);
419 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200420 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 PyMem_Free(buf);
422 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
423 'g', 17, 0, NULL);
424 if (!buf) {
425 p->error = WFERR_NOMEMORY;
426 return;
427 }
428 n = strlen(buf);
429 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200430 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 PyMem_Free(buf);
432 }
433 }
434 else if (PyBytes_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700435 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300436 w_pstring(PyBytes_AS_STRING(v), PyBytes_GET_SIZE(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 }
438 else if (PyUnicode_CheckExact(v)) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200439 if (p->version >= 4 && PyUnicode_IS_ASCII(v)) {
440 int is_short = PyUnicode_GET_LENGTH(v) < 256;
441 if (is_short) {
442 if (PyUnicode_CHECK_INTERNED(v))
443 W_TYPE(TYPE_SHORT_ASCII_INTERNED, p);
444 else
445 W_TYPE(TYPE_SHORT_ASCII, p);
446 w_short_pstring((char *) PyUnicode_1BYTE_DATA(v),
447 PyUnicode_GET_LENGTH(v), p);
448 }
449 else {
450 if (PyUnicode_CHECK_INTERNED(v))
451 W_TYPE(TYPE_ASCII_INTERNED, p);
452 else
453 W_TYPE(TYPE_ASCII, p);
454 w_pstring((char *) PyUnicode_1BYTE_DATA(v),
455 PyUnicode_GET_LENGTH(v), p);
456 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200458 else {
459 PyObject *utf8;
460 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");
461 if (utf8 == NULL) {
462 p->depth--;
463 p->error = WFERR_UNMARSHALLABLE;
464 return;
465 }
466 if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v))
467 W_TYPE(TYPE_INTERNED, p);
468 else
469 W_TYPE(TYPE_UNICODE, p);
470 w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p);
471 Py_DECREF(utf8);
472 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 }
474 else if (PyTuple_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 n = PyTuple_Size(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200476 if (p->version >= 4 && n < 256) {
477 W_TYPE(TYPE_SMALL_TUPLE, p);
Victor Stinnerda062552013-11-16 00:13:29 +0100478 w_byte((unsigned char)n, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200479 }
480 else {
481 W_TYPE(TYPE_TUPLE, p);
482 W_SIZE(n, p);
483 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 for (i = 0; i < n; i++) {
485 w_object(PyTuple_GET_ITEM(v, i), p);
486 }
487 }
488 else if (PyList_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700489 W_TYPE(TYPE_LIST, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 n = PyList_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200491 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 for (i = 0; i < n; i++) {
493 w_object(PyList_GET_ITEM(v, i), p);
494 }
495 }
496 else if (PyDict_CheckExact(v)) {
497 Py_ssize_t pos;
498 PyObject *key, *value;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700499 W_TYPE(TYPE_DICT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 /* This one is NULL object terminated! */
501 pos = 0;
502 while (PyDict_Next(v, &pos, &key, &value)) {
503 w_object(key, p);
504 w_object(value, p);
505 }
506 w_object((PyObject *)NULL, p);
507 }
508 else if (PyAnySet_CheckExact(v)) {
509 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 if (PyObject_TypeCheck(v, &PySet_Type))
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700512 W_TYPE(TYPE_SET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 else
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700514 W_TYPE(TYPE_FROZENSET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 n = PyObject_Size(v);
516 if (n == -1) {
517 p->depth--;
518 p->error = WFERR_UNMARSHALLABLE;
519 return;
520 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200521 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 it = PyObject_GetIter(v);
523 if (it == NULL) {
524 p->depth--;
525 p->error = WFERR_UNMARSHALLABLE;
526 return;
527 }
528 while ((value = PyIter_Next(it)) != NULL) {
529 w_object(value, p);
530 Py_DECREF(value);
531 }
532 Py_DECREF(it);
533 if (PyErr_Occurred()) {
534 p->depth--;
535 p->error = WFERR_UNMARSHALLABLE;
536 return;
537 }
538 }
539 else if (PyCode_Check(v)) {
540 PyCodeObject *co = (PyCodeObject *)v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700541 W_TYPE(TYPE_CODE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 w_long(co->co_argcount, p);
543 w_long(co->co_kwonlyargcount, p);
544 w_long(co->co_nlocals, p);
545 w_long(co->co_stacksize, p);
546 w_long(co->co_flags, p);
547 w_object(co->co_code, p);
548 w_object(co->co_consts, p);
549 w_object(co->co_names, p);
550 w_object(co->co_varnames, p);
551 w_object(co->co_freevars, p);
552 w_object(co->co_cellvars, p);
553 w_object(co->co_filename, p);
554 w_object(co->co_name, p);
555 w_long(co->co_firstlineno, p);
556 w_object(co->co_lnotab, p);
557 }
558 else if (PyObject_CheckBuffer(v)) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +0200559 /* Write unknown bytes-like objects as a bytes object */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100561 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100563 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100565 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700567 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300568 w_pstring(view.buf, view.len, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100569 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 }
571 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700572 W_TYPE(TYPE_UNKNOWN, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 p->error = WFERR_UNMARSHALLABLE;
574 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000575}
576
Serhiy Storchakace921c622015-02-11 15:53:31 +0200577static int
578w_init_refs(WFILE *wf, int version)
579{
580 if (version >= 3) {
Victor Stinner285cf0a2016-03-21 22:00:58 +0100581 wf->hashtable = _Py_hashtable_new(sizeof(PyObject *), sizeof(int),
582 _Py_hashtable_hash_ptr,
Serhiy Storchakace921c622015-02-11 15:53:31 +0200583 _Py_hashtable_compare_direct);
584 if (wf->hashtable == NULL) {
585 PyErr_NoMemory();
586 return -1;
587 }
588 }
589 return 0;
590}
591
592static int
Victor Stinner285cf0a2016-03-21 22:00:58 +0100593w_decref_entry(_Py_hashtable_t *ht, _Py_hashtable_entry_t *entry,
594 void *Py_UNUSED(data))
Serhiy Storchakace921c622015-02-11 15:53:31 +0200595{
Victor Stinner285cf0a2016-03-21 22:00:58 +0100596 PyObject *entry_key;
597
Victor Stinner5dacbd42016-03-23 09:52:13 +0100598 _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, entry_key);
Victor Stinner285cf0a2016-03-21 22:00:58 +0100599 Py_XDECREF(entry_key);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200600 return 0;
601}
602
603static void
604w_clear_refs(WFILE *wf)
605{
606 if (wf->hashtable != NULL) {
607 _Py_hashtable_foreach(wf->hashtable, w_decref_entry, NULL);
608 _Py_hashtable_destroy(wf->hashtable);
609 }
610}
611
Serhiy Storchaka95949422013-08-27 19:40:23 +0300612/* version currently has no effect for writing ints. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000613void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000614PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000615{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200616 char buf[4];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 WFILE wf;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200618 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 wf.fp = fp;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200620 wf.ptr = wf.buf = buf;
621 wf.end = wf.ptr + sizeof(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 wf.version = version;
624 w_long(x, &wf);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200625 w_flush(&wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000626}
627
628void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000629PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000630{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200631 char buf[BUFSIZ];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 WFILE wf;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200633 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 wf.fp = fp;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200635 wf.ptr = wf.buf = buf;
636 wf.end = wf.ptr + sizeof(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 wf.version = version;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200639 if (w_init_refs(&wf, version))
640 return; /* caller mush check PyErr_Occurred() */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 w_object(x, &wf);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200642 w_clear_refs(&wf);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200643 w_flush(&wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000644}
645
Serhiy Storchakac07422c2015-02-11 16:18:09 +0200646typedef struct {
647 FILE *fp;
648 int depth;
649 PyObject *readable; /* Stream-like object being read from */
Serhiy Storchakac07422c2015-02-11 16:18:09 +0200650 char *ptr;
651 char *end;
652 char *buf;
653 Py_ssize_t buf_size;
654 PyObject *refs; /* a list */
655} RFILE;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000656
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200657static const char *
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200658r_string(Py_ssize_t n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000659{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200660 Py_ssize_t read = -1;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100661
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200662 if (p->ptr != NULL) {
663 /* Fast path for loads() */
664 char *res = p->ptr;
665 Py_ssize_t left = p->end - p->ptr;
666 if (left < n) {
667 PyErr_SetString(PyExc_EOFError,
668 "marshal data too short");
669 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100670 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200671 p->ptr += n;
672 return res;
673 }
674 if (p->buf == NULL) {
675 p->buf = PyMem_MALLOC(n);
676 if (p->buf == NULL) {
677 PyErr_NoMemory();
678 return NULL;
679 }
680 p->buf_size = n;
681 }
682 else if (p->buf_size < n) {
683 p->buf = PyMem_REALLOC(p->buf, n);
684 if (p->buf == NULL) {
685 PyErr_NoMemory();
686 return NULL;
687 }
688 p->buf_size = n;
689 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100690
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200691 if (!p->readable) {
692 assert(p->fp != NULL);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200693 read = fread(p->buf, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100694 }
695 else {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200696 _Py_IDENTIFIER(readinto);
697 PyObject *res, *mview;
698 Py_buffer buf;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200699
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200700 if (PyBuffer_FillInfo(&buf, NULL, p->buf, n, 0, PyBUF_CONTIG) == -1)
701 return NULL;
702 mview = PyMemoryView_FromBuffer(&buf);
703 if (mview == NULL)
704 return NULL;
705
706 res = _PyObject_CallMethodId(p->readable, &PyId_readinto, "N", mview);
707 if (res != NULL) {
708 read = PyNumber_AsSsize_t(res, PyExc_ValueError);
709 Py_DECREF(res);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100710 }
711 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200712 if (read != n) {
713 if (!PyErr_Occurred()) {
714 if (read > n)
715 PyErr_Format(PyExc_ValueError,
716 "read() returned too much data: "
717 "%zd bytes requested, %zd returned",
718 n, read);
719 else
720 PyErr_SetString(PyExc_EOFError,
721 "EOF read where not expected");
722 }
723 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100724 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200725 return p->buf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100726}
727
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100728static int
729r_byte(RFILE *p)
730{
731 int c = EOF;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100732
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200733 if (p->ptr != NULL) {
734 if (p->ptr < p->end)
735 c = (unsigned char) *p->ptr++;
736 return c;
737 }
738 if (!p->readable) {
739 assert(p->fp);
740 c = getc(p->fp);
741 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100742 else {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200743 const char *ptr = r_string(1, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200744 if (ptr != NULL)
745 c = *(unsigned char *) ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100746 }
747 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000748}
749
750static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000751r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000752{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200753 short x = -1;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200754 const unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100755
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200756 buffer = (const unsigned char *) r_string(2, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200757 if (buffer != NULL) {
758 x = buffer[0];
759 x |= buffer[1] << 8;
760 /* Sign-extension, in case short greater than 16 bits */
761 x |= -(x & 0x8000);
762 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000764}
765
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000766static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000767r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000768{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200769 long x = -1;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200770 const unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100771
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200772 buffer = (const unsigned char *) r_string(4, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200773 if (buffer != NULL) {
774 x = buffer[0];
775 x |= (long)buffer[1] << 8;
776 x |= (long)buffer[2] << 16;
777 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000778#if SIZEOF_LONG > 4
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200779 /* Sign extension for 64-bit machines */
780 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000781#endif
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200782 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000784}
785
Guido van Rossum79f25d91997-04-29 20:08:16 +0000786static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000787r_PyLong(RFILE *p)
788{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200790 long n, size, i;
791 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100795 if (PyErr_Occurred())
796 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 if (n == 0)
798 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200799 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 PyErr_SetString(PyExc_ValueError,
801 "bad marshal data (long size out of range)");
802 return NULL;
803 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000804
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200805 size = 1 + (Py_ABS(n) - 1) / PyLong_MARSHAL_RATIO;
806 shorts_in_top_digit = 1 + (Py_ABS(n) - 1) % PyLong_MARSHAL_RATIO;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 ob = _PyLong_New(size);
808 if (ob == NULL)
809 return NULL;
Victor Stinner763b0d12013-10-31 16:56:38 +0100810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 for (i = 0; i < size-1; i++) {
814 d = 0;
815 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
816 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100817 if (PyErr_Occurred()) {
818 Py_DECREF(ob);
819 return NULL;
820 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 if (md < 0 || md > PyLong_MARSHAL_BASE)
822 goto bad_digit;
823 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
824 }
825 ob->ob_digit[i] = d;
826 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 d = 0;
829 for (j=0; j < shorts_in_top_digit; j++) {
830 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100831 if (PyErr_Occurred()) {
832 Py_DECREF(ob);
833 return NULL;
834 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 if (md < 0 || md > PyLong_MARSHAL_BASE)
836 goto bad_digit;
837 /* topmost marshal digit should be nonzero */
838 if (md == 0 && j == shorts_in_top_digit - 1) {
839 Py_DECREF(ob);
840 PyErr_SetString(PyExc_ValueError,
841 "bad marshal data (unnormalized long data)");
842 return NULL;
843 }
844 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
845 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100846 if (PyErr_Occurred()) {
847 Py_DECREF(ob);
848 return NULL;
849 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 /* top digit should be nonzero, else the resulting PyLong won't be
851 normalized */
852 ob->ob_digit[size-1] = d;
853 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000854 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 Py_DECREF(ob);
856 PyErr_SetString(PyExc_ValueError,
857 "bad marshal data (digit out of range in long)");
858 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000859}
860
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700861/* allocate the reflist index for a new object. Return -1 on failure */
862static Py_ssize_t
863r_ref_reserve(int flag, RFILE *p)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700864{
865 if (flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200866 Py_ssize_t idx = PyList_GET_SIZE(p->refs);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700867 if (idx >= 0x7ffffffe) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700868 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700869 return -1;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700870 }
871 if (PyList_Append(p->refs, Py_None) < 0)
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700872 return -1;
873 return idx;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700874 } else
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700875 return 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700876}
877
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700878/* insert the new object 'o' to the reflist at previously
879 * allocated index 'idx'.
880 * 'o' can be NULL, in which case nothing is done.
881 * if 'o' was non-NULL, and the function succeeds, 'o' is returned.
882 * if 'o' was non-NULL, and the function fails, 'o' is released and
883 * NULL returned. This simplifies error checking at the call site since
884 * a single test for NULL for the function result is enough.
885 */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700886static PyObject *
887r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
888{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700889 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200890 PyObject *tmp = PyList_GET_ITEM(p->refs, idx);
891 Py_INCREF(o);
892 PyList_SET_ITEM(p->refs, idx, o);
893 Py_DECREF(tmp);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700894 }
895 return o;
896}
897
898/* combination of both above, used when an object can be
899 * created whenever it is seen in the file, as opposed to
900 * after having loaded its sub-objects.
901 */
902static PyObject *
903r_ref(PyObject *o, int flag, RFILE *p)
904{
Victor Stinner359fabc2013-10-31 17:09:01 +0100905 assert(flag & FLAG_REF);
906 if (o == NULL)
907 return NULL;
908 if (PyList_Append(p->refs, o) < 0) {
909 Py_DECREF(o); /* release the new object */
910 return NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700911 }
912 return o;
913}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000914
915static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000916r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000917{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 /* NULL is a valid return value, it does not necessarily means that
919 an exception is set. */
920 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500921 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700923 int type, code = r_byte(p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200924 int flag, is_interned = 0;
Christian Heimes35728422013-10-13 02:29:06 +0200925 PyObject *retval = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000926
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700927 if (code == EOF) {
928 PyErr_SetString(PyExc_EOFError,
929 "EOF read where object expected");
930 return NULL;
931 }
932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
936 p->depth--;
937 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
938 return NULL;
939 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000940
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700941 flag = code & FLAG_REF;
942 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700943
944#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700945 if (flag) \
946 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700947} while (0)
948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 case TYPE_NULL:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 case TYPE_NONE:
955 Py_INCREF(Py_None);
956 retval = Py_None;
957 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 case TYPE_STOPITER:
960 Py_INCREF(PyExc_StopIteration);
961 retval = PyExc_StopIteration;
962 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 case TYPE_ELLIPSIS:
965 Py_INCREF(Py_Ellipsis);
966 retval = Py_Ellipsis;
967 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 case TYPE_FALSE:
970 Py_INCREF(Py_False);
971 retval = Py_False;
972 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 case TYPE_TRUE:
975 Py_INCREF(Py_True);
976 retval = Py_True;
977 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100980 n = r_long(p);
981 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700982 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 case TYPE_LONG:
986 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700987 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 case TYPE_FLOAT:
991 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200992 char buf[256];
993 const char *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 double dx;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300996 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 PyErr_SetString(PyExc_EOFError,
998 "EOF read where object expected");
999 break;
1000 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001001 ptr = r_string(n, p);
1002 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001003 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001004 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 buf[n] = '\0';
1006 dx = PyOS_string_to_double(buf, NULL, NULL);
1007 if (dx == -1.0 && PyErr_Occurred())
1008 break;
1009 retval = PyFloat_FromDouble(dx);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001010 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 break;
1012 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 case TYPE_BINARY_FLOAT:
1015 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001016 const unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 double x;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001018 buf = (const unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001019 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 x = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001022 if (x == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001025 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 break;
1027 }
Michael W. Hudsondf888462005-06-03 14:41:55 +00001028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 case TYPE_COMPLEX:
1030 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001031 char buf[256];
1032 const char *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001033 Py_complex c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001035 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 PyErr_SetString(PyExc_EOFError,
1037 "EOF read where object expected");
1038 break;
1039 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001040 ptr = r_string(n, p);
1041 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001042 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001043 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 buf[n] = '\0';
1045 c.real = PyOS_string_to_double(buf, NULL, NULL);
1046 if (c.real == -1.0 && PyErr_Occurred())
1047 break;
1048 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001049 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 PyErr_SetString(PyExc_EOFError,
1051 "EOF read where object expected");
1052 break;
1053 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001054 ptr = r_string(n, p);
1055 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001056 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001057 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 buf[n] = '\0';
1059 c.imag = PyOS_string_to_double(buf, NULL, NULL);
1060 if (c.imag == -1.0 && PyErr_Occurred())
1061 break;
1062 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001063 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 break;
1065 }
Michael W. Hudsondf888462005-06-03 14:41:55 +00001066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 case TYPE_BINARY_COMPLEX:
1068 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001069 const unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 Py_complex c;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001071 buf = (const unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001072 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 c.real = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001075 if (c.real == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 break;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001077 buf = (const unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001078 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 c.imag = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001081 if (c.imag == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001084 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 break;
1086 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 case TYPE_STRING:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001089 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001090 const char *ptr;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001091 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001092 if (PyErr_Occurred())
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001093 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001094 if (n < 0 || n > SIZE32_MAX) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001095 PyErr_SetString(PyExc_ValueError, "bad marshal data (bytes object size out of range)");
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001096 break;
1097 }
1098 v = PyBytes_FromStringAndSize((char *)NULL, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001099 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001100 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001101 ptr = r_string(n, p);
1102 if (ptr == NULL) {
1103 Py_DECREF(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001104 break;
1105 }
1106 memcpy(PyBytes_AS_STRING(v), ptr, n);
1107 retval = v;
1108 R_REF(retval);
1109 break;
1110 }
1111
1112 case TYPE_ASCII_INTERNED:
1113 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001114 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001115 case TYPE_ASCII:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001117 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001118 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001119 if (n < 0 || n > SIZE32_MAX) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001120 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 break;
1122 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001123 goto _read_ascii;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001124
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001125 case TYPE_SHORT_ASCII_INTERNED:
1126 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001127 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001128 case TYPE_SHORT_ASCII:
1129 n = r_byte(p);
1130 if (n == EOF) {
1131 PyErr_SetString(PyExc_EOFError,
1132 "EOF read where object expected");
1133 break;
1134 }
1135 _read_ascii:
1136 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001137 const char *ptr;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001138 ptr = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001139 if (ptr == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001140 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001141 v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001142 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001143 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001144 if (is_interned)
1145 PyUnicode_InternInPlace(&v);
1146 retval = v;
1147 R_REF(retval);
1148 break;
1149 }
1150
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001151 case TYPE_INTERNED:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001152 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001153 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001154 case TYPE_UNICODE:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001156 const char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +00001157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001159 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001160 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001161 if (n < 0 || n > SIZE32_MAX) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001162 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 break;
1164 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001165 if (n != 0) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001166 buffer = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001167 if (buffer == NULL)
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001168 break;
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001169 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001171 else {
1172 v = PyUnicode_New(0, 0);
1173 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001174 if (v == NULL)
Victor Stinner3a8b79d2013-07-08 22:23:32 +02001175 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001176 if (is_interned)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001177 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001179 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 break;
1181 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001182
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001183 case TYPE_SMALL_TUPLE:
1184 n = (unsigned char) r_byte(p);
Victor Stinnerb1b7b182013-10-31 17:07:08 +01001185 if (PyErr_Occurred())
1186 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001187 goto _read_tuple;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 case TYPE_TUPLE:
1189 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001190 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001191 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001192 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 break;
1195 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001196 _read_tuple:
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001197 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001198 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001199 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 break;
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 for (i = 0; i < n; i++) {
1203 v2 = r_object(p);
1204 if ( v2 == NULL ) {
1205 if (!PyErr_Occurred())
1206 PyErr_SetString(PyExc_TypeError,
1207 "NULL object in marshal data for tuple");
1208 Py_DECREF(v);
1209 v = NULL;
1210 break;
1211 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001212 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 }
1214 retval = v;
1215 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 case TYPE_LIST:
1218 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001219 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001220 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001221 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 break;
1224 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001225 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001226 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001227 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 for (i = 0; i < n; i++) {
1230 v2 = r_object(p);
1231 if ( v2 == NULL ) {
1232 if (!PyErr_Occurred())
1233 PyErr_SetString(PyExc_TypeError,
1234 "NULL object in marshal data for list");
1235 Py_DECREF(v);
1236 v = NULL;
1237 break;
1238 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001239 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 }
1241 retval = v;
1242 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 case TYPE_DICT:
1245 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001246 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001247 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 for (;;) {
1250 PyObject *key, *val;
1251 key = r_object(p);
1252 if (key == NULL)
1253 break;
1254 val = r_object(p);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001255 if (val == NULL) {
1256 Py_DECREF(key);
1257 break;
1258 }
1259 if (PyDict_SetItem(v, key, val) < 0) {
1260 Py_DECREF(key);
1261 Py_DECREF(val);
1262 break;
1263 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 Py_DECREF(key);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001265 Py_DECREF(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 }
1267 if (PyErr_Occurred()) {
1268 Py_DECREF(v);
1269 v = NULL;
1270 }
1271 retval = v;
1272 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 case TYPE_SET:
1275 case TYPE_FROZENSET:
1276 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001277 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001278 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001279 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 break;
1282 }
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001283
Victor Stinner1aa78932016-01-23 14:15:48 +01001284 if (n == 0 && type == TYPE_FROZENSET) {
1285 /* call frozenset() to get the empty frozenset singleton */
Victor Stinner4778eab2016-12-01 14:51:04 +01001286 v = _PyObject_CallNoArg((PyObject*)&PyFrozenSet_Type);
Victor Stinner1aa78932016-01-23 14:15:48 +01001287 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 break;
Victor Stinner1aa78932016-01-23 14:15:48 +01001289 R_REF(v);
1290 retval = v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 }
Victor Stinner1aa78932016-01-23 14:15:48 +01001292 else {
1293 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
1294 if (type == TYPE_SET) {
1295 R_REF(v);
1296 } else {
1297 /* must use delayed registration of frozensets because they must
1298 * be init with a refcount of 1
1299 */
1300 idx = r_ref_reserve(flag, p);
1301 if (idx < 0)
1302 Py_CLEAR(v); /* signal error */
1303 }
1304 if (v == NULL)
1305 break;
1306
1307 for (i = 0; i < n; i++) {
1308 v2 = r_object(p);
1309 if ( v2 == NULL ) {
1310 if (!PyErr_Occurred())
1311 PyErr_SetString(PyExc_TypeError,
1312 "NULL object in marshal data for set");
1313 Py_DECREF(v);
1314 v = NULL;
1315 break;
1316 }
1317 if (PySet_Add(v, v2) == -1) {
1318 Py_DECREF(v);
1319 Py_DECREF(v2);
1320 v = NULL;
1321 break;
1322 }
1323 Py_DECREF(v2);
1324 }
1325 if (type != TYPE_SET)
1326 v = r_ref_insert(v, idx, flag, p);
1327 retval = v;
1328 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 case TYPE_CODE:
1332 {
1333 int argcount;
1334 int kwonlyargcount;
1335 int nlocals;
1336 int stacksize;
1337 int flags;
1338 PyObject *code = NULL;
1339 PyObject *consts = NULL;
1340 PyObject *names = NULL;
1341 PyObject *varnames = NULL;
1342 PyObject *freevars = NULL;
1343 PyObject *cellvars = NULL;
1344 PyObject *filename = NULL;
1345 PyObject *name = NULL;
1346 int firstlineno;
1347 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001348
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001349 idx = r_ref_reserve(flag, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001350 if (idx < 0)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001351 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001355 /* XXX ignore long->int overflows for now */
1356 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001357 if (PyErr_Occurred())
1358 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001360 if (PyErr_Occurred())
1361 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001363 if (PyErr_Occurred())
1364 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001366 if (PyErr_Occurred())
1367 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001369 if (PyErr_Occurred())
1370 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 code = r_object(p);
1372 if (code == NULL)
1373 goto code_error;
1374 consts = r_object(p);
1375 if (consts == NULL)
1376 goto code_error;
1377 names = r_object(p);
1378 if (names == NULL)
1379 goto code_error;
1380 varnames = r_object(p);
1381 if (varnames == NULL)
1382 goto code_error;
1383 freevars = r_object(p);
1384 if (freevars == NULL)
1385 goto code_error;
1386 cellvars = r_object(p);
1387 if (cellvars == NULL)
1388 goto code_error;
1389 filename = r_object(p);
1390 if (filename == NULL)
1391 goto code_error;
1392 name = r_object(p);
1393 if (name == NULL)
1394 goto code_error;
1395 firstlineno = (int)r_long(p);
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001396 if (firstlineno == -1 && PyErr_Occurred())
1397 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 lnotab = r_object(p);
1399 if (lnotab == NULL)
1400 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 v = (PyObject *) PyCode_New(
1403 argcount, kwonlyargcount,
1404 nlocals, stacksize, flags,
1405 code, consts, names, varnames,
1406 freevars, cellvars, filename, name,
1407 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001408 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 code_error:
1411 Py_XDECREF(code);
1412 Py_XDECREF(consts);
1413 Py_XDECREF(names);
1414 Py_XDECREF(varnames);
1415 Py_XDECREF(freevars);
1416 Py_XDECREF(cellvars);
1417 Py_XDECREF(filename);
1418 Py_XDECREF(name);
1419 Py_XDECREF(lnotab);
1420 }
1421 retval = v;
1422 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001423
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001424 case TYPE_REF:
1425 n = r_long(p);
1426 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001427 if (n == -1 && PyErr_Occurred())
1428 break;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001429 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001430 break;
1431 }
1432 v = PyList_GET_ITEM(p->refs, n);
1433 if (v == Py_None) {
1434 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001435 break;
1436 }
1437 Py_INCREF(v);
1438 retval = v;
1439 break;
1440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 default:
1442 /* Bogus data got written, which isn't ideal.
1443 This will let you keep working and recover. */
1444 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 break;
1446
1447 }
1448 p->depth--;
1449 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001450}
1451
Neal Norwitzd85c4522004-06-13 20:31:49 +00001452static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001453read_object(RFILE *p)
1454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 PyObject *v;
1456 if (PyErr_Occurred()) {
1457 fprintf(stderr, "XXX readobject called with exception set\n");
1458 return NULL;
1459 }
1460 v = r_object(p);
1461 if (v == NULL && !PyErr_Occurred())
1462 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1463 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001464}
1465
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001466int
1467PyMarshal_ReadShortFromFile(FILE *fp)
1468{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001470 int res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001472 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 rf.fp = fp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 rf.end = rf.ptr = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001475 rf.buf = NULL;
1476 res = r_short(&rf);
1477 if (rf.buf != NULL)
1478 PyMem_FREE(rf.buf);
1479 return res;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001480}
1481
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001482long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001483PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001484{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001486 long res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001488 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001490 rf.buf = NULL;
1491 res = r_long(&rf);
1492 if (rf.buf != NULL)
1493 PyMem_FREE(rf.buf);
1494 return res;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001495}
1496
Steve Dowerf2f373f2015-02-21 08:44:05 -08001497/* Return size of file in bytes; < 0 if unknown or INT_MAX if too big */
Tim Peters691e0e92001-01-18 04:39:16 +00001498static off_t
1499getfilesize(FILE *fp)
1500{
Steve Dowerf2f373f2015-02-21 08:44:05 -08001501 struct _Py_stat_struct st;
Victor Stinnere134a7f2015-03-30 10:09:31 +02001502 if (_Py_fstat_noraise(fileno(fp), &st) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 return -1;
Steve Dowerf2f373f2015-02-21 08:44:05 -08001504#if SIZEOF_OFF_T == 4
1505 else if (st.st_size >= INT_MAX)
1506 return (off_t)INT_MAX;
1507#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 else
Steve Dowerf2f373f2015-02-21 08:44:05 -08001509 return (off_t)st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001510}
Tim Petersd9b9ac82001-01-28 00:27:39 +00001511
Tim Peters691e0e92001-01-18 04:39:16 +00001512/* If we can get the size of the file up-front, and it's reasonably small,
1513 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1514 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001515 * CAUTION: since this may read the entire remainder of the file, don't
1516 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001517 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001518PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001519PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001520{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001521/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001522#define REASONABLE_FILE_LIMIT (1L << 18)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 off_t filesize;
1524 filesize = getfilesize(fp);
1525 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1526 char* pBuf = (char *)PyMem_MALLOC(filesize);
1527 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001528 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1529 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 PyMem_FREE(pBuf);
1531 return v;
1532 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 /* We don't have fstat, or we do but the file is larger than
1536 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1537 */
1538 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001539
Tim Peters691e0e92001-01-18 04:39:16 +00001540#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001541}
1542
Guido van Rossum79f25d91997-04-29 20:08:16 +00001543PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001544PyMarshal_ReadObjectFromFile(FILE *fp)
1545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 RFILE rf;
1547 PyObject *result;
1548 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001549 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 rf.depth = 0;
1551 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001552 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001553 rf.refs = PyList_New(0);
1554 if (rf.refs == NULL)
1555 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001557 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001558 if (rf.buf != NULL)
1559 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001560 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001561}
1562
1563PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03001564PyMarshal_ReadObjectFromString(const char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001565{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 RFILE rf;
1567 PyObject *result;
1568 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001569 rf.readable = NULL;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001570 rf.ptr = (char *)str;
1571 rf.end = (char *)str + len;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001572 rf.buf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001574 rf.refs = PyList_New(0);
1575 if (rf.refs == NULL)
1576 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001578 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001579 if (rf.buf != NULL)
1580 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001582}
1583
Guido van Rossum79f25d91997-04-29 20:08:16 +00001584PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001585PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001586{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001588
Serhiy Storchakace921c622015-02-11 15:53:31 +02001589 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1591 if (wf.str == NULL)
1592 return NULL;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +02001593 wf.ptr = wf.buf = PyBytes_AS_STRING((PyBytesObject *)wf.str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 wf.end = wf.ptr + PyBytes_Size(wf.str);
1595 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 wf.version = version;
Serhiy Storchakace921c622015-02-11 15:53:31 +02001597 if (w_init_refs(&wf, version)) {
1598 Py_DECREF(wf.str);
1599 return NULL;
1600 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 w_object(x, &wf);
Serhiy Storchakace921c622015-02-11 15:53:31 +02001602 w_clear_refs(&wf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 if (wf.str != NULL) {
1604 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1605 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1606 Py_DECREF(wf.str);
1607 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001608 "too much marshal data for a bytes object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 return NULL;
1610 }
1611 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1612 return NULL;
1613 }
1614 if (wf.error != WFERR_OK) {
1615 Py_XDECREF(wf.str);
1616 if (wf.error == WFERR_NOMEMORY)
1617 PyErr_NoMemory();
1618 else
1619 PyErr_SetString(PyExc_ValueError,
1620 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1621 :"object too deeply nested to marshal");
1622 return NULL;
1623 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001624 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001625}
1626
Guido van Rossum64b45521991-06-07 13:58:22 +00001627/* And an interface for Python programs... */
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001628/*[clinic input]
1629marshal.dump
1630
1631 value: object
1632 Must be a supported type.
1633 file: object
1634 Must be a writeable binary file.
1635 version: int(c_default="Py_MARSHAL_VERSION") = version
1636 Indicates the data format that dump should use.
1637 /
1638
1639Write the value on the open file.
1640
1641If the value has (or contains an object that has) an unsupported type, a
1642ValueError exception is raised - but garbage data will also be written
1643to the file. The object will not be properly read back by load().
1644[clinic start generated code]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001645
Guido van Rossum79f25d91997-04-29 20:08:16 +00001646static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001647marshal_dump_impl(PyObject *module, PyObject *value, PyObject *file,
1648 int version)
1649/*[clinic end generated code: output=aaee62c7028a7cb2 input=6c7a3c23c6fef556]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001650{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 /* XXX Quick hack -- need to do this differently */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 PyObject *s;
1653 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001654 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001655
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001656 s = PyMarshal_WriteObjectToString(value, version);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 if (s == NULL)
1658 return NULL;
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001659 res = _PyObject_CallMethodIdObjArgs(file, &PyId_write, s, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 Py_DECREF(s);
1661 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001662}
1663
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001664/*[clinic input]
1665marshal.load
1666
1667 file: object
1668 Must be readable binary file.
1669 /
1670
1671Read one value from the open file and return it.
1672
1673If no valid value is read (e.g. because the data has a different Python
1674version's incompatible marshal format), raise EOFError, ValueError or
1675TypeError.
1676
1677Note: If an object containing an unsupported type was marshalled with
1678dump(), load() will substitute None for the unmarshallable type.
1679[clinic start generated code]*/
R. David Murraydd226ea2009-05-13 12:27:21 +00001680
Guido van Rossum79f25d91997-04-29 20:08:16 +00001681static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001682marshal_load(PyObject *module, PyObject *file)
1683/*[clinic end generated code: output=f8e5c33233566344 input=c85c2b594cd8124a]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001684{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001686 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001688
1689 /*
1690 * Make a call to the read method, but read zero bytes.
1691 * This is to ensure that the object passed in at least
1692 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001693 * This can be removed if we guarantee good error handling
1694 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001695 */
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001696 data = _PyObject_CallMethodId(file, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 if (data == NULL)
1698 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001699 if (!PyBytes_Check(data)) {
1700 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001701 "file.read() returned not bytes but %.100s",
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001702 data->ob_type->tp_name);
1703 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 }
1705 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001706 rf.depth = 0;
1707 rf.fp = NULL;
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001708 rf.readable = file;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001709 rf.ptr = rf.end = NULL;
1710 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001711 if ((rf.refs = PyList_New(0)) != NULL) {
1712 result = read_object(&rf);
1713 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001714 if (rf.buf != NULL)
1715 PyMem_FREE(rf.buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001716 } else
1717 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 Py_DECREF(data);
1720 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001721}
1722
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001723/*[clinic input]
1724marshal.dumps
R. David Murraydd226ea2009-05-13 12:27:21 +00001725
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001726 value: object
1727 Must be a supported type.
1728 version: int(c_default="Py_MARSHAL_VERSION") = version
1729 Indicates the data format that dumps should use.
1730 /
1731
1732Return the bytes object that would be written to a file by dump(value, file).
1733
1734Raise a ValueError exception if value has (or contains an object that has) an
1735unsupported type.
1736[clinic start generated code]*/
R. David Murraydd226ea2009-05-13 12:27:21 +00001737
Guido van Rossum79f25d91997-04-29 20:08:16 +00001738static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001739marshal_dumps_impl(PyObject *module, PyObject *value, int version)
1740/*[clinic end generated code: output=9c200f98d7256cad input=a2139ea8608e9b27]*/
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001741{
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001742 return PyMarshal_WriteObjectToString(value, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001743}
1744
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001745/*[clinic input]
1746marshal.loads
R. David Murraydd226ea2009-05-13 12:27:21 +00001747
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001748 bytes: Py_buffer
1749 /
1750
1751Convert the bytes-like object to a value.
1752
1753If no valid value is found, raise EOFError, ValueError or TypeError. Extra
1754bytes in the input are ignored.
1755[clinic start generated code]*/
R. David Murraydd226ea2009-05-13 12:27:21 +00001756
Guido van Rossum79f25d91997-04-29 20:08:16 +00001757static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001758marshal_loads_impl(PyObject *module, Py_buffer *bytes)
1759/*[clinic end generated code: output=9fc65985c93d1bb1 input=6f426518459c8495]*/
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001760{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 RFILE rf;
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001762 char *s = bytes->buf;
1763 Py_ssize_t n = bytes->len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 PyObject* result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001766 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 rf.ptr = s;
1768 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001770 if ((rf.refs = PyList_New(0)) == NULL)
1771 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 result = read_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001773 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001775}
1776
Guido van Rossum79f25d91997-04-29 20:08:16 +00001777static PyMethodDef marshal_methods[] = {
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001778 MARSHAL_DUMP_METHODDEF
1779 MARSHAL_LOAD_METHODDEF
1780 MARSHAL_DUMPS_METHODDEF
1781 MARSHAL_LOADS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001783};
1784
R. David Murraydd226ea2009-05-13 12:27:21 +00001785
1786PyDoc_STRVAR(module_doc,
1787"This module contains functions that can read and write Python values in\n\
1788a binary format. The format is specific to Python, but independent of\n\
1789machine architecture issues.\n\
1790\n\
1791Not all Python object types are supported; in general, only objects\n\
1792whose value is independent from a particular invocation of Python can be\n\
1793written and read by this module. The following types are supported:\n\
1794None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1795tuples, lists, sets, dictionaries, and code objects, where it\n\
1796should be understood that tuples, lists and dictionaries are only\n\
1797supported as long as the values contained therein are themselves\n\
1798supported; and recursive lists and dictionaries should not be written\n\
1799(they will cause infinite loops).\n\
1800\n\
1801Variables:\n\
1802\n\
1803version -- indicates the format that the module uses. Version 0 is the\n\
1804 historical format, version 1 shares interned strings and version 2\n\
1805 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001806 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001807\n\
1808Functions:\n\
1809\n\
1810dump() -- write value to a file\n\
1811load() -- read value from a file\n\
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001812dumps() -- marshal value as a bytes object\n\
1813loads() -- read value from a bytes-like object");
R. David Murraydd226ea2009-05-13 12:27:21 +00001814
1815
1816
Brett Cannon429ef652008-06-27 00:35:35 +00001817static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 PyModuleDef_HEAD_INIT,
1819 "marshal",
1820 module_doc,
1821 0,
1822 marshal_methods,
1823 NULL,
1824 NULL,
1825 NULL,
1826 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001827};
1828
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001829PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001830PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001831{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 PyObject *mod = PyModule_Create(&marshalmodule);
1833 if (mod == NULL)
1834 return NULL;
1835 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1836 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001837}