blob: e23daf6497b455809952d9942da79bf8c565f31e [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'
Serhiy Storchaka00987f62017-11-15 17:41:05 +020042/* TYPE_INT64 is not generated anymore.
43 Supported for backward compatibility only. */
44#define TYPE_INT64 'I'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045#define TYPE_FLOAT 'f'
46#define TYPE_BINARY_FLOAT 'g'
47#define TYPE_COMPLEX 'x'
48#define TYPE_BINARY_COMPLEX 'y'
49#define TYPE_LONG 'l'
50#define TYPE_STRING 's'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070051#define TYPE_INTERNED 't'
52#define TYPE_REF 'r'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000053#define TYPE_TUPLE '('
54#define TYPE_LIST '['
55#define TYPE_DICT '{'
56#define TYPE_CODE 'c'
57#define TYPE_UNICODE 'u'
58#define TYPE_UNKNOWN '?'
59#define TYPE_SET '<'
60#define TYPE_FROZENSET '>'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070061#define FLAG_REF '\x80' /* with a type, add obj to index */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000062
Antoine Pitrou1164dfc2013-10-12 22:25:39 +020063#define TYPE_ASCII 'a'
64#define TYPE_ASCII_INTERNED 'A'
65#define TYPE_SMALL_TUPLE ')'
66#define TYPE_SHORT_ASCII 'z'
67#define TYPE_SHORT_ASCII_INTERNED 'Z'
68
Eric Smithb1a03cf2009-04-21 11:57:38 +000069#define WFERR_OK 0
70#define WFERR_UNMARSHALLABLE 1
71#define WFERR_NESTEDTOODEEP 2
72#define WFERR_NOMEMORY 3
73
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000074typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 FILE *fp;
76 int error; /* see WFERR_* values */
77 int depth;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000078 PyObject *str;
79 char *ptr;
80 char *end;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +020081 char *buf;
Serhiy Storchakace921c622015-02-11 15:53:31 +020082 _Py_hashtable_t *hashtable;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000083 int version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000084} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000085
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +020086#define w_byte(c, p) do { \
87 if ((p)->ptr != (p)->end || w_reserve((p), 1)) \
88 *(p)->ptr++ = (c); \
89 } while(0)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000090
91static void
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +020092w_flush(WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000093{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +020094 assert(p->fp != NULL);
95 fwrite(p->buf, 1, p->ptr - p->buf, p->fp);
96 p->ptr = p->buf;
97}
98
99static int
100w_reserve(WFILE *p, Py_ssize_t needed)
101{
102 Py_ssize_t pos, size, delta;
103 if (p->ptr == NULL)
104 return 0; /* An error already occurred */
105 if (p->fp != NULL) {
106 w_flush(p);
107 return needed <= p->end - p->ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 }
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200109 assert(p->str != NULL);
110 pos = p->ptr - p->buf;
111 size = PyBytes_Size(p->str);
112 if (size > 16*1024*1024)
113 delta = (size >> 3); /* 12.5% overallocation */
114 else
115 delta = size + 1024;
116 delta = Py_MAX(delta, needed);
117 if (delta > PY_SSIZE_T_MAX - size) {
118 p->error = WFERR_NOMEMORY;
119 return 0;
120 }
121 size += delta;
122 if (_PyBytes_Resize(&p->str, size) != 0) {
123 p->ptr = p->buf = p->end = NULL;
124 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 }
126 else {
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200127 p->buf = PyBytes_AS_STRING(p->str);
128 p->ptr = p->buf + pos;
129 p->end = p->buf + size;
130 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000132}
133
134static void
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300135w_string(const char *s, Py_ssize_t n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000136{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200137 Py_ssize_t m;
138 if (!n || p->ptr == NULL)
139 return;
140 m = p->end - p->ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000141 if (p->fp != NULL) {
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200142 if (n <= m) {
Christian Heimesf051e432016-09-13 20:22:02 +0200143 memcpy(p->ptr, s, n);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200144 p->ptr += n;
145 }
146 else {
147 w_flush(p);
148 fwrite(s, 1, n, p->fp);
149 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000150 }
151 else {
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200152 if (n <= m || w_reserve(p, n - m)) {
Christian Heimesf051e432016-09-13 20:22:02 +0200153 memcpy(p->ptr, s, n);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200154 p->ptr += n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000155 }
156 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000157}
158
159static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000160w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 w_byte((char)( x & 0xff), p);
163 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000164}
165
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000166static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000167w_long(long x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000168{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000169 w_byte((char)( x & 0xff), p);
170 w_byte((char)((x>> 8) & 0xff), p);
171 w_byte((char)((x>>16) & 0xff), p);
172 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000173}
174
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200175#define SIZE32_MAX 0x7FFFFFFF
176
177#if SIZEOF_SIZE_T > 4
178# define W_SIZE(n, p) do { \
179 if ((n) > SIZE32_MAX) { \
180 (p)->depth--; \
181 (p)->error = WFERR_UNMARSHALLABLE; \
182 return; \
183 } \
184 w_long((long)(n), p); \
185 } while(0)
186#else
187# define W_SIZE w_long
188#endif
189
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300190static void
191w_pstring(const char *s, Py_ssize_t n, WFILE *p)
192{
193 W_SIZE(n, p);
194 w_string(s, n, p);
195}
196
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200197static void
198w_short_pstring(const char *s, Py_ssize_t n, WFILE *p)
199{
Antoine Pitroub30f2712013-10-12 23:14:47 +0200200 w_byte(Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char), p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200201 w_string(s, n, p);
202}
203
Serhiy Storchaka95949422013-08-27 19:40:23 +0300204/* We assume that Python ints are stored internally in base some power of
Mark Dickinsonbd792642009-03-18 20:06:12 +0000205 2**15; for the sake of portability we'll always read and write them in base
206 exactly 2**15. */
207
208#define PyLong_MARSHAL_SHIFT 15
209#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
210#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
211#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
212#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
213#endif
214#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
215
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700216#define W_TYPE(t, p) do { \
217 w_byte((t) | flag, (p)); \
218} while(0)
219
Mark Dickinsonbd792642009-03-18 20:06:12 +0000220static void
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700221w_PyLong(const PyLongObject *ob, char flag, WFILE *p)
Mark Dickinsonbd792642009-03-18 20:06:12 +0000222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 Py_ssize_t i, j, n, l;
224 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000225
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700226 W_TYPE(TYPE_LONG, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 if (Py_SIZE(ob) == 0) {
228 w_long((long)0, p);
229 return;
230 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 /* set l to number of base PyLong_MARSHAL_BASE digits */
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200233 n = Py_ABS(Py_SIZE(ob));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 l = (n-1) * PyLong_MARSHAL_RATIO;
235 d = ob->ob_digit[n-1];
236 assert(d != 0); /* a PyLong is always normalized */
237 do {
238 d >>= PyLong_MARSHAL_SHIFT;
239 l++;
240 } while (d != 0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200241 if (l > SIZE32_MAX) {
242 p->depth--;
243 p->error = WFERR_UNMARSHALLABLE;
244 return;
245 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 for (i=0; i < n-1; i++) {
249 d = ob->ob_digit[i];
250 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
251 w_short(d & PyLong_MARSHAL_MASK, p);
252 d >>= PyLong_MARSHAL_SHIFT;
253 }
254 assert (d == 0);
255 }
256 d = ob->ob_digit[n-1];
257 do {
258 w_short(d & PyLong_MARSHAL_MASK, p);
259 d >>= PyLong_MARSHAL_SHIFT;
260 } while (d != 0);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000261}
262
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700263static int
264w_ref(PyObject *v, char *flag, WFILE *p)
265{
Serhiy Storchakace921c622015-02-11 15:53:31 +0200266 _Py_hashtable_entry_t *entry;
267 int w;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700268
Serhiy Storchakace921c622015-02-11 15:53:31 +0200269 if (p->version < 3 || p->hashtable == NULL)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700270 return 0; /* not writing object references */
271
272 /* if it has only one reference, it definitely isn't shared */
273 if (Py_REFCNT(v) == 1)
274 return 0;
275
Victor Stinner285cf0a2016-03-21 22:00:58 +0100276 entry = _Py_HASHTABLE_GET_ENTRY(p->hashtable, v);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200277 if (entry != NULL) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700278 /* write the reference index to the stream */
Victor Stinnere8c6b2f2016-03-23 09:25:01 +0100279 _Py_HASHTABLE_ENTRY_READ_DATA(p->hashtable, entry, w);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700280 /* we don't store "long" indices in the dict */
281 assert(0 <= w && w <= 0x7fffffff);
282 w_byte(TYPE_REF, p);
283 w_long(w, p);
284 return 1;
285 } else {
Serhiy Storchakace921c622015-02-11 15:53:31 +0200286 size_t s = p->hashtable->entries;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700287 /* we don't support long indices */
288 if (s >= 0x7fffffff) {
289 PyErr_SetString(PyExc_ValueError, "too many objects");
290 goto err;
291 }
Serhiy Storchaka26861b02015-02-16 20:52:17 +0200292 w = (int)s;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200293 Py_INCREF(v);
294 if (_Py_HASHTABLE_SET(p->hashtable, v, w) < 0) {
295 Py_DECREF(v);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700296 goto err;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200297 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700298 *flag |= FLAG_REF;
299 return 0;
300 }
301err:
302 p->error = WFERR_UNMARSHALLABLE;
303 return 1;
304}
305
306static void
307w_complex_object(PyObject *v, char flag, WFILE *p);
308
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000309static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000310w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000311{
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700312 char flag = '\0';
Fred Drake6da0b912000-06-28 18:47:56 +0000313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000314 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
317 p->error = WFERR_NESTEDTOODEEP;
318 }
319 else if (v == NULL) {
320 w_byte(TYPE_NULL, p);
321 }
322 else if (v == Py_None) {
323 w_byte(TYPE_NONE, p);
324 }
325 else if (v == PyExc_StopIteration) {
326 w_byte(TYPE_STOPITER, p);
327 }
328 else if (v == Py_Ellipsis) {
329 w_byte(TYPE_ELLIPSIS, p);
330 }
331 else if (v == Py_False) {
332 w_byte(TYPE_FALSE, p);
333 }
334 else if (v == Py_True) {
335 w_byte(TYPE_TRUE, p);
336 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700337 else if (!w_ref(v, &flag, p))
338 w_complex_object(v, flag, p);
339
340 p->depth--;
341}
342
343static void
344w_complex_object(PyObject *v, char flag, WFILE *p)
345{
346 Py_ssize_t i, n;
347
348 if (PyLong_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 long x = PyLong_AsLong(v);
350 if ((x == -1) && PyErr_Occurred()) {
351 PyLongObject *ob = (PyLongObject *)v;
352 PyErr_Clear();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700353 w_PyLong(ob, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 }
355 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000356#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
358 if (y && y != -1) {
Martin v. Löwis7e395722012-07-28 19:44:05 +0200359 /* Too large for TYPE_INT */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700360 w_PyLong((PyLongObject*)v, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 }
362 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000363#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700365 W_TYPE(TYPE_INT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 w_long(x, p);
367 }
368 }
369 }
370 else if (PyFloat_CheckExact(v)) {
371 if (p->version > 1) {
372 unsigned char buf[8];
373 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
374 buf, 1) < 0) {
375 p->error = WFERR_UNMARSHALLABLE;
376 return;
377 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700378 W_TYPE(TYPE_BINARY_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 w_string((char*)buf, 8, p);
380 }
381 else {
382 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
383 'g', 17, 0, NULL);
384 if (!buf) {
385 p->error = WFERR_NOMEMORY;
386 return;
387 }
388 n = strlen(buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700389 W_TYPE(TYPE_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200391 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 PyMem_Free(buf);
393 }
394 }
395 else if (PyComplex_CheckExact(v)) {
396 if (p->version > 1) {
397 unsigned char buf[8];
398 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
399 buf, 1) < 0) {
400 p->error = WFERR_UNMARSHALLABLE;
401 return;
402 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700403 W_TYPE(TYPE_BINARY_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 w_string((char*)buf, 8, p);
405 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
406 buf, 1) < 0) {
407 p->error = WFERR_UNMARSHALLABLE;
408 return;
409 }
410 w_string((char*)buf, 8, p);
411 }
412 else {
413 char *buf;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700414 W_TYPE(TYPE_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 buf = PyOS_double_to_string(PyComplex_RealAsDouble(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 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
426 'g', 17, 0, NULL);
427 if (!buf) {
428 p->error = WFERR_NOMEMORY;
429 return;
430 }
431 n = strlen(buf);
432 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200433 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 PyMem_Free(buf);
435 }
436 }
437 else if (PyBytes_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700438 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300439 w_pstring(PyBytes_AS_STRING(v), PyBytes_GET_SIZE(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000440 }
441 else if (PyUnicode_CheckExact(v)) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200442 if (p->version >= 4 && PyUnicode_IS_ASCII(v)) {
443 int is_short = PyUnicode_GET_LENGTH(v) < 256;
444 if (is_short) {
445 if (PyUnicode_CHECK_INTERNED(v))
446 W_TYPE(TYPE_SHORT_ASCII_INTERNED, p);
447 else
448 W_TYPE(TYPE_SHORT_ASCII, p);
449 w_short_pstring((char *) PyUnicode_1BYTE_DATA(v),
450 PyUnicode_GET_LENGTH(v), p);
451 }
452 else {
453 if (PyUnicode_CHECK_INTERNED(v))
454 W_TYPE(TYPE_ASCII_INTERNED, p);
455 else
456 W_TYPE(TYPE_ASCII, p);
457 w_pstring((char *) PyUnicode_1BYTE_DATA(v),
458 PyUnicode_GET_LENGTH(v), p);
459 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200461 else {
462 PyObject *utf8;
463 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");
464 if (utf8 == NULL) {
465 p->depth--;
466 p->error = WFERR_UNMARSHALLABLE;
467 return;
468 }
469 if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v))
470 W_TYPE(TYPE_INTERNED, p);
471 else
472 W_TYPE(TYPE_UNICODE, p);
473 w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p);
474 Py_DECREF(utf8);
475 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 }
477 else if (PyTuple_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 n = PyTuple_Size(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200479 if (p->version >= 4 && n < 256) {
480 W_TYPE(TYPE_SMALL_TUPLE, p);
Victor Stinnerda062552013-11-16 00:13:29 +0100481 w_byte((unsigned char)n, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200482 }
483 else {
484 W_TYPE(TYPE_TUPLE, p);
485 W_SIZE(n, p);
486 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 for (i = 0; i < n; i++) {
488 w_object(PyTuple_GET_ITEM(v, i), p);
489 }
490 }
491 else if (PyList_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700492 W_TYPE(TYPE_LIST, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 n = PyList_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200494 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 for (i = 0; i < n; i++) {
496 w_object(PyList_GET_ITEM(v, i), p);
497 }
498 }
499 else if (PyDict_CheckExact(v)) {
500 Py_ssize_t pos;
501 PyObject *key, *value;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700502 W_TYPE(TYPE_DICT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 /* This one is NULL object terminated! */
504 pos = 0;
505 while (PyDict_Next(v, &pos, &key, &value)) {
506 w_object(key, p);
507 w_object(value, p);
508 }
509 w_object((PyObject *)NULL, p);
510 }
511 else if (PyAnySet_CheckExact(v)) {
512 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 if (PyObject_TypeCheck(v, &PySet_Type))
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700515 W_TYPE(TYPE_SET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 else
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700517 W_TYPE(TYPE_FROZENSET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 n = PyObject_Size(v);
519 if (n == -1) {
520 p->depth--;
521 p->error = WFERR_UNMARSHALLABLE;
522 return;
523 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200524 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 it = PyObject_GetIter(v);
526 if (it == NULL) {
527 p->depth--;
528 p->error = WFERR_UNMARSHALLABLE;
529 return;
530 }
531 while ((value = PyIter_Next(it)) != NULL) {
532 w_object(value, p);
533 Py_DECREF(value);
534 }
535 Py_DECREF(it);
536 if (PyErr_Occurred()) {
537 p->depth--;
538 p->error = WFERR_UNMARSHALLABLE;
539 return;
540 }
541 }
542 else if (PyCode_Check(v)) {
543 PyCodeObject *co = (PyCodeObject *)v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700544 W_TYPE(TYPE_CODE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 w_long(co->co_argcount, p);
546 w_long(co->co_kwonlyargcount, p);
547 w_long(co->co_nlocals, p);
548 w_long(co->co_stacksize, p);
549 w_long(co->co_flags, p);
550 w_object(co->co_code, p);
551 w_object(co->co_consts, p);
552 w_object(co->co_names, p);
553 w_object(co->co_varnames, p);
554 w_object(co->co_freevars, p);
555 w_object(co->co_cellvars, p);
556 w_object(co->co_filename, p);
557 w_object(co->co_name, p);
558 w_long(co->co_firstlineno, p);
559 w_object(co->co_lnotab, p);
560 }
561 else if (PyObject_CheckBuffer(v)) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +0200562 /* Write unknown bytes-like objects as a bytes object */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100564 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100566 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100568 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700570 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300571 w_pstring(view.buf, view.len, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100572 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 }
574 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700575 W_TYPE(TYPE_UNKNOWN, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 p->error = WFERR_UNMARSHALLABLE;
577 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000578}
579
Serhiy Storchakace921c622015-02-11 15:53:31 +0200580static int
581w_init_refs(WFILE *wf, int version)
582{
583 if (version >= 3) {
Victor Stinner285cf0a2016-03-21 22:00:58 +0100584 wf->hashtable = _Py_hashtable_new(sizeof(PyObject *), sizeof(int),
585 _Py_hashtable_hash_ptr,
Serhiy Storchakace921c622015-02-11 15:53:31 +0200586 _Py_hashtable_compare_direct);
587 if (wf->hashtable == NULL) {
588 PyErr_NoMemory();
589 return -1;
590 }
591 }
592 return 0;
593}
594
595static int
Victor Stinner285cf0a2016-03-21 22:00:58 +0100596w_decref_entry(_Py_hashtable_t *ht, _Py_hashtable_entry_t *entry,
597 void *Py_UNUSED(data))
Serhiy Storchakace921c622015-02-11 15:53:31 +0200598{
Victor Stinner285cf0a2016-03-21 22:00:58 +0100599 PyObject *entry_key;
600
Victor Stinner5dacbd42016-03-23 09:52:13 +0100601 _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, entry_key);
Victor Stinner285cf0a2016-03-21 22:00:58 +0100602 Py_XDECREF(entry_key);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200603 return 0;
604}
605
606static void
607w_clear_refs(WFILE *wf)
608{
609 if (wf->hashtable != NULL) {
610 _Py_hashtable_foreach(wf->hashtable, w_decref_entry, NULL);
611 _Py_hashtable_destroy(wf->hashtable);
612 }
613}
614
Serhiy Storchaka95949422013-08-27 19:40:23 +0300615/* version currently has no effect for writing ints. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000616void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000617PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000618{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200619 char buf[4];
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;
627 w_long(x, &wf);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200628 w_flush(&wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000629}
630
631void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000632PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000633{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200634 char buf[BUFSIZ];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 WFILE wf;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200636 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 wf.fp = fp;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200638 wf.ptr = wf.buf = buf;
639 wf.end = wf.ptr + sizeof(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 wf.version = version;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200642 if (w_init_refs(&wf, version))
643 return; /* caller mush check PyErr_Occurred() */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 w_object(x, &wf);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200645 w_clear_refs(&wf);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200646 w_flush(&wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000647}
648
Serhiy Storchakac07422c2015-02-11 16:18:09 +0200649typedef struct {
650 FILE *fp;
651 int depth;
652 PyObject *readable; /* Stream-like object being read from */
Serhiy Storchakac07422c2015-02-11 16:18:09 +0200653 char *ptr;
654 char *end;
655 char *buf;
656 Py_ssize_t buf_size;
657 PyObject *refs; /* a list */
658} RFILE;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000659
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200660static const char *
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200661r_string(Py_ssize_t n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000662{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200663 Py_ssize_t read = -1;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100664
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200665 if (p->ptr != NULL) {
666 /* Fast path for loads() */
667 char *res = p->ptr;
668 Py_ssize_t left = p->end - p->ptr;
669 if (left < n) {
670 PyErr_SetString(PyExc_EOFError,
671 "marshal data too short");
672 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100673 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200674 p->ptr += n;
675 return res;
676 }
677 if (p->buf == NULL) {
678 p->buf = PyMem_MALLOC(n);
679 if (p->buf == NULL) {
680 PyErr_NoMemory();
681 return NULL;
682 }
683 p->buf_size = n;
684 }
685 else if (p->buf_size < n) {
686 p->buf = PyMem_REALLOC(p->buf, n);
687 if (p->buf == NULL) {
688 PyErr_NoMemory();
689 return NULL;
690 }
691 p->buf_size = n;
692 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100693
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200694 if (!p->readable) {
695 assert(p->fp != NULL);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200696 read = fread(p->buf, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100697 }
698 else {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200699 _Py_IDENTIFIER(readinto);
700 PyObject *res, *mview;
701 Py_buffer buf;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200702
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200703 if (PyBuffer_FillInfo(&buf, NULL, p->buf, n, 0, PyBUF_CONTIG) == -1)
704 return NULL;
705 mview = PyMemoryView_FromBuffer(&buf);
706 if (mview == NULL)
707 return NULL;
708
709 res = _PyObject_CallMethodId(p->readable, &PyId_readinto, "N", mview);
710 if (res != NULL) {
711 read = PyNumber_AsSsize_t(res, PyExc_ValueError);
712 Py_DECREF(res);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100713 }
714 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200715 if (read != n) {
716 if (!PyErr_Occurred()) {
717 if (read > n)
718 PyErr_Format(PyExc_ValueError,
719 "read() returned too much data: "
720 "%zd bytes requested, %zd returned",
721 n, read);
722 else
723 PyErr_SetString(PyExc_EOFError,
724 "EOF read where not expected");
725 }
726 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100727 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200728 return p->buf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100729}
730
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100731static int
732r_byte(RFILE *p)
733{
734 int c = EOF;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100735
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200736 if (p->ptr != NULL) {
737 if (p->ptr < p->end)
738 c = (unsigned char) *p->ptr++;
739 return c;
740 }
741 if (!p->readable) {
742 assert(p->fp);
743 c = getc(p->fp);
744 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100745 else {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200746 const char *ptr = r_string(1, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200747 if (ptr != NULL)
748 c = *(unsigned char *) ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100749 }
750 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000751}
752
753static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000754r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000755{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200756 short x = -1;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200757 const unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100758
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200759 buffer = (const unsigned char *) r_string(2, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200760 if (buffer != NULL) {
761 x = buffer[0];
762 x |= buffer[1] << 8;
763 /* Sign-extension, in case short greater than 16 bits */
764 x |= -(x & 0x8000);
765 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000767}
768
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000769static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000770r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000771{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200772 long x = -1;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200773 const unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100774
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200775 buffer = (const unsigned char *) r_string(4, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200776 if (buffer != NULL) {
777 x = buffer[0];
778 x |= (long)buffer[1] << 8;
779 x |= (long)buffer[2] << 16;
780 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000781#if SIZEOF_LONG > 4
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200782 /* Sign extension for 64-bit machines */
783 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000784#endif
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200785 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000787}
788
Serhiy Storchaka00987f62017-11-15 17:41:05 +0200789/* r_long64 deals with the TYPE_INT64 code. */
790static PyObject *
791r_long64(RFILE *p)
792{
793 const unsigned char *buffer = (const unsigned char *) r_string(8, p);
794 if (buffer == NULL) {
795 return NULL;
796 }
797 return _PyLong_FromByteArray(buffer, 8,
798 1 /* little endian */,
799 1 /* signed */);
800}
801
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000803r_PyLong(RFILE *p)
804{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200806 long n, size, i;
807 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100811 if (PyErr_Occurred())
812 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 if (n == 0)
814 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200815 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 PyErr_SetString(PyExc_ValueError,
817 "bad marshal data (long size out of range)");
818 return NULL;
819 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000820
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200821 size = 1 + (Py_ABS(n) - 1) / PyLong_MARSHAL_RATIO;
822 shorts_in_top_digit = 1 + (Py_ABS(n) - 1) % PyLong_MARSHAL_RATIO;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 ob = _PyLong_New(size);
824 if (ob == NULL)
825 return NULL;
Victor Stinner763b0d12013-10-31 16:56:38 +0100826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 for (i = 0; i < size-1; i++) {
830 d = 0;
831 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
832 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100833 if (PyErr_Occurred()) {
834 Py_DECREF(ob);
835 return NULL;
836 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 if (md < 0 || md > PyLong_MARSHAL_BASE)
838 goto bad_digit;
839 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
840 }
841 ob->ob_digit[i] = d;
842 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 d = 0;
845 for (j=0; j < shorts_in_top_digit; j++) {
846 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100847 if (PyErr_Occurred()) {
848 Py_DECREF(ob);
849 return NULL;
850 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 if (md < 0 || md > PyLong_MARSHAL_BASE)
852 goto bad_digit;
853 /* topmost marshal digit should be nonzero */
854 if (md == 0 && j == shorts_in_top_digit - 1) {
855 Py_DECREF(ob);
856 PyErr_SetString(PyExc_ValueError,
857 "bad marshal data (unnormalized long data)");
858 return NULL;
859 }
860 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
861 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100862 if (PyErr_Occurred()) {
863 Py_DECREF(ob);
864 return NULL;
865 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 /* top digit should be nonzero, else the resulting PyLong won't be
867 normalized */
868 ob->ob_digit[size-1] = d;
869 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000870 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 Py_DECREF(ob);
872 PyErr_SetString(PyExc_ValueError,
873 "bad marshal data (digit out of range in long)");
874 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000875}
876
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700877/* allocate the reflist index for a new object. Return -1 on failure */
878static Py_ssize_t
879r_ref_reserve(int flag, RFILE *p)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700880{
881 if (flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200882 Py_ssize_t idx = PyList_GET_SIZE(p->refs);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700883 if (idx >= 0x7ffffffe) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700884 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700885 return -1;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700886 }
887 if (PyList_Append(p->refs, Py_None) < 0)
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700888 return -1;
889 return idx;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700890 } else
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700891 return 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700892}
893
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700894/* insert the new object 'o' to the reflist at previously
895 * allocated index 'idx'.
896 * 'o' can be NULL, in which case nothing is done.
897 * if 'o' was non-NULL, and the function succeeds, 'o' is returned.
898 * if 'o' was non-NULL, and the function fails, 'o' is released and
899 * NULL returned. This simplifies error checking at the call site since
900 * a single test for NULL for the function result is enough.
901 */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700902static PyObject *
903r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
904{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700905 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200906 PyObject *tmp = PyList_GET_ITEM(p->refs, idx);
907 Py_INCREF(o);
908 PyList_SET_ITEM(p->refs, idx, o);
909 Py_DECREF(tmp);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700910 }
911 return o;
912}
913
914/* combination of both above, used when an object can be
915 * created whenever it is seen in the file, as opposed to
916 * after having loaded its sub-objects.
917 */
918static PyObject *
919r_ref(PyObject *o, int flag, RFILE *p)
920{
Victor Stinner359fabc2013-10-31 17:09:01 +0100921 assert(flag & FLAG_REF);
922 if (o == NULL)
923 return NULL;
924 if (PyList_Append(p->refs, o) < 0) {
925 Py_DECREF(o); /* release the new object */
926 return NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700927 }
928 return o;
929}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000930
931static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000932r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000933{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 /* NULL is a valid return value, it does not necessarily means that
935 an exception is set. */
936 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500937 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700939 int type, code = r_byte(p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200940 int flag, is_interned = 0;
Christian Heimes35728422013-10-13 02:29:06 +0200941 PyObject *retval = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000942
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700943 if (code == EOF) {
944 PyErr_SetString(PyExc_EOFError,
945 "EOF read where object expected");
946 return NULL;
947 }
948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
952 p->depth--;
953 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
954 return NULL;
955 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000956
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700957 flag = code & FLAG_REF;
958 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700959
960#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700961 if (flag) \
962 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700963} while (0)
964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 case TYPE_NULL:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 case TYPE_NONE:
971 Py_INCREF(Py_None);
972 retval = Py_None;
973 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 case TYPE_STOPITER:
976 Py_INCREF(PyExc_StopIteration);
977 retval = PyExc_StopIteration;
978 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 case TYPE_ELLIPSIS:
981 Py_INCREF(Py_Ellipsis);
982 retval = Py_Ellipsis;
983 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 case TYPE_FALSE:
986 Py_INCREF(Py_False);
987 retval = Py_False;
988 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 case TYPE_TRUE:
991 Py_INCREF(Py_True);
992 retval = Py_True;
993 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100996 n = r_long(p);
997 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700998 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001000
Serhiy Storchaka00987f62017-11-15 17:41:05 +02001001 case TYPE_INT64:
1002 retval = r_long64(p);
1003 R_REF(retval);
1004 break;
1005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 case TYPE_LONG:
1007 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001008 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 case TYPE_FLOAT:
1012 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001013 char buf[256];
1014 const char *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 double dx;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001017 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 PyErr_SetString(PyExc_EOFError,
1019 "EOF read where object expected");
1020 break;
1021 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001022 ptr = r_string(n, p);
1023 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001024 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001025 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 buf[n] = '\0';
1027 dx = PyOS_string_to_double(buf, NULL, NULL);
1028 if (dx == -1.0 && PyErr_Occurred())
1029 break;
1030 retval = PyFloat_FromDouble(dx);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001031 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 break;
1033 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 case TYPE_BINARY_FLOAT:
1036 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001037 const unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 double x;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001039 buf = (const unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001040 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 x = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001043 if (x == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001046 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 break;
1048 }
Michael W. Hudsondf888462005-06-03 14:41:55 +00001049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 case TYPE_COMPLEX:
1051 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001052 char buf[256];
1053 const char *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 Py_complex c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001056 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 PyErr_SetString(PyExc_EOFError,
1058 "EOF read where object expected");
1059 break;
1060 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001061 ptr = r_string(n, p);
1062 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001063 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001064 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 buf[n] = '\0';
1066 c.real = PyOS_string_to_double(buf, NULL, NULL);
1067 if (c.real == -1.0 && PyErr_Occurred())
1068 break;
1069 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001070 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 PyErr_SetString(PyExc_EOFError,
1072 "EOF read where object expected");
1073 break;
1074 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001075 ptr = r_string(n, p);
1076 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001077 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001078 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 buf[n] = '\0';
1080 c.imag = PyOS_string_to_double(buf, NULL, NULL);
1081 if (c.imag == -1.0 && PyErr_Occurred())
1082 break;
1083 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 }
Michael W. Hudsondf888462005-06-03 14:41:55 +00001087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 case TYPE_BINARY_COMPLEX:
1089 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001090 const unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 Py_complex c;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001092 buf = (const unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001093 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 c.real = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001096 if (c.real == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 break;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001098 buf = (const unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001099 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 c.imag = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001102 if (c.imag == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001105 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 break;
1107 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 case TYPE_STRING:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001110 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001111 const char *ptr;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001112 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001113 if (PyErr_Occurred())
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001114 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001115 if (n < 0 || n > SIZE32_MAX) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001116 PyErr_SetString(PyExc_ValueError, "bad marshal data (bytes object size out of range)");
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001117 break;
1118 }
1119 v = PyBytes_FromStringAndSize((char *)NULL, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001120 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001121 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001122 ptr = r_string(n, p);
1123 if (ptr == NULL) {
1124 Py_DECREF(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001125 break;
1126 }
1127 memcpy(PyBytes_AS_STRING(v), ptr, n);
1128 retval = v;
1129 R_REF(retval);
1130 break;
1131 }
1132
1133 case TYPE_ASCII_INTERNED:
1134 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001135 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001136 case TYPE_ASCII:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001138 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001139 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001140 if (n < 0 || n > SIZE32_MAX) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001141 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 break;
1143 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001144 goto _read_ascii;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001145
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001146 case TYPE_SHORT_ASCII_INTERNED:
1147 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001148 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001149 case TYPE_SHORT_ASCII:
1150 n = r_byte(p);
1151 if (n == EOF) {
1152 PyErr_SetString(PyExc_EOFError,
1153 "EOF read where object expected");
1154 break;
1155 }
1156 _read_ascii:
1157 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001158 const char *ptr;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001159 ptr = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001160 if (ptr == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001161 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001162 v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001163 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001164 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001165 if (is_interned)
1166 PyUnicode_InternInPlace(&v);
1167 retval = v;
1168 R_REF(retval);
1169 break;
1170 }
1171
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001172 case TYPE_INTERNED:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001173 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001174 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001175 case TYPE_UNICODE:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001177 const char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +00001178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001180 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001181 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001182 if (n < 0 || n > SIZE32_MAX) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001183 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 break;
1185 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001186 if (n != 0) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001187 buffer = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001188 if (buffer == NULL)
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001189 break;
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001190 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001192 else {
1193 v = PyUnicode_New(0, 0);
1194 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001195 if (v == NULL)
Victor Stinner3a8b79d2013-07-08 22:23:32 +02001196 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001197 if (is_interned)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001198 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001200 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 break;
1202 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001203
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001204 case TYPE_SMALL_TUPLE:
1205 n = (unsigned char) r_byte(p);
Victor Stinnerb1b7b182013-10-31 17:07:08 +01001206 if (PyErr_Occurred())
1207 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001208 goto _read_tuple;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 case TYPE_TUPLE:
1210 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001211 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001212 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001213 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 break;
1216 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001217 _read_tuple:
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001218 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001219 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001220 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 break;
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 for (i = 0; i < n; i++) {
1224 v2 = r_object(p);
1225 if ( v2 == NULL ) {
1226 if (!PyErr_Occurred())
1227 PyErr_SetString(PyExc_TypeError,
1228 "NULL object in marshal data for tuple");
1229 Py_DECREF(v);
1230 v = NULL;
1231 break;
1232 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001233 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 }
1235 retval = v;
1236 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 case TYPE_LIST:
1239 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001240 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001241 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001242 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 break;
1245 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001246 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001247 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001248 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 for (i = 0; i < n; i++) {
1251 v2 = r_object(p);
1252 if ( v2 == NULL ) {
1253 if (!PyErr_Occurred())
1254 PyErr_SetString(PyExc_TypeError,
1255 "NULL object in marshal data for list");
1256 Py_DECREF(v);
1257 v = NULL;
1258 break;
1259 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001260 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 }
1262 retval = v;
1263 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 case TYPE_DICT:
1266 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001267 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001268 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 for (;;) {
1271 PyObject *key, *val;
1272 key = r_object(p);
1273 if (key == NULL)
1274 break;
1275 val = r_object(p);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001276 if (val == NULL) {
1277 Py_DECREF(key);
1278 break;
1279 }
1280 if (PyDict_SetItem(v, key, val) < 0) {
1281 Py_DECREF(key);
1282 Py_DECREF(val);
1283 break;
1284 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 Py_DECREF(key);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001286 Py_DECREF(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 }
1288 if (PyErr_Occurred()) {
1289 Py_DECREF(v);
1290 v = NULL;
1291 }
1292 retval = v;
1293 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 case TYPE_SET:
1296 case TYPE_FROZENSET:
1297 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001298 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001299 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001300 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 break;
1303 }
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001304
Victor Stinner1aa78932016-01-23 14:15:48 +01001305 if (n == 0 && type == TYPE_FROZENSET) {
1306 /* call frozenset() to get the empty frozenset singleton */
Victor Stinner4778eab2016-12-01 14:51:04 +01001307 v = _PyObject_CallNoArg((PyObject*)&PyFrozenSet_Type);
Victor Stinner1aa78932016-01-23 14:15:48 +01001308 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 break;
Victor Stinner1aa78932016-01-23 14:15:48 +01001310 R_REF(v);
1311 retval = v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 }
Victor Stinner1aa78932016-01-23 14:15:48 +01001313 else {
1314 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
1315 if (type == TYPE_SET) {
1316 R_REF(v);
1317 } else {
1318 /* must use delayed registration of frozensets because they must
1319 * be init with a refcount of 1
1320 */
1321 idx = r_ref_reserve(flag, p);
1322 if (idx < 0)
1323 Py_CLEAR(v); /* signal error */
1324 }
1325 if (v == NULL)
1326 break;
1327
1328 for (i = 0; i < n; i++) {
1329 v2 = r_object(p);
1330 if ( v2 == NULL ) {
1331 if (!PyErr_Occurred())
1332 PyErr_SetString(PyExc_TypeError,
1333 "NULL object in marshal data for set");
1334 Py_DECREF(v);
1335 v = NULL;
1336 break;
1337 }
1338 if (PySet_Add(v, v2) == -1) {
1339 Py_DECREF(v);
1340 Py_DECREF(v2);
1341 v = NULL;
1342 break;
1343 }
1344 Py_DECREF(v2);
1345 }
1346 if (type != TYPE_SET)
1347 v = r_ref_insert(v, idx, flag, p);
1348 retval = v;
1349 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001352 case TYPE_CODE:
1353 {
1354 int argcount;
1355 int kwonlyargcount;
1356 int nlocals;
1357 int stacksize;
1358 int flags;
1359 PyObject *code = NULL;
1360 PyObject *consts = NULL;
1361 PyObject *names = NULL;
1362 PyObject *varnames = NULL;
1363 PyObject *freevars = NULL;
1364 PyObject *cellvars = NULL;
1365 PyObject *filename = NULL;
1366 PyObject *name = NULL;
1367 int firstlineno;
1368 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001369
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001370 idx = r_ref_reserve(flag, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001371 if (idx < 0)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001372 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 /* XXX ignore long->int overflows for now */
1377 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001378 if (PyErr_Occurred())
1379 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001381 if (PyErr_Occurred())
1382 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001384 if (PyErr_Occurred())
1385 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001387 if (PyErr_Occurred())
1388 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001390 if (PyErr_Occurred())
1391 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 code = r_object(p);
1393 if (code == NULL)
1394 goto code_error;
1395 consts = r_object(p);
1396 if (consts == NULL)
1397 goto code_error;
1398 names = r_object(p);
1399 if (names == NULL)
1400 goto code_error;
1401 varnames = r_object(p);
1402 if (varnames == NULL)
1403 goto code_error;
1404 freevars = r_object(p);
1405 if (freevars == NULL)
1406 goto code_error;
1407 cellvars = r_object(p);
1408 if (cellvars == NULL)
1409 goto code_error;
1410 filename = r_object(p);
1411 if (filename == NULL)
1412 goto code_error;
1413 name = r_object(p);
1414 if (name == NULL)
1415 goto code_error;
1416 firstlineno = (int)r_long(p);
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001417 if (firstlineno == -1 && PyErr_Occurred())
1418 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 lnotab = r_object(p);
1420 if (lnotab == NULL)
1421 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 v = (PyObject *) PyCode_New(
1424 argcount, kwonlyargcount,
1425 nlocals, stacksize, flags,
1426 code, consts, names, varnames,
1427 freevars, cellvars, filename, name,
1428 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001429 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 code_error:
1432 Py_XDECREF(code);
1433 Py_XDECREF(consts);
1434 Py_XDECREF(names);
1435 Py_XDECREF(varnames);
1436 Py_XDECREF(freevars);
1437 Py_XDECREF(cellvars);
1438 Py_XDECREF(filename);
1439 Py_XDECREF(name);
1440 Py_XDECREF(lnotab);
1441 }
1442 retval = v;
1443 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001444
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001445 case TYPE_REF:
1446 n = r_long(p);
1447 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001448 if (n == -1 && PyErr_Occurred())
1449 break;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001450 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001451 break;
1452 }
1453 v = PyList_GET_ITEM(p->refs, n);
1454 if (v == Py_None) {
1455 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001456 break;
1457 }
1458 Py_INCREF(v);
1459 retval = v;
1460 break;
1461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 default:
1463 /* Bogus data got written, which isn't ideal.
1464 This will let you keep working and recover. */
1465 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 break;
1467
1468 }
1469 p->depth--;
1470 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001471}
1472
Neal Norwitzd85c4522004-06-13 20:31:49 +00001473static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001474read_object(RFILE *p)
1475{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 PyObject *v;
1477 if (PyErr_Occurred()) {
1478 fprintf(stderr, "XXX readobject called with exception set\n");
1479 return NULL;
1480 }
1481 v = r_object(p);
1482 if (v == NULL && !PyErr_Occurred())
1483 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1484 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001485}
1486
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001487int
1488PyMarshal_ReadShortFromFile(FILE *fp)
1489{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001491 int res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001493 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 rf.fp = fp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 rf.end = rf.ptr = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001496 rf.buf = NULL;
1497 res = r_short(&rf);
1498 if (rf.buf != NULL)
1499 PyMem_FREE(rf.buf);
1500 return res;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001501}
1502
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001503long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001504PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001505{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001507 long res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001509 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001511 rf.buf = NULL;
1512 res = r_long(&rf);
1513 if (rf.buf != NULL)
1514 PyMem_FREE(rf.buf);
1515 return res;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001516}
1517
Steve Dowerf2f373f2015-02-21 08:44:05 -08001518/* Return size of file in bytes; < 0 if unknown or INT_MAX if too big */
Tim Peters691e0e92001-01-18 04:39:16 +00001519static off_t
1520getfilesize(FILE *fp)
1521{
Steve Dowerf2f373f2015-02-21 08:44:05 -08001522 struct _Py_stat_struct st;
Victor Stinnere134a7f2015-03-30 10:09:31 +02001523 if (_Py_fstat_noraise(fileno(fp), &st) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 return -1;
Steve Dowerf2f373f2015-02-21 08:44:05 -08001525#if SIZEOF_OFF_T == 4
1526 else if (st.st_size >= INT_MAX)
1527 return (off_t)INT_MAX;
1528#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 else
Steve Dowerf2f373f2015-02-21 08:44:05 -08001530 return (off_t)st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001531}
Tim Petersd9b9ac82001-01-28 00:27:39 +00001532
Tim Peters691e0e92001-01-18 04:39:16 +00001533/* If we can get the size of the file up-front, and it's reasonably small,
1534 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1535 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001536 * CAUTION: since this may read the entire remainder of the file, don't
1537 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001538 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001539PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001540PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001541{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001542/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001543#define REASONABLE_FILE_LIMIT (1L << 18)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 off_t filesize;
1545 filesize = getfilesize(fp);
1546 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1547 char* pBuf = (char *)PyMem_MALLOC(filesize);
1548 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001549 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1550 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 PyMem_FREE(pBuf);
1552 return v;
1553 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 /* We don't have fstat, or we do but the file is larger than
1557 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1558 */
1559 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001560
Tim Peters691e0e92001-01-18 04:39:16 +00001561#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001562}
1563
Guido van Rossum79f25d91997-04-29 20:08:16 +00001564PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001565PyMarshal_ReadObjectFromFile(FILE *fp)
1566{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 RFILE rf;
1568 PyObject *result;
1569 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001570 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 rf.depth = 0;
1572 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001573 rf.buf = NULL;
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;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001582}
1583
1584PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03001585PyMarshal_ReadObjectFromString(const char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001586{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 RFILE rf;
1588 PyObject *result;
1589 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001590 rf.readable = NULL;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001591 rf.ptr = (char *)str;
1592 rf.end = (char *)str + len;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001593 rf.buf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001595 rf.refs = PyList_New(0);
1596 if (rf.refs == NULL)
1597 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001599 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001600 if (rf.buf != NULL)
1601 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001603}
1604
Guido van Rossum79f25d91997-04-29 20:08:16 +00001605PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001606PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001607{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001609
Serhiy Storchakace921c622015-02-11 15:53:31 +02001610 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1612 if (wf.str == NULL)
1613 return NULL;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +02001614 wf.ptr = wf.buf = PyBytes_AS_STRING((PyBytesObject *)wf.str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 wf.end = wf.ptr + PyBytes_Size(wf.str);
1616 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 wf.version = version;
Serhiy Storchakace921c622015-02-11 15:53:31 +02001618 if (w_init_refs(&wf, version)) {
1619 Py_DECREF(wf.str);
1620 return NULL;
1621 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 w_object(x, &wf);
Serhiy Storchakace921c622015-02-11 15:53:31 +02001623 w_clear_refs(&wf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 if (wf.str != NULL) {
1625 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1626 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1627 Py_DECREF(wf.str);
1628 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001629 "too much marshal data for a bytes object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 return NULL;
1631 }
1632 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1633 return NULL;
1634 }
1635 if (wf.error != WFERR_OK) {
1636 Py_XDECREF(wf.str);
1637 if (wf.error == WFERR_NOMEMORY)
1638 PyErr_NoMemory();
1639 else
1640 PyErr_SetString(PyExc_ValueError,
1641 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1642 :"object too deeply nested to marshal");
1643 return NULL;
1644 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001645 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001646}
1647
Guido van Rossum64b45521991-06-07 13:58:22 +00001648/* And an interface for Python programs... */
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001649/*[clinic input]
1650marshal.dump
1651
1652 value: object
1653 Must be a supported type.
1654 file: object
1655 Must be a writeable binary file.
1656 version: int(c_default="Py_MARSHAL_VERSION") = version
1657 Indicates the data format that dump should use.
1658 /
1659
1660Write the value on the open file.
1661
1662If the value has (or contains an object that has) an unsupported type, a
1663ValueError exception is raised - but garbage data will also be written
1664to the file. The object will not be properly read back by load().
1665[clinic start generated code]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001666
Guido van Rossum79f25d91997-04-29 20:08:16 +00001667static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001668marshal_dump_impl(PyObject *module, PyObject *value, PyObject *file,
1669 int version)
1670/*[clinic end generated code: output=aaee62c7028a7cb2 input=6c7a3c23c6fef556]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001671{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 /* XXX Quick hack -- need to do this differently */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 PyObject *s;
1674 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001675 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001676
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001677 s = PyMarshal_WriteObjectToString(value, version);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 if (s == NULL)
1679 return NULL;
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001680 res = _PyObject_CallMethodIdObjArgs(file, &PyId_write, s, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 Py_DECREF(s);
1682 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001683}
1684
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001685/*[clinic input]
1686marshal.load
1687
1688 file: object
1689 Must be readable binary file.
1690 /
1691
1692Read one value from the open file and return it.
1693
1694If no valid value is read (e.g. because the data has a different Python
1695version's incompatible marshal format), raise EOFError, ValueError or
1696TypeError.
1697
1698Note: If an object containing an unsupported type was marshalled with
1699dump(), load() will substitute None for the unmarshallable type.
1700[clinic start generated code]*/
R. David Murraydd226ea2009-05-13 12:27:21 +00001701
Guido van Rossum79f25d91997-04-29 20:08:16 +00001702static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001703marshal_load(PyObject *module, PyObject *file)
1704/*[clinic end generated code: output=f8e5c33233566344 input=c85c2b594cd8124a]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001705{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001707 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001709
1710 /*
1711 * Make a call to the read method, but read zero bytes.
1712 * This is to ensure that the object passed in at least
1713 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001714 * This can be removed if we guarantee good error handling
1715 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001716 */
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001717 data = _PyObject_CallMethodId(file, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 if (data == NULL)
1719 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001720 if (!PyBytes_Check(data)) {
1721 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001722 "file.read() returned not bytes but %.100s",
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001723 data->ob_type->tp_name);
1724 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 }
1726 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001727 rf.depth = 0;
1728 rf.fp = NULL;
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001729 rf.readable = file;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001730 rf.ptr = rf.end = NULL;
1731 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001732 if ((rf.refs = PyList_New(0)) != NULL) {
1733 result = read_object(&rf);
1734 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001735 if (rf.buf != NULL)
1736 PyMem_FREE(rf.buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001737 } else
1738 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 Py_DECREF(data);
1741 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001742}
1743
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001744/*[clinic input]
1745marshal.dumps
R. David Murraydd226ea2009-05-13 12:27:21 +00001746
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001747 value: object
1748 Must be a supported type.
1749 version: int(c_default="Py_MARSHAL_VERSION") = version
1750 Indicates the data format that dumps should use.
1751 /
1752
1753Return the bytes object that would be written to a file by dump(value, file).
1754
1755Raise a ValueError exception if value has (or contains an object that has) an
1756unsupported type.
1757[clinic start generated code]*/
R. David Murraydd226ea2009-05-13 12:27:21 +00001758
Guido van Rossum79f25d91997-04-29 20:08:16 +00001759static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001760marshal_dumps_impl(PyObject *module, PyObject *value, int version)
1761/*[clinic end generated code: output=9c200f98d7256cad input=a2139ea8608e9b27]*/
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001762{
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001763 return PyMarshal_WriteObjectToString(value, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001764}
1765
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001766/*[clinic input]
1767marshal.loads
R. David Murraydd226ea2009-05-13 12:27:21 +00001768
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001769 bytes: Py_buffer
1770 /
1771
1772Convert the bytes-like object to a value.
1773
1774If no valid value is found, raise EOFError, ValueError or TypeError. Extra
1775bytes in the input are ignored.
1776[clinic start generated code]*/
R. David Murraydd226ea2009-05-13 12:27:21 +00001777
Guido van Rossum79f25d91997-04-29 20:08:16 +00001778static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001779marshal_loads_impl(PyObject *module, Py_buffer *bytes)
1780/*[clinic end generated code: output=9fc65985c93d1bb1 input=6f426518459c8495]*/
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001781{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 RFILE rf;
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001783 char *s = bytes->buf;
1784 Py_ssize_t n = bytes->len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 PyObject* result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001787 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 rf.ptr = s;
1789 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001791 if ((rf.refs = PyList_New(0)) == NULL)
1792 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 result = read_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001794 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001796}
1797
Guido van Rossum79f25d91997-04-29 20:08:16 +00001798static PyMethodDef marshal_methods[] = {
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001799 MARSHAL_DUMP_METHODDEF
1800 MARSHAL_LOAD_METHODDEF
1801 MARSHAL_DUMPS_METHODDEF
1802 MARSHAL_LOADS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001804};
1805
R. David Murraydd226ea2009-05-13 12:27:21 +00001806
1807PyDoc_STRVAR(module_doc,
1808"This module contains functions that can read and write Python values in\n\
1809a binary format. The format is specific to Python, but independent of\n\
1810machine architecture issues.\n\
1811\n\
1812Not all Python object types are supported; in general, only objects\n\
1813whose value is independent from a particular invocation of Python can be\n\
1814written and read by this module. The following types are supported:\n\
1815None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1816tuples, lists, sets, dictionaries, and code objects, where it\n\
1817should be understood that tuples, lists and dictionaries are only\n\
1818supported as long as the values contained therein are themselves\n\
1819supported; and recursive lists and dictionaries should not be written\n\
1820(they will cause infinite loops).\n\
1821\n\
1822Variables:\n\
1823\n\
1824version -- indicates the format that the module uses. Version 0 is the\n\
1825 historical format, version 1 shares interned strings and version 2\n\
1826 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001827 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001828\n\
1829Functions:\n\
1830\n\
1831dump() -- write value to a file\n\
1832load() -- read value from a file\n\
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001833dumps() -- marshal value as a bytes object\n\
1834loads() -- read value from a bytes-like object");
R. David Murraydd226ea2009-05-13 12:27:21 +00001835
1836
1837
Brett Cannon429ef652008-06-27 00:35:35 +00001838static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 PyModuleDef_HEAD_INIT,
1840 "marshal",
1841 module_doc,
1842 0,
1843 marshal_methods,
1844 NULL,
1845 NULL,
1846 NULL,
1847 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001848};
1849
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001850PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001851PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001852{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 PyObject *mod = PyModule_Create(&marshalmodule);
1854 if (mod == NULL)
1855 return NULL;
1856 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1857 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001858}