blob: 7d60614e712aef13617fd5eb23bbb2ca47a7c15e [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.
Miss Islington (bot)103058e2018-06-04 13:41:49 -070028 *
29 * BUG: https://bugs.python.org/issue33720
30 * On Windows PGO builds, the r_object function overallocates its stack and
31 * can cause a stack overflow. We reduce the maximum depth for all Windows
32 * releases to protect against this.
33 * #if defined(MS_WINDOWS) && defined(_DEBUG)
Fred Drake6da0b912000-06-28 18:47:56 +000034 */
Miss Islington (bot)103058e2018-06-04 13:41:49 -070035#if defined(MS_WINDOWS)
Steve Dowerf6c69e62014-11-01 15:15:16 -070036#define MAX_MARSHAL_STACK_DEPTH 1000
Guido van Rossum63175a12007-08-29 20:39:13 +000037#else
Guido van Rossumd59da4b2007-05-22 18:11:13 +000038#define MAX_MARSHAL_STACK_DEPTH 2000
Guido van Rossum63175a12007-08-29 20:39:13 +000039#endif
Fred Drake6da0b912000-06-28 18:47:56 +000040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000041#define TYPE_NULL '0'
42#define TYPE_NONE 'N'
43#define TYPE_FALSE 'F'
44#define TYPE_TRUE 'T'
45#define TYPE_STOPITER 'S'
46#define TYPE_ELLIPSIS '.'
47#define TYPE_INT 'i'
Serhiy Storchaka00987f62017-11-15 17:41:05 +020048/* TYPE_INT64 is not generated anymore.
49 Supported for backward compatibility only. */
50#define TYPE_INT64 'I'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000051#define TYPE_FLOAT 'f'
52#define TYPE_BINARY_FLOAT 'g'
53#define TYPE_COMPLEX 'x'
54#define TYPE_BINARY_COMPLEX 'y'
55#define TYPE_LONG 'l'
56#define TYPE_STRING 's'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070057#define TYPE_INTERNED 't'
58#define TYPE_REF 'r'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059#define TYPE_TUPLE '('
60#define TYPE_LIST '['
61#define TYPE_DICT '{'
62#define TYPE_CODE 'c'
63#define TYPE_UNICODE 'u'
64#define TYPE_UNKNOWN '?'
65#define TYPE_SET '<'
66#define TYPE_FROZENSET '>'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070067#define FLAG_REF '\x80' /* with a type, add obj to index */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000068
Antoine Pitrou1164dfc2013-10-12 22:25:39 +020069#define TYPE_ASCII 'a'
70#define TYPE_ASCII_INTERNED 'A'
71#define TYPE_SMALL_TUPLE ')'
72#define TYPE_SHORT_ASCII 'z'
73#define TYPE_SHORT_ASCII_INTERNED 'Z'
74
Eric Smithb1a03cf2009-04-21 11:57:38 +000075#define WFERR_OK 0
76#define WFERR_UNMARSHALLABLE 1
77#define WFERR_NESTEDTOODEEP 2
78#define WFERR_NOMEMORY 3
79
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000080typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000081 FILE *fp;
82 int error; /* see WFERR_* values */
83 int depth;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 PyObject *str;
85 char *ptr;
86 char *end;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +020087 char *buf;
Serhiy Storchakace921c622015-02-11 15:53:31 +020088 _Py_hashtable_t *hashtable;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 int version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000090} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000091
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +020092#define w_byte(c, p) do { \
93 if ((p)->ptr != (p)->end || w_reserve((p), 1)) \
94 *(p)->ptr++ = (c); \
95 } while(0)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000096
97static void
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +020098w_flush(WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000099{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200100 assert(p->fp != NULL);
101 fwrite(p->buf, 1, p->ptr - p->buf, p->fp);
102 p->ptr = p->buf;
103}
104
105static int
106w_reserve(WFILE *p, Py_ssize_t needed)
107{
108 Py_ssize_t pos, size, delta;
109 if (p->ptr == NULL)
110 return 0; /* An error already occurred */
111 if (p->fp != NULL) {
112 w_flush(p);
113 return needed <= p->end - p->ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000114 }
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200115 assert(p->str != NULL);
116 pos = p->ptr - p->buf;
117 size = PyBytes_Size(p->str);
118 if (size > 16*1024*1024)
119 delta = (size >> 3); /* 12.5% overallocation */
120 else
121 delta = size + 1024;
122 delta = Py_MAX(delta, needed);
123 if (delta > PY_SSIZE_T_MAX - size) {
124 p->error = WFERR_NOMEMORY;
125 return 0;
126 }
127 size += delta;
128 if (_PyBytes_Resize(&p->str, size) != 0) {
129 p->ptr = p->buf = p->end = NULL;
130 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 }
132 else {
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200133 p->buf = PyBytes_AS_STRING(p->str);
134 p->ptr = p->buf + pos;
135 p->end = p->buf + size;
136 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000138}
139
140static void
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300141w_string(const char *s, Py_ssize_t n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000142{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200143 Py_ssize_t m;
144 if (!n || p->ptr == NULL)
145 return;
146 m = p->end - p->ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 if (p->fp != NULL) {
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200148 if (n <= m) {
Christian Heimesf051e432016-09-13 20:22:02 +0200149 memcpy(p->ptr, s, n);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200150 p->ptr += n;
151 }
152 else {
153 w_flush(p);
154 fwrite(s, 1, n, p->fp);
155 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 }
157 else {
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200158 if (n <= m || w_reserve(p, n - m)) {
Christian Heimesf051e432016-09-13 20:22:02 +0200159 memcpy(p->ptr, s, n);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200160 p->ptr += n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000161 }
162 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000163}
164
165static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000166w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000167{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000168 w_byte((char)( x & 0xff), p);
169 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000170}
171
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000172static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000173w_long(long x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000174{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 w_byte((char)( x & 0xff), p);
176 w_byte((char)((x>> 8) & 0xff), p);
177 w_byte((char)((x>>16) & 0xff), p);
178 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000179}
180
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200181#define SIZE32_MAX 0x7FFFFFFF
182
183#if SIZEOF_SIZE_T > 4
184# define W_SIZE(n, p) do { \
185 if ((n) > SIZE32_MAX) { \
186 (p)->depth--; \
187 (p)->error = WFERR_UNMARSHALLABLE; \
188 return; \
189 } \
190 w_long((long)(n), p); \
191 } while(0)
192#else
193# define W_SIZE w_long
194#endif
195
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300196static void
197w_pstring(const char *s, Py_ssize_t n, WFILE *p)
198{
199 W_SIZE(n, p);
200 w_string(s, n, p);
201}
202
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200203static void
204w_short_pstring(const char *s, Py_ssize_t n, WFILE *p)
205{
Antoine Pitroub30f2712013-10-12 23:14:47 +0200206 w_byte(Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char), p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200207 w_string(s, n, p);
208}
209
Serhiy Storchaka95949422013-08-27 19:40:23 +0300210/* We assume that Python ints are stored internally in base some power of
Mark Dickinsonbd792642009-03-18 20:06:12 +0000211 2**15; for the sake of portability we'll always read and write them in base
212 exactly 2**15. */
213
214#define PyLong_MARSHAL_SHIFT 15
215#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
216#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
217#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
218#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
219#endif
220#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
221
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700222#define W_TYPE(t, p) do { \
223 w_byte((t) | flag, (p)); \
224} while(0)
225
Mark Dickinsonbd792642009-03-18 20:06:12 +0000226static void
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700227w_PyLong(const PyLongObject *ob, char flag, WFILE *p)
Mark Dickinsonbd792642009-03-18 20:06:12 +0000228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 Py_ssize_t i, j, n, l;
230 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000231
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700232 W_TYPE(TYPE_LONG, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 if (Py_SIZE(ob) == 0) {
234 w_long((long)0, p);
235 return;
236 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 /* set l to number of base PyLong_MARSHAL_BASE digits */
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200239 n = Py_ABS(Py_SIZE(ob));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 l = (n-1) * PyLong_MARSHAL_RATIO;
241 d = ob->ob_digit[n-1];
242 assert(d != 0); /* a PyLong is always normalized */
243 do {
244 d >>= PyLong_MARSHAL_SHIFT;
245 l++;
246 } while (d != 0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200247 if (l > SIZE32_MAX) {
248 p->depth--;
249 p->error = WFERR_UNMARSHALLABLE;
250 return;
251 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000252 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 for (i=0; i < n-1; i++) {
255 d = ob->ob_digit[i];
256 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
257 w_short(d & PyLong_MARSHAL_MASK, p);
258 d >>= PyLong_MARSHAL_SHIFT;
259 }
260 assert (d == 0);
261 }
262 d = ob->ob_digit[n-1];
263 do {
264 w_short(d & PyLong_MARSHAL_MASK, p);
265 d >>= PyLong_MARSHAL_SHIFT;
266 } while (d != 0);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000267}
268
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700269static int
270w_ref(PyObject *v, char *flag, WFILE *p)
271{
Serhiy Storchakace921c622015-02-11 15:53:31 +0200272 _Py_hashtable_entry_t *entry;
273 int w;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700274
Serhiy Storchakace921c622015-02-11 15:53:31 +0200275 if (p->version < 3 || p->hashtable == NULL)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700276 return 0; /* not writing object references */
277
278 /* if it has only one reference, it definitely isn't shared */
279 if (Py_REFCNT(v) == 1)
280 return 0;
281
Victor Stinner285cf0a2016-03-21 22:00:58 +0100282 entry = _Py_HASHTABLE_GET_ENTRY(p->hashtable, v);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200283 if (entry != NULL) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700284 /* write the reference index to the stream */
Victor Stinnere8c6b2f2016-03-23 09:25:01 +0100285 _Py_HASHTABLE_ENTRY_READ_DATA(p->hashtable, entry, w);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700286 /* we don't store "long" indices in the dict */
287 assert(0 <= w && w <= 0x7fffffff);
288 w_byte(TYPE_REF, p);
289 w_long(w, p);
290 return 1;
291 } else {
Serhiy Storchakace921c622015-02-11 15:53:31 +0200292 size_t s = p->hashtable->entries;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700293 /* we don't support long indices */
294 if (s >= 0x7fffffff) {
295 PyErr_SetString(PyExc_ValueError, "too many objects");
296 goto err;
297 }
Serhiy Storchaka26861b02015-02-16 20:52:17 +0200298 w = (int)s;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200299 Py_INCREF(v);
300 if (_Py_HASHTABLE_SET(p->hashtable, v, w) < 0) {
301 Py_DECREF(v);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700302 goto err;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200303 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700304 *flag |= FLAG_REF;
305 return 0;
306 }
307err:
308 p->error = WFERR_UNMARSHALLABLE;
309 return 1;
310}
311
312static void
313w_complex_object(PyObject *v, char flag, WFILE *p);
314
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000315static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000316w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000317{
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700318 char flag = '\0';
Fred Drake6da0b912000-06-28 18:47:56 +0000319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000320 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
323 p->error = WFERR_NESTEDTOODEEP;
324 }
325 else if (v == NULL) {
326 w_byte(TYPE_NULL, p);
327 }
328 else if (v == Py_None) {
329 w_byte(TYPE_NONE, p);
330 }
331 else if (v == PyExc_StopIteration) {
332 w_byte(TYPE_STOPITER, p);
333 }
334 else if (v == Py_Ellipsis) {
335 w_byte(TYPE_ELLIPSIS, p);
336 }
337 else if (v == Py_False) {
338 w_byte(TYPE_FALSE, p);
339 }
340 else if (v == Py_True) {
341 w_byte(TYPE_TRUE, p);
342 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700343 else if (!w_ref(v, &flag, p))
344 w_complex_object(v, flag, p);
345
346 p->depth--;
347}
348
349static void
350w_complex_object(PyObject *v, char flag, WFILE *p)
351{
352 Py_ssize_t i, n;
353
354 if (PyLong_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 long x = PyLong_AsLong(v);
356 if ((x == -1) && PyErr_Occurred()) {
357 PyLongObject *ob = (PyLongObject *)v;
358 PyErr_Clear();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700359 w_PyLong(ob, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 }
361 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000362#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
364 if (y && y != -1) {
Martin v. Löwis7e395722012-07-28 19:44:05 +0200365 /* Too large for TYPE_INT */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700366 w_PyLong((PyLongObject*)v, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 }
368 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000369#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700371 W_TYPE(TYPE_INT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 w_long(x, p);
373 }
374 }
375 }
376 else if (PyFloat_CheckExact(v)) {
377 if (p->version > 1) {
378 unsigned char buf[8];
379 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
380 buf, 1) < 0) {
381 p->error = WFERR_UNMARSHALLABLE;
382 return;
383 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700384 W_TYPE(TYPE_BINARY_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 w_string((char*)buf, 8, p);
386 }
387 else {
388 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
389 'g', 17, 0, NULL);
390 if (!buf) {
391 p->error = WFERR_NOMEMORY;
392 return;
393 }
394 n = strlen(buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700395 W_TYPE(TYPE_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200397 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 PyMem_Free(buf);
399 }
400 }
401 else if (PyComplex_CheckExact(v)) {
402 if (p->version > 1) {
403 unsigned char buf[8];
404 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
405 buf, 1) < 0) {
406 p->error = WFERR_UNMARSHALLABLE;
407 return;
408 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700409 W_TYPE(TYPE_BINARY_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 w_string((char*)buf, 8, p);
411 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
412 buf, 1) < 0) {
413 p->error = WFERR_UNMARSHALLABLE;
414 return;
415 }
416 w_string((char*)buf, 8, p);
417 }
418 else {
419 char *buf;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700420 W_TYPE(TYPE_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
422 'g', 17, 0, NULL);
423 if (!buf) {
424 p->error = WFERR_NOMEMORY;
425 return;
426 }
427 n = strlen(buf);
428 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200429 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 PyMem_Free(buf);
431 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
432 'g', 17, 0, NULL);
433 if (!buf) {
434 p->error = WFERR_NOMEMORY;
435 return;
436 }
437 n = strlen(buf);
438 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200439 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000440 PyMem_Free(buf);
441 }
442 }
443 else if (PyBytes_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700444 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300445 w_pstring(PyBytes_AS_STRING(v), PyBytes_GET_SIZE(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000446 }
447 else if (PyUnicode_CheckExact(v)) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200448 if (p->version >= 4 && PyUnicode_IS_ASCII(v)) {
449 int is_short = PyUnicode_GET_LENGTH(v) < 256;
450 if (is_short) {
451 if (PyUnicode_CHECK_INTERNED(v))
452 W_TYPE(TYPE_SHORT_ASCII_INTERNED, p);
453 else
454 W_TYPE(TYPE_SHORT_ASCII, p);
455 w_short_pstring((char *) PyUnicode_1BYTE_DATA(v),
456 PyUnicode_GET_LENGTH(v), p);
457 }
458 else {
459 if (PyUnicode_CHECK_INTERNED(v))
460 W_TYPE(TYPE_ASCII_INTERNED, p);
461 else
462 W_TYPE(TYPE_ASCII, p);
463 w_pstring((char *) PyUnicode_1BYTE_DATA(v),
464 PyUnicode_GET_LENGTH(v), p);
465 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200467 else {
468 PyObject *utf8;
469 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");
470 if (utf8 == NULL) {
471 p->depth--;
472 p->error = WFERR_UNMARSHALLABLE;
473 return;
474 }
475 if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v))
476 W_TYPE(TYPE_INTERNED, p);
477 else
478 W_TYPE(TYPE_UNICODE, p);
479 w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p);
480 Py_DECREF(utf8);
481 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 }
483 else if (PyTuple_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 n = PyTuple_Size(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200485 if (p->version >= 4 && n < 256) {
486 W_TYPE(TYPE_SMALL_TUPLE, p);
Victor Stinnerda062552013-11-16 00:13:29 +0100487 w_byte((unsigned char)n, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200488 }
489 else {
490 W_TYPE(TYPE_TUPLE, p);
491 W_SIZE(n, p);
492 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 for (i = 0; i < n; i++) {
494 w_object(PyTuple_GET_ITEM(v, i), p);
495 }
496 }
497 else if (PyList_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700498 W_TYPE(TYPE_LIST, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 n = PyList_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200500 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 for (i = 0; i < n; i++) {
502 w_object(PyList_GET_ITEM(v, i), p);
503 }
504 }
505 else if (PyDict_CheckExact(v)) {
506 Py_ssize_t pos;
507 PyObject *key, *value;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700508 W_TYPE(TYPE_DICT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 /* This one is NULL object terminated! */
510 pos = 0;
511 while (PyDict_Next(v, &pos, &key, &value)) {
512 w_object(key, p);
513 w_object(value, p);
514 }
515 w_object((PyObject *)NULL, p);
516 }
517 else if (PyAnySet_CheckExact(v)) {
518 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 if (PyObject_TypeCheck(v, &PySet_Type))
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700521 W_TYPE(TYPE_SET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 else
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700523 W_TYPE(TYPE_FROZENSET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 n = PyObject_Size(v);
525 if (n == -1) {
526 p->depth--;
527 p->error = WFERR_UNMARSHALLABLE;
528 return;
529 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200530 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 it = PyObject_GetIter(v);
532 if (it == NULL) {
533 p->depth--;
534 p->error = WFERR_UNMARSHALLABLE;
535 return;
536 }
537 while ((value = PyIter_Next(it)) != NULL) {
538 w_object(value, p);
539 Py_DECREF(value);
540 }
541 Py_DECREF(it);
542 if (PyErr_Occurred()) {
543 p->depth--;
544 p->error = WFERR_UNMARSHALLABLE;
545 return;
546 }
547 }
548 else if (PyCode_Check(v)) {
549 PyCodeObject *co = (PyCodeObject *)v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700550 W_TYPE(TYPE_CODE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 w_long(co->co_argcount, p);
552 w_long(co->co_kwonlyargcount, p);
553 w_long(co->co_nlocals, p);
554 w_long(co->co_stacksize, p);
555 w_long(co->co_flags, p);
556 w_object(co->co_code, p);
557 w_object(co->co_consts, p);
558 w_object(co->co_names, p);
559 w_object(co->co_varnames, p);
560 w_object(co->co_freevars, p);
561 w_object(co->co_cellvars, p);
562 w_object(co->co_filename, p);
563 w_object(co->co_name, p);
564 w_long(co->co_firstlineno, p);
565 w_object(co->co_lnotab, p);
566 }
567 else if (PyObject_CheckBuffer(v)) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +0200568 /* Write unknown bytes-like objects as a bytes object */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100570 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100572 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100574 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700576 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300577 w_pstring(view.buf, view.len, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100578 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 }
580 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700581 W_TYPE(TYPE_UNKNOWN, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000582 p->error = WFERR_UNMARSHALLABLE;
583 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000584}
585
Serhiy Storchakace921c622015-02-11 15:53:31 +0200586static int
587w_init_refs(WFILE *wf, int version)
588{
589 if (version >= 3) {
Victor Stinner285cf0a2016-03-21 22:00:58 +0100590 wf->hashtable = _Py_hashtable_new(sizeof(PyObject *), sizeof(int),
591 _Py_hashtable_hash_ptr,
Serhiy Storchakace921c622015-02-11 15:53:31 +0200592 _Py_hashtable_compare_direct);
593 if (wf->hashtable == NULL) {
594 PyErr_NoMemory();
595 return -1;
596 }
597 }
598 return 0;
599}
600
601static int
Victor Stinner285cf0a2016-03-21 22:00:58 +0100602w_decref_entry(_Py_hashtable_t *ht, _Py_hashtable_entry_t *entry,
603 void *Py_UNUSED(data))
Serhiy Storchakace921c622015-02-11 15:53:31 +0200604{
Victor Stinner285cf0a2016-03-21 22:00:58 +0100605 PyObject *entry_key;
606
Victor Stinner5dacbd42016-03-23 09:52:13 +0100607 _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, entry_key);
Victor Stinner285cf0a2016-03-21 22:00:58 +0100608 Py_XDECREF(entry_key);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200609 return 0;
610}
611
612static void
613w_clear_refs(WFILE *wf)
614{
615 if (wf->hashtable != NULL) {
616 _Py_hashtable_foreach(wf->hashtable, w_decref_entry, NULL);
617 _Py_hashtable_destroy(wf->hashtable);
618 }
619}
620
Serhiy Storchaka95949422013-08-27 19:40:23 +0300621/* version currently has no effect for writing ints. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000622void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000623PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000624{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200625 char buf[4];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 WFILE wf;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200627 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 wf.fp = fp;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200629 wf.ptr = wf.buf = buf;
630 wf.end = wf.ptr + sizeof(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 wf.version = version;
633 w_long(x, &wf);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200634 w_flush(&wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000635}
636
637void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000638PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000639{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200640 char buf[BUFSIZ];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 WFILE wf;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200642 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 wf.fp = fp;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200644 wf.ptr = wf.buf = buf;
645 wf.end = wf.ptr + sizeof(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 wf.version = version;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200648 if (w_init_refs(&wf, version))
649 return; /* caller mush check PyErr_Occurred() */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 w_object(x, &wf);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200651 w_clear_refs(&wf);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200652 w_flush(&wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000653}
654
Serhiy Storchakac07422c2015-02-11 16:18:09 +0200655typedef struct {
656 FILE *fp;
657 int depth;
658 PyObject *readable; /* Stream-like object being read from */
Serhiy Storchakac07422c2015-02-11 16:18:09 +0200659 char *ptr;
660 char *end;
661 char *buf;
662 Py_ssize_t buf_size;
663 PyObject *refs; /* a list */
664} RFILE;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000665
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200666static const char *
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200667r_string(Py_ssize_t n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000668{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200669 Py_ssize_t read = -1;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100670
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200671 if (p->ptr != NULL) {
672 /* Fast path for loads() */
673 char *res = p->ptr;
674 Py_ssize_t left = p->end - p->ptr;
675 if (left < n) {
676 PyErr_SetString(PyExc_EOFError,
677 "marshal data too short");
678 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100679 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200680 p->ptr += n;
681 return res;
682 }
683 if (p->buf == NULL) {
684 p->buf = PyMem_MALLOC(n);
685 if (p->buf == NULL) {
686 PyErr_NoMemory();
687 return NULL;
688 }
689 p->buf_size = n;
690 }
691 else if (p->buf_size < n) {
Zackery Spytz602d3072018-12-07 05:17:43 -0700692 char *tmp = PyMem_REALLOC(p->buf, n);
693 if (tmp == NULL) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200694 PyErr_NoMemory();
695 return NULL;
696 }
Zackery Spytz602d3072018-12-07 05:17:43 -0700697 p->buf = tmp;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200698 p->buf_size = n;
699 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100700
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200701 if (!p->readable) {
702 assert(p->fp != NULL);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200703 read = fread(p->buf, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100704 }
705 else {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200706 _Py_IDENTIFIER(readinto);
707 PyObject *res, *mview;
708 Py_buffer buf;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200709
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200710 if (PyBuffer_FillInfo(&buf, NULL, p->buf, n, 0, PyBUF_CONTIG) == -1)
711 return NULL;
712 mview = PyMemoryView_FromBuffer(&buf);
713 if (mview == NULL)
714 return NULL;
715
716 res = _PyObject_CallMethodId(p->readable, &PyId_readinto, "N", mview);
717 if (res != NULL) {
718 read = PyNumber_AsSsize_t(res, PyExc_ValueError);
719 Py_DECREF(res);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100720 }
721 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200722 if (read != n) {
723 if (!PyErr_Occurred()) {
724 if (read > n)
725 PyErr_Format(PyExc_ValueError,
726 "read() returned too much data: "
727 "%zd bytes requested, %zd returned",
728 n, read);
729 else
730 PyErr_SetString(PyExc_EOFError,
731 "EOF read where not expected");
732 }
733 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100734 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200735 return p->buf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100736}
737
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100738static int
739r_byte(RFILE *p)
740{
741 int c = EOF;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100742
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200743 if (p->ptr != NULL) {
744 if (p->ptr < p->end)
745 c = (unsigned char) *p->ptr++;
746 return c;
747 }
748 if (!p->readable) {
749 assert(p->fp);
750 c = getc(p->fp);
751 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100752 else {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200753 const char *ptr = r_string(1, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200754 if (ptr != NULL)
755 c = *(unsigned char *) ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100756 }
757 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000758}
759
760static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000761r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000762{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200763 short x = -1;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200764 const unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100765
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200766 buffer = (const unsigned char *) r_string(2, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200767 if (buffer != NULL) {
768 x = buffer[0];
769 x |= buffer[1] << 8;
770 /* Sign-extension, in case short greater than 16 bits */
771 x |= -(x & 0x8000);
772 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000774}
775
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000776static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000777r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000778{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200779 long x = -1;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200780 const unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100781
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200782 buffer = (const unsigned char *) r_string(4, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200783 if (buffer != NULL) {
784 x = buffer[0];
785 x |= (long)buffer[1] << 8;
786 x |= (long)buffer[2] << 16;
787 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000788#if SIZEOF_LONG > 4
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200789 /* Sign extension for 64-bit machines */
790 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000791#endif
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200792 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000794}
795
Serhiy Storchaka00987f62017-11-15 17:41:05 +0200796/* r_long64 deals with the TYPE_INT64 code. */
797static PyObject *
798r_long64(RFILE *p)
799{
800 const unsigned char *buffer = (const unsigned char *) r_string(8, p);
801 if (buffer == NULL) {
802 return NULL;
803 }
804 return _PyLong_FromByteArray(buffer, 8,
805 1 /* little endian */,
806 1 /* signed */);
807}
808
Guido van Rossum79f25d91997-04-29 20:08:16 +0000809static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000810r_PyLong(RFILE *p)
811{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200813 long n, size, i;
814 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100818 if (PyErr_Occurred())
819 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 if (n == 0)
821 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200822 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 PyErr_SetString(PyExc_ValueError,
824 "bad marshal data (long size out of range)");
825 return NULL;
826 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000827
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200828 size = 1 + (Py_ABS(n) - 1) / PyLong_MARSHAL_RATIO;
829 shorts_in_top_digit = 1 + (Py_ABS(n) - 1) % PyLong_MARSHAL_RATIO;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 ob = _PyLong_New(size);
831 if (ob == NULL)
832 return NULL;
Victor Stinner763b0d12013-10-31 16:56:38 +0100833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 for (i = 0; i < size-1; i++) {
837 d = 0;
838 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
839 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100840 if (PyErr_Occurred()) {
841 Py_DECREF(ob);
842 return NULL;
843 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 if (md < 0 || md > PyLong_MARSHAL_BASE)
845 goto bad_digit;
846 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
847 }
848 ob->ob_digit[i] = d;
849 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 d = 0;
852 for (j=0; j < shorts_in_top_digit; j++) {
853 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100854 if (PyErr_Occurred()) {
855 Py_DECREF(ob);
856 return NULL;
857 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 if (md < 0 || md > PyLong_MARSHAL_BASE)
859 goto bad_digit;
860 /* topmost marshal digit should be nonzero */
861 if (md == 0 && j == shorts_in_top_digit - 1) {
862 Py_DECREF(ob);
863 PyErr_SetString(PyExc_ValueError,
864 "bad marshal data (unnormalized long data)");
865 return NULL;
866 }
867 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
868 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100869 if (PyErr_Occurred()) {
870 Py_DECREF(ob);
871 return NULL;
872 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 /* top digit should be nonzero, else the resulting PyLong won't be
874 normalized */
875 ob->ob_digit[size-1] = d;
876 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000877 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 Py_DECREF(ob);
879 PyErr_SetString(PyExc_ValueError,
880 "bad marshal data (digit out of range in long)");
881 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000882}
883
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700884/* allocate the reflist index for a new object. Return -1 on failure */
885static Py_ssize_t
886r_ref_reserve(int flag, RFILE *p)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700887{
888 if (flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200889 Py_ssize_t idx = PyList_GET_SIZE(p->refs);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700890 if (idx >= 0x7ffffffe) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700891 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700892 return -1;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700893 }
894 if (PyList_Append(p->refs, Py_None) < 0)
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700895 return -1;
896 return idx;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700897 } else
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700898 return 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700899}
900
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700901/* insert the new object 'o' to the reflist at previously
902 * allocated index 'idx'.
903 * 'o' can be NULL, in which case nothing is done.
904 * if 'o' was non-NULL, and the function succeeds, 'o' is returned.
905 * if 'o' was non-NULL, and the function fails, 'o' is released and
906 * NULL returned. This simplifies error checking at the call site since
907 * a single test for NULL for the function result is enough.
908 */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700909static PyObject *
910r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
911{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700912 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200913 PyObject *tmp = PyList_GET_ITEM(p->refs, idx);
914 Py_INCREF(o);
915 PyList_SET_ITEM(p->refs, idx, o);
916 Py_DECREF(tmp);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700917 }
918 return o;
919}
920
921/* combination of both above, used when an object can be
922 * created whenever it is seen in the file, as opposed to
923 * after having loaded its sub-objects.
924 */
925static PyObject *
926r_ref(PyObject *o, int flag, RFILE *p)
927{
Victor Stinner359fabc2013-10-31 17:09:01 +0100928 assert(flag & FLAG_REF);
929 if (o == NULL)
930 return NULL;
931 if (PyList_Append(p->refs, o) < 0) {
932 Py_DECREF(o); /* release the new object */
933 return NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700934 }
935 return o;
936}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000937
938static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000939r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 /* NULL is a valid return value, it does not necessarily means that
942 an exception is set. */
943 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500944 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700946 int type, code = r_byte(p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200947 int flag, is_interned = 0;
Christian Heimes35728422013-10-13 02:29:06 +0200948 PyObject *retval = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000949
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700950 if (code == EOF) {
951 PyErr_SetString(PyExc_EOFError,
952 "EOF read where object expected");
953 return NULL;
954 }
955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
959 p->depth--;
960 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
961 return NULL;
962 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000963
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700964 flag = code & FLAG_REF;
965 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700966
967#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700968 if (flag) \
969 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700970} while (0)
971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 case TYPE_NULL:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 case TYPE_NONE:
978 Py_INCREF(Py_None);
979 retval = Py_None;
980 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 case TYPE_STOPITER:
983 Py_INCREF(PyExc_StopIteration);
984 retval = PyExc_StopIteration;
985 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 case TYPE_ELLIPSIS:
988 Py_INCREF(Py_Ellipsis);
989 retval = Py_Ellipsis;
990 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 case TYPE_FALSE:
993 Py_INCREF(Py_False);
994 retval = Py_False;
995 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 case TYPE_TRUE:
998 Py_INCREF(Py_True);
999 retval = Py_True;
1000 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +00001001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001003 n = r_long(p);
1004 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001005 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001007
Serhiy Storchaka00987f62017-11-15 17:41:05 +02001008 case TYPE_INT64:
1009 retval = r_long64(p);
1010 R_REF(retval);
1011 break;
1012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 case TYPE_LONG:
1014 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001015 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 case TYPE_FLOAT:
1019 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001020 char buf[256];
1021 const char *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 double dx;
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 dx = PyOS_string_to_double(buf, NULL, NULL);
1035 if (dx == -1.0 && PyErr_Occurred())
1036 break;
1037 retval = PyFloat_FromDouble(dx);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001038 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 break;
1040 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 case TYPE_BINARY_FLOAT:
1043 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001044 const unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 double x;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001046 buf = (const unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001047 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 x = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001050 if (x == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001053 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 break;
1055 }
Michael W. Hudsondf888462005-06-03 14:41:55 +00001056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 case TYPE_COMPLEX:
1058 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001059 char buf[256];
1060 const char *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 Py_complex c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001063 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 PyErr_SetString(PyExc_EOFError,
1065 "EOF read where object expected");
1066 break;
1067 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001068 ptr = r_string(n, p);
1069 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001070 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001071 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 buf[n] = '\0';
1073 c.real = PyOS_string_to_double(buf, NULL, NULL);
1074 if (c.real == -1.0 && PyErr_Occurred())
1075 break;
1076 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001077 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 PyErr_SetString(PyExc_EOFError,
1079 "EOF read where object expected");
1080 break;
1081 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001082 ptr = r_string(n, p);
1083 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001084 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001085 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 buf[n] = '\0';
1087 c.imag = PyOS_string_to_double(buf, NULL, NULL);
1088 if (c.imag == -1.0 && PyErr_Occurred())
1089 break;
1090 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001091 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 break;
1093 }
Michael W. Hudsondf888462005-06-03 14:41:55 +00001094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 case TYPE_BINARY_COMPLEX:
1096 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001097 const unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 Py_complex c;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001099 buf = (const unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001100 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 c.real = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001103 if (c.real == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 break;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001105 buf = (const unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001106 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 c.imag = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001109 if (c.imag == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001112 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 break;
1114 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 case TYPE_STRING:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001117 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001118 const char *ptr;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001119 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001120 if (PyErr_Occurred())
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001121 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001122 if (n < 0 || n > SIZE32_MAX) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001123 PyErr_SetString(PyExc_ValueError, "bad marshal data (bytes object size out of range)");
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001124 break;
1125 }
1126 v = PyBytes_FromStringAndSize((char *)NULL, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001127 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001128 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001129 ptr = r_string(n, p);
1130 if (ptr == NULL) {
1131 Py_DECREF(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001132 break;
1133 }
1134 memcpy(PyBytes_AS_STRING(v), ptr, n);
1135 retval = v;
1136 R_REF(retval);
1137 break;
1138 }
1139
1140 case TYPE_ASCII_INTERNED:
1141 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001142 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001143 case TYPE_ASCII:
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) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001148 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 break;
1150 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001151 goto _read_ascii;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001152
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001153 case TYPE_SHORT_ASCII_INTERNED:
1154 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001155 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001156 case TYPE_SHORT_ASCII:
1157 n = r_byte(p);
1158 if (n == EOF) {
1159 PyErr_SetString(PyExc_EOFError,
1160 "EOF read where object expected");
1161 break;
1162 }
1163 _read_ascii:
1164 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001165 const char *ptr;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001166 ptr = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001167 if (ptr == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001168 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001169 v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001170 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001171 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001172 if (is_interned)
1173 PyUnicode_InternInPlace(&v);
1174 retval = v;
1175 R_REF(retval);
1176 break;
1177 }
1178
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001179 case TYPE_INTERNED:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001180 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001181 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001182 case TYPE_UNICODE:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001184 const char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +00001185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001187 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001188 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001189 if (n < 0 || n > SIZE32_MAX) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001190 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 break;
1192 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001193 if (n != 0) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001194 buffer = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001195 if (buffer == NULL)
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001196 break;
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001197 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001199 else {
1200 v = PyUnicode_New(0, 0);
1201 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001202 if (v == NULL)
Victor Stinner3a8b79d2013-07-08 22:23:32 +02001203 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001204 if (is_interned)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001205 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001207 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 break;
1209 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001210
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001211 case TYPE_SMALL_TUPLE:
1212 n = (unsigned char) r_byte(p);
Victor Stinnerb1b7b182013-10-31 17:07:08 +01001213 if (PyErr_Occurred())
1214 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001215 goto _read_tuple;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 case TYPE_TUPLE:
1217 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001218 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001219 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001220 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 break;
1223 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001224 _read_tuple:
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001225 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001226 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001227 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 break;
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 for (i = 0; i < n; i++) {
1231 v2 = r_object(p);
1232 if ( v2 == NULL ) {
1233 if (!PyErr_Occurred())
1234 PyErr_SetString(PyExc_TypeError,
1235 "NULL object in marshal data for tuple");
1236 Py_DECREF(v);
1237 v = NULL;
1238 break;
1239 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001240 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 }
1242 retval = v;
1243 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 case TYPE_LIST:
1246 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001247 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001248 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001249 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 break;
1252 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001253 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001254 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001255 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 for (i = 0; i < n; i++) {
1258 v2 = r_object(p);
1259 if ( v2 == NULL ) {
1260 if (!PyErr_Occurred())
1261 PyErr_SetString(PyExc_TypeError,
1262 "NULL object in marshal data for list");
1263 Py_DECREF(v);
1264 v = NULL;
1265 break;
1266 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001267 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 }
1269 retval = v;
1270 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 case TYPE_DICT:
1273 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001274 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001275 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 for (;;) {
1278 PyObject *key, *val;
1279 key = r_object(p);
1280 if (key == NULL)
1281 break;
1282 val = r_object(p);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001283 if (val == NULL) {
1284 Py_DECREF(key);
1285 break;
1286 }
1287 if (PyDict_SetItem(v, key, val) < 0) {
1288 Py_DECREF(key);
1289 Py_DECREF(val);
1290 break;
1291 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 Py_DECREF(key);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001293 Py_DECREF(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 }
1295 if (PyErr_Occurred()) {
1296 Py_DECREF(v);
1297 v = NULL;
1298 }
1299 retval = v;
1300 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 case TYPE_SET:
1303 case TYPE_FROZENSET:
1304 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001305 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001306 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001307 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 break;
1310 }
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001311
Victor Stinner1aa78932016-01-23 14:15:48 +01001312 if (n == 0 && type == TYPE_FROZENSET) {
1313 /* call frozenset() to get the empty frozenset singleton */
Victor Stinner4778eab2016-12-01 14:51:04 +01001314 v = _PyObject_CallNoArg((PyObject*)&PyFrozenSet_Type);
Victor Stinner1aa78932016-01-23 14:15:48 +01001315 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 break;
Victor Stinner1aa78932016-01-23 14:15:48 +01001317 R_REF(v);
1318 retval = v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 }
Victor Stinner1aa78932016-01-23 14:15:48 +01001320 else {
1321 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
1322 if (type == TYPE_SET) {
1323 R_REF(v);
1324 } else {
1325 /* must use delayed registration of frozensets because they must
1326 * be init with a refcount of 1
1327 */
1328 idx = r_ref_reserve(flag, p);
1329 if (idx < 0)
1330 Py_CLEAR(v); /* signal error */
1331 }
1332 if (v == NULL)
1333 break;
1334
1335 for (i = 0; i < n; i++) {
1336 v2 = r_object(p);
1337 if ( v2 == NULL ) {
1338 if (!PyErr_Occurred())
1339 PyErr_SetString(PyExc_TypeError,
1340 "NULL object in marshal data for set");
1341 Py_DECREF(v);
1342 v = NULL;
1343 break;
1344 }
1345 if (PySet_Add(v, v2) == -1) {
1346 Py_DECREF(v);
1347 Py_DECREF(v2);
1348 v = NULL;
1349 break;
1350 }
1351 Py_DECREF(v2);
1352 }
1353 if (type != TYPE_SET)
1354 v = r_ref_insert(v, idx, flag, p);
1355 retval = v;
1356 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 case TYPE_CODE:
1360 {
1361 int argcount;
1362 int kwonlyargcount;
1363 int nlocals;
1364 int stacksize;
1365 int flags;
1366 PyObject *code = NULL;
1367 PyObject *consts = NULL;
1368 PyObject *names = NULL;
1369 PyObject *varnames = NULL;
1370 PyObject *freevars = NULL;
1371 PyObject *cellvars = NULL;
1372 PyObject *filename = NULL;
1373 PyObject *name = NULL;
1374 int firstlineno;
1375 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001376
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001377 idx = r_ref_reserve(flag, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001378 if (idx < 0)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001379 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 /* XXX ignore long->int overflows for now */
1384 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001385 if (PyErr_Occurred())
1386 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001388 if (PyErr_Occurred())
1389 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001391 if (PyErr_Occurred())
1392 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001394 if (PyErr_Occurred())
1395 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001397 if (PyErr_Occurred())
1398 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 code = r_object(p);
1400 if (code == NULL)
1401 goto code_error;
1402 consts = r_object(p);
1403 if (consts == NULL)
1404 goto code_error;
1405 names = r_object(p);
1406 if (names == NULL)
1407 goto code_error;
1408 varnames = r_object(p);
1409 if (varnames == NULL)
1410 goto code_error;
1411 freevars = r_object(p);
1412 if (freevars == NULL)
1413 goto code_error;
1414 cellvars = r_object(p);
1415 if (cellvars == NULL)
1416 goto code_error;
1417 filename = r_object(p);
1418 if (filename == NULL)
1419 goto code_error;
1420 name = r_object(p);
1421 if (name == NULL)
1422 goto code_error;
1423 firstlineno = (int)r_long(p);
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001424 if (firstlineno == -1 && PyErr_Occurred())
1425 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 lnotab = r_object(p);
1427 if (lnotab == NULL)
1428 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 v = (PyObject *) PyCode_New(
1431 argcount, kwonlyargcount,
1432 nlocals, stacksize, flags,
1433 code, consts, names, varnames,
1434 freevars, cellvars, filename, name,
1435 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001436 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 code_error:
1439 Py_XDECREF(code);
1440 Py_XDECREF(consts);
1441 Py_XDECREF(names);
1442 Py_XDECREF(varnames);
1443 Py_XDECREF(freevars);
1444 Py_XDECREF(cellvars);
1445 Py_XDECREF(filename);
1446 Py_XDECREF(name);
1447 Py_XDECREF(lnotab);
1448 }
1449 retval = v;
1450 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001451
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001452 case TYPE_REF:
1453 n = r_long(p);
1454 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001455 if (n == -1 && PyErr_Occurred())
1456 break;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001457 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001458 break;
1459 }
1460 v = PyList_GET_ITEM(p->refs, n);
1461 if (v == Py_None) {
1462 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001463 break;
1464 }
1465 Py_INCREF(v);
1466 retval = v;
1467 break;
1468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 default:
1470 /* Bogus data got written, which isn't ideal.
1471 This will let you keep working and recover. */
1472 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 break;
1474
1475 }
1476 p->depth--;
1477 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001478}
1479
Neal Norwitzd85c4522004-06-13 20:31:49 +00001480static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001481read_object(RFILE *p)
1482{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 PyObject *v;
1484 if (PyErr_Occurred()) {
1485 fprintf(stderr, "XXX readobject called with exception set\n");
1486 return NULL;
1487 }
1488 v = r_object(p);
1489 if (v == NULL && !PyErr_Occurred())
1490 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1491 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001492}
1493
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001494int
1495PyMarshal_ReadShortFromFile(FILE *fp)
1496{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001498 int res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001500 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 rf.fp = fp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001502 rf.end = rf.ptr = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001503 rf.buf = NULL;
1504 res = r_short(&rf);
1505 if (rf.buf != NULL)
1506 PyMem_FREE(rf.buf);
1507 return res;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001508}
1509
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001510long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001511PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001512{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001514 long res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001516 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001518 rf.buf = NULL;
1519 res = r_long(&rf);
1520 if (rf.buf != NULL)
1521 PyMem_FREE(rf.buf);
1522 return res;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001523}
1524
Steve Dowerf2f373f2015-02-21 08:44:05 -08001525/* Return size of file in bytes; < 0 if unknown or INT_MAX if too big */
Tim Peters691e0e92001-01-18 04:39:16 +00001526static off_t
1527getfilesize(FILE *fp)
1528{
Steve Dowerf2f373f2015-02-21 08:44:05 -08001529 struct _Py_stat_struct st;
Victor Stinnere134a7f2015-03-30 10:09:31 +02001530 if (_Py_fstat_noraise(fileno(fp), &st) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 return -1;
Steve Dowerf2f373f2015-02-21 08:44:05 -08001532#if SIZEOF_OFF_T == 4
1533 else if (st.st_size >= INT_MAX)
1534 return (off_t)INT_MAX;
1535#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 else
Steve Dowerf2f373f2015-02-21 08:44:05 -08001537 return (off_t)st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001538}
Tim Petersd9b9ac82001-01-28 00:27:39 +00001539
Tim Peters691e0e92001-01-18 04:39:16 +00001540/* If we can get the size of the file up-front, and it's reasonably small,
1541 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1542 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001543 * CAUTION: since this may read the entire remainder of the file, don't
1544 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001545 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001546PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001547PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001548{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001549/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001550#define REASONABLE_FILE_LIMIT (1L << 18)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 off_t filesize;
1552 filesize = getfilesize(fp);
1553 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1554 char* pBuf = (char *)PyMem_MALLOC(filesize);
1555 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001556 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1557 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 PyMem_FREE(pBuf);
1559 return v;
1560 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 /* We don't have fstat, or we do but the file is larger than
1564 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1565 */
1566 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001567
Tim Peters691e0e92001-01-18 04:39:16 +00001568#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001569}
1570
Guido van Rossum79f25d91997-04-29 20:08:16 +00001571PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001572PyMarshal_ReadObjectFromFile(FILE *fp)
1573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 RFILE rf;
1575 PyObject *result;
1576 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001577 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 rf.depth = 0;
1579 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001580 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001581 rf.refs = PyList_New(0);
1582 if (rf.refs == NULL)
1583 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001585 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001586 if (rf.buf != NULL)
1587 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001589}
1590
1591PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03001592PyMarshal_ReadObjectFromString(const char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001593{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 RFILE rf;
1595 PyObject *result;
1596 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001597 rf.readable = NULL;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001598 rf.ptr = (char *)str;
1599 rf.end = (char *)str + len;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001600 rf.buf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001602 rf.refs = PyList_New(0);
1603 if (rf.refs == NULL)
1604 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001606 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001607 if (rf.buf != NULL)
1608 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001610}
1611
Guido van Rossum79f25d91997-04-29 20:08:16 +00001612PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001613PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001616
Serhiy Storchakace921c622015-02-11 15:53:31 +02001617 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1619 if (wf.str == NULL)
1620 return NULL;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +02001621 wf.ptr = wf.buf = PyBytes_AS_STRING((PyBytesObject *)wf.str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 wf.end = wf.ptr + PyBytes_Size(wf.str);
1623 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 wf.version = version;
Serhiy Storchakace921c622015-02-11 15:53:31 +02001625 if (w_init_refs(&wf, version)) {
1626 Py_DECREF(wf.str);
1627 return NULL;
1628 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 w_object(x, &wf);
Serhiy Storchakace921c622015-02-11 15:53:31 +02001630 w_clear_refs(&wf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 if (wf.str != NULL) {
1632 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1633 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1634 Py_DECREF(wf.str);
1635 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001636 "too much marshal data for a bytes object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 return NULL;
1638 }
1639 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1640 return NULL;
1641 }
1642 if (wf.error != WFERR_OK) {
1643 Py_XDECREF(wf.str);
1644 if (wf.error == WFERR_NOMEMORY)
1645 PyErr_NoMemory();
1646 else
1647 PyErr_SetString(PyExc_ValueError,
1648 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1649 :"object too deeply nested to marshal");
1650 return NULL;
1651 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001652 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001653}
1654
Guido van Rossum64b45521991-06-07 13:58:22 +00001655/* And an interface for Python programs... */
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001656/*[clinic input]
1657marshal.dump
1658
1659 value: object
1660 Must be a supported type.
1661 file: object
1662 Must be a writeable binary file.
1663 version: int(c_default="Py_MARSHAL_VERSION") = version
1664 Indicates the data format that dump should use.
1665 /
1666
1667Write the value on the open file.
1668
1669If the value has (or contains an object that has) an unsupported type, a
1670ValueError exception is raised - but garbage data will also be written
1671to the file. The object will not be properly read back by load().
1672[clinic start generated code]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001673
Guido van Rossum79f25d91997-04-29 20:08:16 +00001674static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001675marshal_dump_impl(PyObject *module, PyObject *value, PyObject *file,
1676 int version)
1677/*[clinic end generated code: output=aaee62c7028a7cb2 input=6c7a3c23c6fef556]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001678{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 /* XXX Quick hack -- need to do this differently */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 PyObject *s;
1681 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001682 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001683
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001684 s = PyMarshal_WriteObjectToString(value, version);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 if (s == NULL)
1686 return NULL;
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001687 res = _PyObject_CallMethodIdObjArgs(file, &PyId_write, s, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 Py_DECREF(s);
1689 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001690}
1691
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001692/*[clinic input]
1693marshal.load
1694
1695 file: object
1696 Must be readable binary file.
1697 /
1698
1699Read one value from the open file and return it.
1700
1701If no valid value is read (e.g. because the data has a different Python
1702version's incompatible marshal format), raise EOFError, ValueError or
1703TypeError.
1704
1705Note: If an object containing an unsupported type was marshalled with
1706dump(), load() will substitute None for the unmarshallable type.
1707[clinic start generated code]*/
R. David Murraydd226ea2009-05-13 12:27:21 +00001708
Guido van Rossum79f25d91997-04-29 20:08:16 +00001709static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001710marshal_load(PyObject *module, PyObject *file)
1711/*[clinic end generated code: output=f8e5c33233566344 input=c85c2b594cd8124a]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001714 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001716
1717 /*
1718 * Make a call to the read method, but read zero bytes.
1719 * This is to ensure that the object passed in at least
1720 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001721 * This can be removed if we guarantee good error handling
1722 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001723 */
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001724 data = _PyObject_CallMethodId(file, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 if (data == NULL)
1726 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001727 if (!PyBytes_Check(data)) {
1728 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001729 "file.read() returned not bytes but %.100s",
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001730 data->ob_type->tp_name);
1731 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 }
1733 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001734 rf.depth = 0;
1735 rf.fp = NULL;
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001736 rf.readable = file;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001737 rf.ptr = rf.end = NULL;
1738 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001739 if ((rf.refs = PyList_New(0)) != NULL) {
1740 result = read_object(&rf);
1741 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001742 if (rf.buf != NULL)
1743 PyMem_FREE(rf.buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001744 } else
1745 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 Py_DECREF(data);
1748 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001749}
1750
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001751/*[clinic input]
1752marshal.dumps
R. David Murraydd226ea2009-05-13 12:27:21 +00001753
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001754 value: object
1755 Must be a supported type.
1756 version: int(c_default="Py_MARSHAL_VERSION") = version
1757 Indicates the data format that dumps should use.
1758 /
1759
1760Return the bytes object that would be written to a file by dump(value, file).
1761
1762Raise a ValueError exception if value has (or contains an object that has) an
1763unsupported type.
1764[clinic start generated code]*/
R. David Murraydd226ea2009-05-13 12:27:21 +00001765
Guido van Rossum79f25d91997-04-29 20:08:16 +00001766static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001767marshal_dumps_impl(PyObject *module, PyObject *value, int version)
1768/*[clinic end generated code: output=9c200f98d7256cad input=a2139ea8608e9b27]*/
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001769{
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001770 return PyMarshal_WriteObjectToString(value, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001771}
1772
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001773/*[clinic input]
1774marshal.loads
R. David Murraydd226ea2009-05-13 12:27:21 +00001775
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001776 bytes: Py_buffer
1777 /
1778
1779Convert the bytes-like object to a value.
1780
1781If no valid value is found, raise EOFError, ValueError or TypeError. Extra
1782bytes in the input are ignored.
1783[clinic start generated code]*/
R. David Murraydd226ea2009-05-13 12:27:21 +00001784
Guido van Rossum79f25d91997-04-29 20:08:16 +00001785static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001786marshal_loads_impl(PyObject *module, Py_buffer *bytes)
1787/*[clinic end generated code: output=9fc65985c93d1bb1 input=6f426518459c8495]*/
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001788{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 RFILE rf;
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001790 char *s = bytes->buf;
1791 Py_ssize_t n = bytes->len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 PyObject* result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001794 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 rf.ptr = s;
1796 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001798 if ((rf.refs = PyList_New(0)) == NULL)
1799 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 result = read_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001801 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001802 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001803}
1804
Guido van Rossum79f25d91997-04-29 20:08:16 +00001805static PyMethodDef marshal_methods[] = {
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001806 MARSHAL_DUMP_METHODDEF
1807 MARSHAL_LOAD_METHODDEF
1808 MARSHAL_DUMPS_METHODDEF
1809 MARSHAL_LOADS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001811};
1812
R. David Murraydd226ea2009-05-13 12:27:21 +00001813
1814PyDoc_STRVAR(module_doc,
1815"This module contains functions that can read and write Python values in\n\
1816a binary format. The format is specific to Python, but independent of\n\
1817machine architecture issues.\n\
1818\n\
1819Not all Python object types are supported; in general, only objects\n\
1820whose value is independent from a particular invocation of Python can be\n\
1821written and read by this module. The following types are supported:\n\
1822None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1823tuples, lists, sets, dictionaries, and code objects, where it\n\
1824should be understood that tuples, lists and dictionaries are only\n\
1825supported as long as the values contained therein are themselves\n\
1826supported; and recursive lists and dictionaries should not be written\n\
1827(they will cause infinite loops).\n\
1828\n\
1829Variables:\n\
1830\n\
1831version -- indicates the format that the module uses. Version 0 is the\n\
1832 historical format, version 1 shares interned strings and version 2\n\
1833 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001834 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001835\n\
1836Functions:\n\
1837\n\
1838dump() -- write value to a file\n\
1839load() -- read value from a file\n\
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001840dumps() -- marshal value as a bytes object\n\
1841loads() -- read value from a bytes-like object");
R. David Murraydd226ea2009-05-13 12:27:21 +00001842
1843
1844
Brett Cannon429ef652008-06-27 00:35:35 +00001845static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 PyModuleDef_HEAD_INIT,
1847 "marshal",
1848 module_doc,
1849 0,
1850 marshal_methods,
1851 NULL,
1852 NULL,
1853 NULL,
1854 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001855};
1856
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001857PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001858PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001859{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 PyObject *mod = PyModule_Create(&marshalmodule);
1861 if (mod == NULL)
1862 return NULL;
1863 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1864 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001865}