blob: 7a4b9d29b4e4aec3a7d88867242faf8663e65720 [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
Fred Drake6da0b912000-06-28 18:47:56 +000017/* High water mark to determine when the marshalled object is dangerously deep
18 * and risks coring the interpreter. When the object stack gets this deep,
19 * raise an exception instead of continuing.
Guido van Rossum63175a12007-08-29 20:39:13 +000020 * On Windows debug builds, reduce this value.
Fred Drake6da0b912000-06-28 18:47:56 +000021 */
Guido van Rossum63175a12007-08-29 20:39:13 +000022#if defined(MS_WINDOWS) && defined(_DEBUG)
Steve Dowerf6c69e62014-11-01 15:15:16 -070023#define MAX_MARSHAL_STACK_DEPTH 1000
Guido van Rossum63175a12007-08-29 20:39:13 +000024#else
Guido van Rossumd59da4b2007-05-22 18:11:13 +000025#define MAX_MARSHAL_STACK_DEPTH 2000
Guido van Rossum63175a12007-08-29 20:39:13 +000026#endif
Fred Drake6da0b912000-06-28 18:47:56 +000027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000028#define TYPE_NULL '0'
29#define TYPE_NONE 'N'
30#define TYPE_FALSE 'F'
31#define TYPE_TRUE 'T'
32#define TYPE_STOPITER 'S'
33#define TYPE_ELLIPSIS '.'
34#define TYPE_INT 'i'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035#define TYPE_FLOAT 'f'
36#define TYPE_BINARY_FLOAT 'g'
37#define TYPE_COMPLEX 'x'
38#define TYPE_BINARY_COMPLEX 'y'
39#define TYPE_LONG 'l'
40#define TYPE_STRING 's'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070041#define TYPE_INTERNED 't'
42#define TYPE_REF 'r'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043#define TYPE_TUPLE '('
44#define TYPE_LIST '['
45#define TYPE_DICT '{'
46#define TYPE_CODE 'c'
47#define TYPE_UNICODE 'u'
48#define TYPE_UNKNOWN '?'
49#define TYPE_SET '<'
50#define TYPE_FROZENSET '>'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070051#define FLAG_REF '\x80' /* with a type, add obj to index */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000052
Antoine Pitrou1164dfc2013-10-12 22:25:39 +020053#define TYPE_ASCII 'a'
54#define TYPE_ASCII_INTERNED 'A'
55#define TYPE_SMALL_TUPLE ')'
56#define TYPE_SHORT_ASCII 'z'
57#define TYPE_SHORT_ASCII_INTERNED 'Z'
58
Eric Smithb1a03cf2009-04-21 11:57:38 +000059#define WFERR_OK 0
60#define WFERR_UNMARSHALLABLE 1
61#define WFERR_NESTEDTOODEEP 2
62#define WFERR_NOMEMORY 3
63
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000064typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 FILE *fp;
66 int error; /* see WFERR_* values */
67 int depth;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000068 PyObject *str;
69 char *ptr;
70 char *end;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +020071 char *buf;
Serhiy Storchakace921c622015-02-11 15:53:31 +020072 _Py_hashtable_t *hashtable;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073 int version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000074} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000075
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +020076#define w_byte(c, p) do { \
77 if ((p)->ptr != (p)->end || w_reserve((p), 1)) \
78 *(p)->ptr++ = (c); \
79 } while(0)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000080
81static void
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +020082w_flush(WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000083{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +020084 assert(p->fp != NULL);
85 fwrite(p->buf, 1, p->ptr - p->buf, p->fp);
86 p->ptr = p->buf;
87}
88
89static int
90w_reserve(WFILE *p, Py_ssize_t needed)
91{
92 Py_ssize_t pos, size, delta;
93 if (p->ptr == NULL)
94 return 0; /* An error already occurred */
95 if (p->fp != NULL) {
96 w_flush(p);
97 return needed <= p->end - p->ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000098 }
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +020099 assert(p->str != NULL);
100 pos = p->ptr - p->buf;
101 size = PyBytes_Size(p->str);
102 if (size > 16*1024*1024)
103 delta = (size >> 3); /* 12.5% overallocation */
104 else
105 delta = size + 1024;
106 delta = Py_MAX(delta, needed);
107 if (delta > PY_SSIZE_T_MAX - size) {
108 p->error = WFERR_NOMEMORY;
109 return 0;
110 }
111 size += delta;
112 if (_PyBytes_Resize(&p->str, size) != 0) {
113 p->ptr = p->buf = p->end = NULL;
114 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 }
116 else {
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200117 p->buf = PyBytes_AS_STRING(p->str);
118 p->ptr = p->buf + pos;
119 p->end = p->buf + size;
120 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000121 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000122}
123
124static void
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300125w_string(const char *s, Py_ssize_t n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000126{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200127 Py_ssize_t m;
128 if (!n || p->ptr == NULL)
129 return;
130 m = p->end - p->ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 if (p->fp != NULL) {
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200132 if (n <= m) {
133 Py_MEMCPY(p->ptr, s, n);
134 p->ptr += n;
135 }
136 else {
137 w_flush(p);
138 fwrite(s, 1, n, p->fp);
139 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 }
141 else {
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200142 if (n <= m || w_reserve(p, n - m)) {
143 Py_MEMCPY(p->ptr, s, n);
144 p->ptr += n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 }
146 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000147}
148
149static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000150w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 w_byte((char)( x & 0xff), p);
153 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000154}
155
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000156static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000157w_long(long 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);
161 w_byte((char)((x>>16) & 0xff), p);
162 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000163}
164
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200165#define SIZE32_MAX 0x7FFFFFFF
166
167#if SIZEOF_SIZE_T > 4
168# define W_SIZE(n, p) do { \
169 if ((n) > SIZE32_MAX) { \
170 (p)->depth--; \
171 (p)->error = WFERR_UNMARSHALLABLE; \
172 return; \
173 } \
174 w_long((long)(n), p); \
175 } while(0)
176#else
177# define W_SIZE w_long
178#endif
179
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300180static void
181w_pstring(const char *s, Py_ssize_t n, WFILE *p)
182{
183 W_SIZE(n, p);
184 w_string(s, n, p);
185}
186
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200187static void
188w_short_pstring(const char *s, Py_ssize_t n, WFILE *p)
189{
Antoine Pitroub30f2712013-10-12 23:14:47 +0200190 w_byte(Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char), p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200191 w_string(s, n, p);
192}
193
Serhiy Storchaka95949422013-08-27 19:40:23 +0300194/* We assume that Python ints are stored internally in base some power of
Mark Dickinsonbd792642009-03-18 20:06:12 +0000195 2**15; for the sake of portability we'll always read and write them in base
196 exactly 2**15. */
197
198#define PyLong_MARSHAL_SHIFT 15
199#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
200#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
201#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
202#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
203#endif
204#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
205
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700206#define W_TYPE(t, p) do { \
207 w_byte((t) | flag, (p)); \
208} while(0)
209
Mark Dickinsonbd792642009-03-18 20:06:12 +0000210static void
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700211w_PyLong(const PyLongObject *ob, char flag, WFILE *p)
Mark Dickinsonbd792642009-03-18 20:06:12 +0000212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 Py_ssize_t i, j, n, l;
214 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000215
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700216 W_TYPE(TYPE_LONG, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 if (Py_SIZE(ob) == 0) {
218 w_long((long)0, p);
219 return;
220 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 /* set l to number of base PyLong_MARSHAL_BASE digits */
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200223 n = Py_ABS(Py_SIZE(ob));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 l = (n-1) * PyLong_MARSHAL_RATIO;
225 d = ob->ob_digit[n-1];
226 assert(d != 0); /* a PyLong is always normalized */
227 do {
228 d >>= PyLong_MARSHAL_SHIFT;
229 l++;
230 } while (d != 0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200231 if (l > SIZE32_MAX) {
232 p->depth--;
233 p->error = WFERR_UNMARSHALLABLE;
234 return;
235 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 for (i=0; i < n-1; i++) {
239 d = ob->ob_digit[i];
240 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
241 w_short(d & PyLong_MARSHAL_MASK, p);
242 d >>= PyLong_MARSHAL_SHIFT;
243 }
244 assert (d == 0);
245 }
246 d = ob->ob_digit[n-1];
247 do {
248 w_short(d & PyLong_MARSHAL_MASK, p);
249 d >>= PyLong_MARSHAL_SHIFT;
250 } while (d != 0);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000251}
252
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700253static int
254w_ref(PyObject *v, char *flag, WFILE *p)
255{
Serhiy Storchakace921c622015-02-11 15:53:31 +0200256 _Py_hashtable_entry_t *entry;
257 int w;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700258
Serhiy Storchakace921c622015-02-11 15:53:31 +0200259 if (p->version < 3 || p->hashtable == NULL)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700260 return 0; /* not writing object references */
261
262 /* if it has only one reference, it definitely isn't shared */
263 if (Py_REFCNT(v) == 1)
264 return 0;
265
Serhiy Storchakace921c622015-02-11 15:53:31 +0200266 entry = _Py_hashtable_get_entry(p->hashtable, v);
267 if (entry != NULL) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700268 /* write the reference index to the stream */
Serhiy Storchakace921c622015-02-11 15:53:31 +0200269 _Py_HASHTABLE_ENTRY_READ_DATA(p->hashtable, &w, sizeof(w), entry);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700270 /* we don't store "long" indices in the dict */
271 assert(0 <= w && w <= 0x7fffffff);
272 w_byte(TYPE_REF, p);
273 w_long(w, p);
274 return 1;
275 } else {
Serhiy Storchakace921c622015-02-11 15:53:31 +0200276 size_t s = p->hashtable->entries;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700277 /* we don't support long indices */
278 if (s >= 0x7fffffff) {
279 PyErr_SetString(PyExc_ValueError, "too many objects");
280 goto err;
281 }
Serhiy Storchaka26861b02015-02-16 20:52:17 +0200282 w = (int)s;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200283 Py_INCREF(v);
284 if (_Py_HASHTABLE_SET(p->hashtable, v, w) < 0) {
285 Py_DECREF(v);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700286 goto err;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200287 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700288 *flag |= FLAG_REF;
289 return 0;
290 }
291err:
292 p->error = WFERR_UNMARSHALLABLE;
293 return 1;
294}
295
296static void
297w_complex_object(PyObject *v, char flag, WFILE *p);
298
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000299static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000300w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000301{
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700302 char flag = '\0';
Fred Drake6da0b912000-06-28 18:47:56 +0000303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
307 p->error = WFERR_NESTEDTOODEEP;
308 }
309 else if (v == NULL) {
310 w_byte(TYPE_NULL, p);
311 }
312 else if (v == Py_None) {
313 w_byte(TYPE_NONE, p);
314 }
315 else if (v == PyExc_StopIteration) {
316 w_byte(TYPE_STOPITER, p);
317 }
318 else if (v == Py_Ellipsis) {
319 w_byte(TYPE_ELLIPSIS, p);
320 }
321 else if (v == Py_False) {
322 w_byte(TYPE_FALSE, p);
323 }
324 else if (v == Py_True) {
325 w_byte(TYPE_TRUE, p);
326 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700327 else if (!w_ref(v, &flag, p))
328 w_complex_object(v, flag, p);
329
330 p->depth--;
331}
332
333static void
334w_complex_object(PyObject *v, char flag, WFILE *p)
335{
336 Py_ssize_t i, n;
337
338 if (PyLong_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 long x = PyLong_AsLong(v);
340 if ((x == -1) && PyErr_Occurred()) {
341 PyLongObject *ob = (PyLongObject *)v;
342 PyErr_Clear();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700343 w_PyLong(ob, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 }
345 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000346#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
348 if (y && y != -1) {
Martin v. Löwis7e395722012-07-28 19:44:05 +0200349 /* Too large for TYPE_INT */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700350 w_PyLong((PyLongObject*)v, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 }
352 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000353#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700355 W_TYPE(TYPE_INT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 w_long(x, p);
357 }
358 }
359 }
360 else if (PyFloat_CheckExact(v)) {
361 if (p->version > 1) {
362 unsigned char buf[8];
363 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
364 buf, 1) < 0) {
365 p->error = WFERR_UNMARSHALLABLE;
366 return;
367 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700368 W_TYPE(TYPE_BINARY_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 w_string((char*)buf, 8, p);
370 }
371 else {
372 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
373 'g', 17, 0, NULL);
374 if (!buf) {
375 p->error = WFERR_NOMEMORY;
376 return;
377 }
378 n = strlen(buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700379 W_TYPE(TYPE_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200381 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 PyMem_Free(buf);
383 }
384 }
385 else if (PyComplex_CheckExact(v)) {
386 if (p->version > 1) {
387 unsigned char buf[8];
388 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
389 buf, 1) < 0) {
390 p->error = WFERR_UNMARSHALLABLE;
391 return;
392 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700393 W_TYPE(TYPE_BINARY_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 w_string((char*)buf, 8, p);
395 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
396 buf, 1) < 0) {
397 p->error = WFERR_UNMARSHALLABLE;
398 return;
399 }
400 w_string((char*)buf, 8, p);
401 }
402 else {
403 char *buf;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700404 W_TYPE(TYPE_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
406 'g', 17, 0, NULL);
407 if (!buf) {
408 p->error = WFERR_NOMEMORY;
409 return;
410 }
411 n = strlen(buf);
412 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200413 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 PyMem_Free(buf);
415 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
416 'g', 17, 0, NULL);
417 if (!buf) {
418 p->error = WFERR_NOMEMORY;
419 return;
420 }
421 n = strlen(buf);
422 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200423 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 PyMem_Free(buf);
425 }
426 }
427 else if (PyBytes_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700428 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300429 w_pstring(PyBytes_AS_STRING(v), PyBytes_GET_SIZE(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 }
431 else if (PyUnicode_CheckExact(v)) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200432 if (p->version >= 4 && PyUnicode_IS_ASCII(v)) {
433 int is_short = PyUnicode_GET_LENGTH(v) < 256;
434 if (is_short) {
435 if (PyUnicode_CHECK_INTERNED(v))
436 W_TYPE(TYPE_SHORT_ASCII_INTERNED, p);
437 else
438 W_TYPE(TYPE_SHORT_ASCII, p);
439 w_short_pstring((char *) PyUnicode_1BYTE_DATA(v),
440 PyUnicode_GET_LENGTH(v), p);
441 }
442 else {
443 if (PyUnicode_CHECK_INTERNED(v))
444 W_TYPE(TYPE_ASCII_INTERNED, p);
445 else
446 W_TYPE(TYPE_ASCII, p);
447 w_pstring((char *) PyUnicode_1BYTE_DATA(v),
448 PyUnicode_GET_LENGTH(v), p);
449 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200451 else {
452 PyObject *utf8;
453 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");
454 if (utf8 == NULL) {
455 p->depth--;
456 p->error = WFERR_UNMARSHALLABLE;
457 return;
458 }
459 if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v))
460 W_TYPE(TYPE_INTERNED, p);
461 else
462 W_TYPE(TYPE_UNICODE, p);
463 w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p);
464 Py_DECREF(utf8);
465 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 }
467 else if (PyTuple_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 n = PyTuple_Size(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200469 if (p->version >= 4 && n < 256) {
470 W_TYPE(TYPE_SMALL_TUPLE, p);
Victor Stinnerda062552013-11-16 00:13:29 +0100471 w_byte((unsigned char)n, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200472 }
473 else {
474 W_TYPE(TYPE_TUPLE, p);
475 W_SIZE(n, p);
476 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 for (i = 0; i < n; i++) {
478 w_object(PyTuple_GET_ITEM(v, i), p);
479 }
480 }
481 else if (PyList_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700482 W_TYPE(TYPE_LIST, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 n = PyList_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200484 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000485 for (i = 0; i < n; i++) {
486 w_object(PyList_GET_ITEM(v, i), p);
487 }
488 }
489 else if (PyDict_CheckExact(v)) {
490 Py_ssize_t pos;
491 PyObject *key, *value;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700492 W_TYPE(TYPE_DICT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 /* This one is NULL object terminated! */
494 pos = 0;
495 while (PyDict_Next(v, &pos, &key, &value)) {
496 w_object(key, p);
497 w_object(value, p);
498 }
499 w_object((PyObject *)NULL, p);
500 }
501 else if (PyAnySet_CheckExact(v)) {
502 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 if (PyObject_TypeCheck(v, &PySet_Type))
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700505 W_TYPE(TYPE_SET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 else
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700507 W_TYPE(TYPE_FROZENSET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 n = PyObject_Size(v);
509 if (n == -1) {
510 p->depth--;
511 p->error = WFERR_UNMARSHALLABLE;
512 return;
513 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200514 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 it = PyObject_GetIter(v);
516 if (it == NULL) {
517 p->depth--;
518 p->error = WFERR_UNMARSHALLABLE;
519 return;
520 }
521 while ((value = PyIter_Next(it)) != NULL) {
522 w_object(value, p);
523 Py_DECREF(value);
524 }
525 Py_DECREF(it);
526 if (PyErr_Occurred()) {
527 p->depth--;
528 p->error = WFERR_UNMARSHALLABLE;
529 return;
530 }
531 }
532 else if (PyCode_Check(v)) {
533 PyCodeObject *co = (PyCodeObject *)v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700534 W_TYPE(TYPE_CODE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 w_long(co->co_argcount, p);
536 w_long(co->co_kwonlyargcount, p);
537 w_long(co->co_nlocals, p);
538 w_long(co->co_stacksize, p);
539 w_long(co->co_flags, p);
540 w_object(co->co_code, p);
541 w_object(co->co_consts, p);
542 w_object(co->co_names, p);
543 w_object(co->co_varnames, p);
544 w_object(co->co_freevars, p);
545 w_object(co->co_cellvars, p);
546 w_object(co->co_filename, p);
547 w_object(co->co_name, p);
548 w_long(co->co_firstlineno, p);
549 w_object(co->co_lnotab, p);
550 }
551 else if (PyObject_CheckBuffer(v)) {
Serhiy Storchakab757c832014-12-05 22:25:22 +0200552 /* Write unknown bytes-like objects as a byte string */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100554 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100556 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100558 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700560 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300561 w_pstring(view.buf, view.len, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100562 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 }
564 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700565 W_TYPE(TYPE_UNKNOWN, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 p->error = WFERR_UNMARSHALLABLE;
567 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000568}
569
Serhiy Storchakace921c622015-02-11 15:53:31 +0200570static int
571w_init_refs(WFILE *wf, int version)
572{
573 if (version >= 3) {
574 wf->hashtable = _Py_hashtable_new(sizeof(int), _Py_hashtable_hash_ptr,
575 _Py_hashtable_compare_direct);
576 if (wf->hashtable == NULL) {
577 PyErr_NoMemory();
578 return -1;
579 }
580 }
581 return 0;
582}
583
584static int
585w_decref_entry(_Py_hashtable_entry_t *entry, void *Py_UNUSED(data))
586{
587 Py_XDECREF(entry->key);
588 return 0;
589}
590
591static void
592w_clear_refs(WFILE *wf)
593{
594 if (wf->hashtable != NULL) {
595 _Py_hashtable_foreach(wf->hashtable, w_decref_entry, NULL);
596 _Py_hashtable_destroy(wf->hashtable);
597 }
598}
599
Serhiy Storchaka95949422013-08-27 19:40:23 +0300600/* version currently has no effect for writing ints. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000601void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000602PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000603{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200604 char buf[4];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 WFILE wf;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200606 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 wf.fp = fp;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200608 wf.ptr = wf.buf = buf;
609 wf.end = wf.ptr + sizeof(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 wf.version = version;
612 w_long(x, &wf);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200613 w_flush(&wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000614}
615
616void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000617PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000618{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200619 char buf[BUFSIZ];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 WFILE wf;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200621 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 wf.fp = fp;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200623 wf.ptr = wf.buf = buf;
624 wf.end = wf.ptr + sizeof(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 wf.version = version;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200627 if (w_init_refs(&wf, version))
628 return; /* caller mush check PyErr_Occurred() */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 w_object(x, &wf);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200630 w_clear_refs(&wf);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200631 w_flush(&wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000632}
633
Serhiy Storchakac07422c2015-02-11 16:18:09 +0200634typedef struct {
635 FILE *fp;
636 int depth;
637 PyObject *readable; /* Stream-like object being read from */
638 PyObject *current_filename;
639 char *ptr;
640 char *end;
641 char *buf;
642 Py_ssize_t buf_size;
643 PyObject *refs; /* a list */
644} RFILE;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000645
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200646static const char *
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200647r_string(Py_ssize_t n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000648{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200649 Py_ssize_t read = -1;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100650
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200651 if (p->ptr != NULL) {
652 /* Fast path for loads() */
653 char *res = p->ptr;
654 Py_ssize_t left = p->end - p->ptr;
655 if (left < n) {
656 PyErr_SetString(PyExc_EOFError,
657 "marshal data too short");
658 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100659 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200660 p->ptr += n;
661 return res;
662 }
663 if (p->buf == NULL) {
664 p->buf = PyMem_MALLOC(n);
665 if (p->buf == NULL) {
666 PyErr_NoMemory();
667 return NULL;
668 }
669 p->buf_size = n;
670 }
671 else if (p->buf_size < n) {
672 p->buf = PyMem_REALLOC(p->buf, n);
673 if (p->buf == NULL) {
674 PyErr_NoMemory();
675 return NULL;
676 }
677 p->buf_size = n;
678 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100679
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200680 if (!p->readable) {
681 assert(p->fp != NULL);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200682 read = fread(p->buf, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100683 }
684 else {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200685 _Py_IDENTIFIER(readinto);
686 PyObject *res, *mview;
687 Py_buffer buf;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200688
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200689 if (PyBuffer_FillInfo(&buf, NULL, p->buf, n, 0, PyBUF_CONTIG) == -1)
690 return NULL;
691 mview = PyMemoryView_FromBuffer(&buf);
692 if (mview == NULL)
693 return NULL;
694
695 res = _PyObject_CallMethodId(p->readable, &PyId_readinto, "N", mview);
696 if (res != NULL) {
697 read = PyNumber_AsSsize_t(res, PyExc_ValueError);
698 Py_DECREF(res);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100699 }
700 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200701 if (read != n) {
702 if (!PyErr_Occurred()) {
703 if (read > n)
704 PyErr_Format(PyExc_ValueError,
705 "read() returned too much data: "
706 "%zd bytes requested, %zd returned",
707 n, read);
708 else
709 PyErr_SetString(PyExc_EOFError,
710 "EOF read where not expected");
711 }
712 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100713 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200714 return p->buf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100715}
716
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100717static int
718r_byte(RFILE *p)
719{
720 int c = EOF;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100721
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200722 if (p->ptr != NULL) {
723 if (p->ptr < p->end)
724 c = (unsigned char) *p->ptr++;
725 return c;
726 }
727 if (!p->readable) {
728 assert(p->fp);
729 c = getc(p->fp);
730 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100731 else {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200732 const char *ptr = r_string(1, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200733 if (ptr != NULL)
734 c = *(unsigned char *) ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100735 }
736 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000737}
738
739static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000740r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000741{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200742 short x = -1;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200743 const unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100744
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200745 buffer = (const unsigned char *) r_string(2, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200746 if (buffer != NULL) {
747 x = buffer[0];
748 x |= buffer[1] << 8;
749 /* Sign-extension, in case short greater than 16 bits */
750 x |= -(x & 0x8000);
751 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000753}
754
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000755static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000756r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000757{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200758 long x = -1;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200759 const unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100760
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200761 buffer = (const unsigned char *) r_string(4, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200762 if (buffer != NULL) {
763 x = buffer[0];
764 x |= (long)buffer[1] << 8;
765 x |= (long)buffer[2] << 16;
766 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000767#if SIZEOF_LONG > 4
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200768 /* Sign extension for 64-bit machines */
769 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000770#endif
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200771 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000773}
774
Guido van Rossum79f25d91997-04-29 20:08:16 +0000775static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000776r_PyLong(RFILE *p)
777{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200779 long n, size, i;
780 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100784 if (PyErr_Occurred())
785 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 if (n == 0)
787 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200788 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 PyErr_SetString(PyExc_ValueError,
790 "bad marshal data (long size out of range)");
791 return NULL;
792 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000793
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200794 size = 1 + (Py_ABS(n) - 1) / PyLong_MARSHAL_RATIO;
795 shorts_in_top_digit = 1 + (Py_ABS(n) - 1) % PyLong_MARSHAL_RATIO;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 ob = _PyLong_New(size);
797 if (ob == NULL)
798 return NULL;
Victor Stinner763b0d12013-10-31 16:56:38 +0100799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 for (i = 0; i < size-1; i++) {
803 d = 0;
804 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
805 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100806 if (PyErr_Occurred()) {
807 Py_DECREF(ob);
808 return NULL;
809 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 if (md < 0 || md > PyLong_MARSHAL_BASE)
811 goto bad_digit;
812 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
813 }
814 ob->ob_digit[i] = d;
815 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 d = 0;
818 for (j=0; j < shorts_in_top_digit; j++) {
819 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100820 if (PyErr_Occurred()) {
821 Py_DECREF(ob);
822 return NULL;
823 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 if (md < 0 || md > PyLong_MARSHAL_BASE)
825 goto bad_digit;
826 /* topmost marshal digit should be nonzero */
827 if (md == 0 && j == shorts_in_top_digit - 1) {
828 Py_DECREF(ob);
829 PyErr_SetString(PyExc_ValueError,
830 "bad marshal data (unnormalized long data)");
831 return NULL;
832 }
833 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
834 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100835 if (PyErr_Occurred()) {
836 Py_DECREF(ob);
837 return NULL;
838 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 /* top digit should be nonzero, else the resulting PyLong won't be
840 normalized */
841 ob->ob_digit[size-1] = d;
842 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000843 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 Py_DECREF(ob);
845 PyErr_SetString(PyExc_ValueError,
846 "bad marshal data (digit out of range in long)");
847 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000848}
849
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700850/* allocate the reflist index for a new object. Return -1 on failure */
851static Py_ssize_t
852r_ref_reserve(int flag, RFILE *p)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700853{
854 if (flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200855 Py_ssize_t idx = PyList_GET_SIZE(p->refs);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700856 if (idx >= 0x7ffffffe) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700857 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700858 return -1;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700859 }
860 if (PyList_Append(p->refs, Py_None) < 0)
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700861 return -1;
862 return idx;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700863 } else
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700864 return 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700865}
866
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700867/* insert the new object 'o' to the reflist at previously
868 * allocated index 'idx'.
869 * 'o' can be NULL, in which case nothing is done.
870 * if 'o' was non-NULL, and the function succeeds, 'o' is returned.
871 * if 'o' was non-NULL, and the function fails, 'o' is released and
872 * NULL returned. This simplifies error checking at the call site since
873 * a single test for NULL for the function result is enough.
874 */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700875static PyObject *
876r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
877{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700878 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200879 PyObject *tmp = PyList_GET_ITEM(p->refs, idx);
880 Py_INCREF(o);
881 PyList_SET_ITEM(p->refs, idx, o);
882 Py_DECREF(tmp);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700883 }
884 return o;
885}
886
887/* combination of both above, used when an object can be
888 * created whenever it is seen in the file, as opposed to
889 * after having loaded its sub-objects.
890 */
891static PyObject *
892r_ref(PyObject *o, int flag, RFILE *p)
893{
Victor Stinner359fabc2013-10-31 17:09:01 +0100894 assert(flag & FLAG_REF);
895 if (o == NULL)
896 return NULL;
897 if (PyList_Append(p->refs, o) < 0) {
898 Py_DECREF(o); /* release the new object */
899 return NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700900 }
901 return o;
902}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000903
904static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000905r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000906{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 /* NULL is a valid return value, it does not necessarily means that
908 an exception is set. */
909 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500910 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700912 int type, code = r_byte(p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200913 int flag, is_interned = 0;
Christian Heimes35728422013-10-13 02:29:06 +0200914 PyObject *retval = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000915
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700916 if (code == EOF) {
917 PyErr_SetString(PyExc_EOFError,
918 "EOF read where object expected");
919 return NULL;
920 }
921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
925 p->depth--;
926 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
927 return NULL;
928 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000929
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700930 flag = code & FLAG_REF;
931 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700932
933#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700934 if (flag) \
935 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700936} while (0)
937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 case TYPE_NULL:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 case TYPE_NONE:
944 Py_INCREF(Py_None);
945 retval = Py_None;
946 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 case TYPE_STOPITER:
949 Py_INCREF(PyExc_StopIteration);
950 retval = PyExc_StopIteration;
951 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 case TYPE_ELLIPSIS:
954 Py_INCREF(Py_Ellipsis);
955 retval = Py_Ellipsis;
956 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 case TYPE_FALSE:
959 Py_INCREF(Py_False);
960 retval = Py_False;
961 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 case TYPE_TRUE:
964 Py_INCREF(Py_True);
965 retval = Py_True;
966 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100969 n = r_long(p);
970 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700971 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 case TYPE_LONG:
975 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700976 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 case TYPE_FLOAT:
980 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200981 char buf[256];
982 const char *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 double dx;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300985 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 PyErr_SetString(PyExc_EOFError,
987 "EOF read where object expected");
988 break;
989 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200990 ptr = r_string(n, p);
991 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300992 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200993 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 buf[n] = '\0';
995 dx = PyOS_string_to_double(buf, NULL, NULL);
996 if (dx == -1.0 && PyErr_Occurred())
997 break;
998 retval = PyFloat_FromDouble(dx);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700999 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 break;
1001 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001002
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 case TYPE_BINARY_FLOAT:
1004 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001005 const unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 double x;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001007 buf = (const unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001008 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 x = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001011 if (x == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001014 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 break;
1016 }
Michael W. Hudsondf888462005-06-03 14:41:55 +00001017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 case TYPE_COMPLEX:
1019 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001020 char buf[256];
1021 const char *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 Py_complex c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001024 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 PyErr_SetString(PyExc_EOFError,
1026 "EOF read where object expected");
1027 break;
1028 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001029 ptr = r_string(n, p);
1030 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001031 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001032 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001033 buf[n] = '\0';
1034 c.real = PyOS_string_to_double(buf, NULL, NULL);
1035 if (c.real == -1.0 && PyErr_Occurred())
1036 break;
1037 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001038 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 PyErr_SetString(PyExc_EOFError,
1040 "EOF read where object expected");
1041 break;
1042 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001043 ptr = r_string(n, p);
1044 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001045 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001046 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 buf[n] = '\0';
1048 c.imag = PyOS_string_to_double(buf, NULL, NULL);
1049 if (c.imag == -1.0 && PyErr_Occurred())
1050 break;
1051 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001052 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 break;
1054 }
Michael W. Hudsondf888462005-06-03 14:41:55 +00001055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 case TYPE_BINARY_COMPLEX:
1057 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001058 const unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 Py_complex c;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001060 buf = (const unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001061 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 c.real = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001064 if (c.real == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 break;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001066 buf = (const unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001067 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 c.imag = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001070 if (c.imag == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001073 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 break;
1075 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 case TYPE_STRING:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001078 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001079 const char *ptr;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001080 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001081 if (PyErr_Occurred())
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001082 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001083 if (n < 0 || n > SIZE32_MAX) {
1084 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001085 break;
1086 }
1087 v = PyBytes_FromStringAndSize((char *)NULL, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001088 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001089 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001090 ptr = r_string(n, p);
1091 if (ptr == NULL) {
1092 Py_DECREF(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001093 break;
1094 }
1095 memcpy(PyBytes_AS_STRING(v), ptr, n);
1096 retval = v;
1097 R_REF(retval);
1098 break;
1099 }
1100
1101 case TYPE_ASCII_INTERNED:
1102 is_interned = 1;
1103 case TYPE_ASCII:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001105 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001106 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001107 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001108 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 break;
1110 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001111 goto _read_ascii;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001112
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001113 case TYPE_SHORT_ASCII_INTERNED:
1114 is_interned = 1;
1115 case TYPE_SHORT_ASCII:
1116 n = r_byte(p);
1117 if (n == EOF) {
1118 PyErr_SetString(PyExc_EOFError,
1119 "EOF read where object expected");
1120 break;
1121 }
1122 _read_ascii:
1123 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001124 const char *ptr;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001125 ptr = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001126 if (ptr == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001127 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001128 v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001129 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001130 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001131 if (is_interned)
1132 PyUnicode_InternInPlace(&v);
1133 retval = v;
1134 R_REF(retval);
1135 break;
1136 }
1137
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001138 case TYPE_INTERNED:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001139 is_interned = 1;
1140 case TYPE_UNICODE:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001142 const char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +00001143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001145 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001146 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001147 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 break;
1150 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001151 if (n != 0) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001152 buffer = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001153 if (buffer == NULL)
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001154 break;
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001155 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001157 else {
1158 v = PyUnicode_New(0, 0);
1159 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001160 if (v == NULL)
Victor Stinner3a8b79d2013-07-08 22:23:32 +02001161 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001162 if (is_interned)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001163 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001165 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 break;
1167 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001168
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001169 case TYPE_SMALL_TUPLE:
1170 n = (unsigned char) r_byte(p);
Victor Stinnerb1b7b182013-10-31 17:07:08 +01001171 if (PyErr_Occurred())
1172 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001173 goto _read_tuple;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 case TYPE_TUPLE:
1175 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001176 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001177 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001178 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 break;
1181 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001182 _read_tuple:
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001183 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001184 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001185 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 break;
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 for (i = 0; i < n; i++) {
1189 v2 = r_object(p);
1190 if ( v2 == NULL ) {
1191 if (!PyErr_Occurred())
1192 PyErr_SetString(PyExc_TypeError,
1193 "NULL object in marshal data for tuple");
1194 Py_DECREF(v);
1195 v = NULL;
1196 break;
1197 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001198 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 }
1200 retval = v;
1201 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 case TYPE_LIST:
1204 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001205 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001206 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001207 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 break;
1210 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001211 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001212 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001213 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 for (i = 0; i < n; i++) {
1216 v2 = r_object(p);
1217 if ( v2 == NULL ) {
1218 if (!PyErr_Occurred())
1219 PyErr_SetString(PyExc_TypeError,
1220 "NULL object in marshal data for list");
1221 Py_DECREF(v);
1222 v = NULL;
1223 break;
1224 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001225 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 }
1227 retval = v;
1228 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 case TYPE_DICT:
1231 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001232 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001233 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 for (;;) {
1236 PyObject *key, *val;
1237 key = r_object(p);
1238 if (key == NULL)
1239 break;
1240 val = r_object(p);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001241 if (val == NULL) {
1242 Py_DECREF(key);
1243 break;
1244 }
1245 if (PyDict_SetItem(v, key, val) < 0) {
1246 Py_DECREF(key);
1247 Py_DECREF(val);
1248 break;
1249 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 Py_DECREF(key);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001251 Py_DECREF(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 }
1253 if (PyErr_Occurred()) {
1254 Py_DECREF(v);
1255 v = NULL;
1256 }
1257 retval = v;
1258 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 case TYPE_SET:
1261 case TYPE_FROZENSET:
1262 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001263 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001264 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001265 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 break;
1268 }
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001269
Victor Stinner1aa78932016-01-23 14:15:48 +01001270 if (n == 0 && type == TYPE_FROZENSET) {
1271 /* call frozenset() to get the empty frozenset singleton */
1272 v = PyObject_CallFunction((PyObject*)&PyFrozenSet_Type, NULL);
1273 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 break;
Victor Stinner1aa78932016-01-23 14:15:48 +01001275 R_REF(v);
1276 retval = v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 }
Victor Stinner1aa78932016-01-23 14:15:48 +01001278 else {
1279 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
1280 if (type == TYPE_SET) {
1281 R_REF(v);
1282 } else {
1283 /* must use delayed registration of frozensets because they must
1284 * be init with a refcount of 1
1285 */
1286 idx = r_ref_reserve(flag, p);
1287 if (idx < 0)
1288 Py_CLEAR(v); /* signal error */
1289 }
1290 if (v == NULL)
1291 break;
1292
1293 for (i = 0; i < n; i++) {
1294 v2 = r_object(p);
1295 if ( v2 == NULL ) {
1296 if (!PyErr_Occurred())
1297 PyErr_SetString(PyExc_TypeError,
1298 "NULL object in marshal data for set");
1299 Py_DECREF(v);
1300 v = NULL;
1301 break;
1302 }
1303 if (PySet_Add(v, v2) == -1) {
1304 Py_DECREF(v);
1305 Py_DECREF(v2);
1306 v = NULL;
1307 break;
1308 }
1309 Py_DECREF(v2);
1310 }
1311 if (type != TYPE_SET)
1312 v = r_ref_insert(v, idx, flag, p);
1313 retval = v;
1314 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 case TYPE_CODE:
1318 {
1319 int argcount;
1320 int kwonlyargcount;
1321 int nlocals;
1322 int stacksize;
1323 int flags;
1324 PyObject *code = NULL;
1325 PyObject *consts = NULL;
1326 PyObject *names = NULL;
1327 PyObject *varnames = NULL;
1328 PyObject *freevars = NULL;
1329 PyObject *cellvars = NULL;
1330 PyObject *filename = NULL;
1331 PyObject *name = NULL;
1332 int firstlineno;
1333 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001334
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001335 idx = r_ref_reserve(flag, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001336 if (idx < 0)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001337 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 /* XXX ignore long->int overflows for now */
1342 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001343 if (PyErr_Occurred())
1344 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001346 if (PyErr_Occurred())
1347 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001349 if (PyErr_Occurred())
1350 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001352 if (PyErr_Occurred())
1353 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001355 if (PyErr_Occurred())
1356 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 code = r_object(p);
1358 if (code == NULL)
1359 goto code_error;
1360 consts = r_object(p);
1361 if (consts == NULL)
1362 goto code_error;
1363 names = r_object(p);
1364 if (names == NULL)
1365 goto code_error;
1366 varnames = r_object(p);
1367 if (varnames == NULL)
1368 goto code_error;
1369 freevars = r_object(p);
1370 if (freevars == NULL)
1371 goto code_error;
1372 cellvars = r_object(p);
1373 if (cellvars == NULL)
1374 goto code_error;
1375 filename = r_object(p);
1376 if (filename == NULL)
1377 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001378 if (PyUnicode_CheckExact(filename)) {
1379 if (p->current_filename != NULL) {
1380 if (!PyUnicode_Compare(filename, p->current_filename)) {
1381 Py_DECREF(filename);
1382 Py_INCREF(p->current_filename);
1383 filename = p->current_filename;
1384 }
1385 }
1386 else {
1387 p->current_filename = filename;
1388 }
1389 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 name = r_object(p);
1391 if (name == NULL)
1392 goto code_error;
1393 firstlineno = (int)r_long(p);
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001394 if (firstlineno == -1 && PyErr_Occurred())
1395 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 lnotab = r_object(p);
1397 if (lnotab == NULL)
1398 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 v = (PyObject *) PyCode_New(
1401 argcount, kwonlyargcount,
1402 nlocals, stacksize, flags,
1403 code, consts, names, varnames,
1404 freevars, cellvars, filename, name,
1405 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001406 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 code_error:
1409 Py_XDECREF(code);
1410 Py_XDECREF(consts);
1411 Py_XDECREF(names);
1412 Py_XDECREF(varnames);
1413 Py_XDECREF(freevars);
1414 Py_XDECREF(cellvars);
1415 Py_XDECREF(filename);
1416 Py_XDECREF(name);
1417 Py_XDECREF(lnotab);
1418 }
1419 retval = v;
1420 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001421
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001422 case TYPE_REF:
1423 n = r_long(p);
1424 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001425 if (n == -1 && PyErr_Occurred())
1426 break;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001427 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001428 break;
1429 }
1430 v = PyList_GET_ITEM(p->refs, n);
1431 if (v == Py_None) {
1432 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001433 break;
1434 }
1435 Py_INCREF(v);
1436 retval = v;
1437 break;
1438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 default:
1440 /* Bogus data got written, which isn't ideal.
1441 This will let you keep working and recover. */
1442 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 break;
1444
1445 }
1446 p->depth--;
1447 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001448}
1449
Neal Norwitzd85c4522004-06-13 20:31:49 +00001450static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001451read_object(RFILE *p)
1452{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 PyObject *v;
1454 if (PyErr_Occurred()) {
1455 fprintf(stderr, "XXX readobject called with exception set\n");
1456 return NULL;
1457 }
1458 v = r_object(p);
1459 if (v == NULL && !PyErr_Occurred())
1460 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1461 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001462}
1463
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001464int
1465PyMarshal_ReadShortFromFile(FILE *fp)
1466{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001468 int res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001470 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001472 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 rf.end = rf.ptr = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001474 rf.buf = NULL;
1475 res = r_short(&rf);
1476 if (rf.buf != NULL)
1477 PyMem_FREE(rf.buf);
1478 return res;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001479}
1480
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001481long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001482PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001483{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001485 long res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001487 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001488 rf.current_filename = 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;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001550 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 rf.depth = 0;
1552 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001553 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001554 rf.refs = PyList_New(0);
1555 if (rf.refs == NULL)
1556 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001558 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001559 if (rf.buf != NULL)
1560 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001562}
1563
1564PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03001565PyMarshal_ReadObjectFromString(const char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001566{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 RFILE rf;
1568 PyObject *result;
1569 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001570 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001571 rf.current_filename = NULL;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001572 rf.ptr = (char *)str;
1573 rf.end = (char *)str + len;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001574 rf.buf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001576 rf.refs = PyList_New(0);
1577 if (rf.refs == NULL)
1578 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001580 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001581 if (rf.buf != NULL)
1582 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001584}
1585
Guido van Rossum79f25d91997-04-29 20:08:16 +00001586PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001587PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001588{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001589 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001590
Serhiy Storchakace921c622015-02-11 15:53:31 +02001591 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1593 if (wf.str == NULL)
1594 return NULL;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +02001595 wf.ptr = wf.buf = PyBytes_AS_STRING((PyBytesObject *)wf.str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 wf.end = wf.ptr + PyBytes_Size(wf.str);
1597 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 wf.version = version;
Serhiy Storchakace921c622015-02-11 15:53:31 +02001599 if (w_init_refs(&wf, version)) {
1600 Py_DECREF(wf.str);
1601 return NULL;
1602 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 w_object(x, &wf);
Serhiy Storchakace921c622015-02-11 15:53:31 +02001604 w_clear_refs(&wf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 if (wf.str != NULL) {
1606 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1607 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1608 Py_DECREF(wf.str);
1609 PyErr_SetString(PyExc_OverflowError,
1610 "too much marshal data for a string");
1611 return NULL;
1612 }
1613 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1614 return NULL;
1615 }
1616 if (wf.error != WFERR_OK) {
1617 Py_XDECREF(wf.str);
1618 if (wf.error == WFERR_NOMEMORY)
1619 PyErr_NoMemory();
1620 else
1621 PyErr_SetString(PyExc_ValueError,
1622 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1623 :"object too deeply nested to marshal");
1624 return NULL;
1625 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001626 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001627}
1628
Guido van Rossum64b45521991-06-07 13:58:22 +00001629/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001630
Guido van Rossum79f25d91997-04-29 20:08:16 +00001631static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001632marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001633{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 /* XXX Quick hack -- need to do this differently */
1635 PyObject *x;
1636 PyObject *f;
1637 int version = Py_MARSHAL_VERSION;
1638 PyObject *s;
1639 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001640 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1643 return NULL;
1644 s = PyMarshal_WriteObjectToString(x, version);
1645 if (s == NULL)
1646 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001647 res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001648 Py_DECREF(s);
1649 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001650}
1651
R. David Murraydd226ea2009-05-13 12:27:21 +00001652PyDoc_STRVAR(dump_doc,
1653"dump(value, file[, version])\n\
1654\n\
1655Write the value on the open file. The value must be a supported type.\n\
1656The file must be an open file object such as sys.stdout or returned by\n\
1657open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1658\n\
1659If the value has (or contains an object that has) an unsupported type, a\n\
Serhiy Storchaka225821c2015-12-18 13:05:04 +02001660ValueError exception is raised - but garbage data will also be written\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001661to the file. The object will not be properly read back by load()\n\
1662\n\
1663The version argument indicates the data format that dump should use.");
1664
Guido van Rossum79f25d91997-04-29 20:08:16 +00001665static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001666marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001667{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001669 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001671
1672 /*
1673 * Make a call to the read method, but read zero bytes.
1674 * This is to ensure that the object passed in at least
1675 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001676 * This can be removed if we guarantee good error handling
1677 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001678 */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001679 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 if (data == NULL)
1681 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001682 if (!PyBytes_Check(data)) {
1683 PyErr_Format(PyExc_TypeError,
1684 "f.read() returned not bytes but %.100s",
1685 data->ob_type->tp_name);
1686 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 }
1688 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001689 rf.depth = 0;
1690 rf.fp = NULL;
1691 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001692 rf.current_filename = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001693 rf.ptr = rf.end = NULL;
1694 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001695 if ((rf.refs = PyList_New(0)) != NULL) {
1696 result = read_object(&rf);
1697 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001698 if (rf.buf != NULL)
1699 PyMem_FREE(rf.buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001700 } else
1701 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 Py_DECREF(data);
1704 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001705}
1706
R. David Murraydd226ea2009-05-13 12:27:21 +00001707PyDoc_STRVAR(load_doc,
1708"load(file)\n\
1709\n\
1710Read one value from the open file and return it. If no valid value is\n\
Serhiy Storchaka225821c2015-12-18 13:05:04 +02001711read (e.g. because the data has a different Python version's\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001712incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1713The file must be an open file object opened in binary mode ('rb' or\n\
1714'r+b').\n\
1715\n\
1716Note: If an object containing an unsupported type was marshalled with\n\
1717dump(), load() will substitute None for the unmarshallable type.");
1718
1719
Guido van Rossum79f25d91997-04-29 20:08:16 +00001720static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001721marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001722{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 PyObject *x;
1724 int version = Py_MARSHAL_VERSION;
1725 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1726 return NULL;
1727 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001728}
1729
R. David Murraydd226ea2009-05-13 12:27:21 +00001730PyDoc_STRVAR(dumps_doc,
1731"dumps(value[, version])\n\
1732\n\
1733Return the string that would be written to a file by dump(value, file).\n\
1734The value must be a supported type. Raise a ValueError exception if\n\
1735value has (or contains an object that has) an unsupported type.\n\
1736\n\
1737The version argument indicates the data format that dumps should use.");
1738
1739
Guido van Rossum79f25d91997-04-29 20:08:16 +00001740static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001741marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001742{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 RFILE rf;
1744 Py_buffer p;
1745 char *s;
1746 Py_ssize_t n;
1747 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001748 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 return NULL;
1750 s = p.buf;
1751 n = p.len;
1752 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001753 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001754 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 rf.ptr = s;
1756 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001758 if ((rf.refs = PyList_New(0)) == NULL)
1759 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 PyBuffer_Release(&p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001762 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001764}
1765
R. David Murraydd226ea2009-05-13 12:27:21 +00001766PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001767"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001768\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001769Convert the bytes object to a value. If no valid value is found, raise\n\
1770EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001771ignored.");
1772
Guido van Rossum79f25d91997-04-29 20:08:16 +00001773static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1775 {"load", marshal_load, METH_O, load_doc},
1776 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1777 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1778 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001779};
1780
R. David Murraydd226ea2009-05-13 12:27:21 +00001781
1782PyDoc_STRVAR(module_doc,
1783"This module contains functions that can read and write Python values in\n\
1784a binary format. The format is specific to Python, but independent of\n\
1785machine architecture issues.\n\
1786\n\
1787Not all Python object types are supported; in general, only objects\n\
1788whose value is independent from a particular invocation of Python can be\n\
1789written and read by this module. The following types are supported:\n\
1790None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1791tuples, lists, sets, dictionaries, and code objects, where it\n\
1792should be understood that tuples, lists and dictionaries are only\n\
1793supported as long as the values contained therein are themselves\n\
1794supported; and recursive lists and dictionaries should not be written\n\
1795(they will cause infinite loops).\n\
1796\n\
1797Variables:\n\
1798\n\
1799version -- indicates the format that the module uses. Version 0 is the\n\
1800 historical format, version 1 shares interned strings and version 2\n\
1801 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001802 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001803\n\
1804Functions:\n\
1805\n\
1806dump() -- write value to a file\n\
1807load() -- read value from a file\n\
1808dumps() -- write value to a string\n\
1809loads() -- read value from a string");
1810
1811
1812
Brett Cannon429ef652008-06-27 00:35:35 +00001813static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 PyModuleDef_HEAD_INIT,
1815 "marshal",
1816 module_doc,
1817 0,
1818 marshal_methods,
1819 NULL,
1820 NULL,
1821 NULL,
1822 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001823};
1824
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001825PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001826PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001827{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 PyObject *mod = PyModule_Create(&marshalmodule);
1829 if (mod == NULL)
1830 return NULL;
1831 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1832 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001833}