blob: 52932af225a48f65896620b8d84b94be396601f0 [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.
Steve Dower2a4a62b2018-06-04 13:25:00 -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 */
Steve Dower2a4a62b2018-06-04 13:25:00 -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
Serhiy Storchakac5734992018-07-24 10:55:47 +0300269static void
270w_float_bin(double v, WFILE *p)
271{
272 unsigned char buf[8];
273 if (_PyFloat_Pack8(v, buf, 1) < 0) {
274 p->error = WFERR_UNMARSHALLABLE;
275 return;
276 }
277 w_string((const char *)buf, 8, p);
278}
279
280static void
281w_float_str(double v, WFILE *p)
282{
283 int n;
284 char *buf = PyOS_double_to_string(v, 'g', 17, 0, NULL);
285 if (!buf) {
286 p->error = WFERR_NOMEMORY;
287 return;
288 }
289 n = (int)strlen(buf);
290 w_byte(n, p);
291 w_string(buf, n, p);
292 PyMem_Free(buf);
293}
294
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700295static int
296w_ref(PyObject *v, char *flag, WFILE *p)
297{
Serhiy Storchakace921c622015-02-11 15:53:31 +0200298 _Py_hashtable_entry_t *entry;
299 int w;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700300
Serhiy Storchakace921c622015-02-11 15:53:31 +0200301 if (p->version < 3 || p->hashtable == NULL)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700302 return 0; /* not writing object references */
303
304 /* if it has only one reference, it definitely isn't shared */
305 if (Py_REFCNT(v) == 1)
306 return 0;
307
Victor Stinner285cf0a2016-03-21 22:00:58 +0100308 entry = _Py_HASHTABLE_GET_ENTRY(p->hashtable, v);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200309 if (entry != NULL) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700310 /* write the reference index to the stream */
Victor Stinnere8c6b2f2016-03-23 09:25:01 +0100311 _Py_HASHTABLE_ENTRY_READ_DATA(p->hashtable, entry, w);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700312 /* we don't store "long" indices in the dict */
313 assert(0 <= w && w <= 0x7fffffff);
314 w_byte(TYPE_REF, p);
315 w_long(w, p);
316 return 1;
317 } else {
Serhiy Storchakace921c622015-02-11 15:53:31 +0200318 size_t s = p->hashtable->entries;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700319 /* we don't support long indices */
320 if (s >= 0x7fffffff) {
321 PyErr_SetString(PyExc_ValueError, "too many objects");
322 goto err;
323 }
Serhiy Storchaka26861b02015-02-16 20:52:17 +0200324 w = (int)s;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200325 Py_INCREF(v);
326 if (_Py_HASHTABLE_SET(p->hashtable, v, w) < 0) {
327 Py_DECREF(v);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700328 goto err;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200329 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700330 *flag |= FLAG_REF;
331 return 0;
332 }
333err:
334 p->error = WFERR_UNMARSHALLABLE;
335 return 1;
336}
337
338static void
339w_complex_object(PyObject *v, char flag, WFILE *p);
340
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000341static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000342w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000343{
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700344 char flag = '\0';
Fred Drake6da0b912000-06-28 18:47:56 +0000345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
349 p->error = WFERR_NESTEDTOODEEP;
350 }
351 else if (v == NULL) {
352 w_byte(TYPE_NULL, p);
353 }
354 else if (v == Py_None) {
355 w_byte(TYPE_NONE, p);
356 }
357 else if (v == PyExc_StopIteration) {
358 w_byte(TYPE_STOPITER, p);
359 }
360 else if (v == Py_Ellipsis) {
361 w_byte(TYPE_ELLIPSIS, p);
362 }
363 else if (v == Py_False) {
364 w_byte(TYPE_FALSE, p);
365 }
366 else if (v == Py_True) {
367 w_byte(TYPE_TRUE, p);
368 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700369 else if (!w_ref(v, &flag, p))
370 w_complex_object(v, flag, p);
371
372 p->depth--;
373}
374
375static void
376w_complex_object(PyObject *v, char flag, WFILE *p)
377{
378 Py_ssize_t i, n;
379
380 if (PyLong_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000381 long x = PyLong_AsLong(v);
382 if ((x == -1) && PyErr_Occurred()) {
383 PyLongObject *ob = (PyLongObject *)v;
384 PyErr_Clear();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700385 w_PyLong(ob, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 }
387 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000388#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
390 if (y && y != -1) {
Martin v. Löwis7e395722012-07-28 19:44:05 +0200391 /* Too large for TYPE_INT */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700392 w_PyLong((PyLongObject*)v, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 }
394 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000395#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700397 W_TYPE(TYPE_INT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 w_long(x, p);
399 }
400 }
401 }
402 else if (PyFloat_CheckExact(v)) {
403 if (p->version > 1) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700404 W_TYPE(TYPE_BINARY_FLOAT, p);
Serhiy Storchakac5734992018-07-24 10:55:47 +0300405 w_float_bin(PyFloat_AS_DOUBLE(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 }
407 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700408 W_TYPE(TYPE_FLOAT, p);
Serhiy Storchakac5734992018-07-24 10:55:47 +0300409 w_float_str(PyFloat_AS_DOUBLE(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 }
411 }
412 else if (PyComplex_CheckExact(v)) {
413 if (p->version > 1) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700414 W_TYPE(TYPE_BINARY_COMPLEX, p);
Serhiy Storchakac5734992018-07-24 10:55:47 +0300415 w_float_bin(PyComplex_RealAsDouble(v), p);
416 w_float_bin(PyComplex_ImagAsDouble(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 }
418 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700419 W_TYPE(TYPE_COMPLEX, p);
Serhiy Storchakac5734992018-07-24 10:55:47 +0300420 w_float_str(PyComplex_RealAsDouble(v), p);
421 w_float_str(PyComplex_ImagAsDouble(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422 }
423 }
424 else if (PyBytes_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700425 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300426 w_pstring(PyBytes_AS_STRING(v), PyBytes_GET_SIZE(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 }
428 else if (PyUnicode_CheckExact(v)) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200429 if (p->version >= 4 && PyUnicode_IS_ASCII(v)) {
430 int is_short = PyUnicode_GET_LENGTH(v) < 256;
431 if (is_short) {
432 if (PyUnicode_CHECK_INTERNED(v))
433 W_TYPE(TYPE_SHORT_ASCII_INTERNED, p);
434 else
435 W_TYPE(TYPE_SHORT_ASCII, p);
436 w_short_pstring((char *) PyUnicode_1BYTE_DATA(v),
437 PyUnicode_GET_LENGTH(v), p);
438 }
439 else {
440 if (PyUnicode_CHECK_INTERNED(v))
441 W_TYPE(TYPE_ASCII_INTERNED, p);
442 else
443 W_TYPE(TYPE_ASCII, p);
444 w_pstring((char *) PyUnicode_1BYTE_DATA(v),
445 PyUnicode_GET_LENGTH(v), p);
446 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200448 else {
449 PyObject *utf8;
450 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");
451 if (utf8 == NULL) {
452 p->depth--;
453 p->error = WFERR_UNMARSHALLABLE;
454 return;
455 }
456 if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v))
457 W_TYPE(TYPE_INTERNED, p);
458 else
459 W_TYPE(TYPE_UNICODE, p);
460 w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p);
461 Py_DECREF(utf8);
462 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 }
464 else if (PyTuple_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 n = PyTuple_Size(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200466 if (p->version >= 4 && n < 256) {
467 W_TYPE(TYPE_SMALL_TUPLE, p);
Victor Stinnerda062552013-11-16 00:13:29 +0100468 w_byte((unsigned char)n, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200469 }
470 else {
471 W_TYPE(TYPE_TUPLE, p);
472 W_SIZE(n, p);
473 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 for (i = 0; i < n; i++) {
475 w_object(PyTuple_GET_ITEM(v, i), p);
476 }
477 }
478 else if (PyList_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700479 W_TYPE(TYPE_LIST, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 n = PyList_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200481 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 for (i = 0; i < n; i++) {
483 w_object(PyList_GET_ITEM(v, i), p);
484 }
485 }
486 else if (PyDict_CheckExact(v)) {
487 Py_ssize_t pos;
488 PyObject *key, *value;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700489 W_TYPE(TYPE_DICT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 /* This one is NULL object terminated! */
491 pos = 0;
492 while (PyDict_Next(v, &pos, &key, &value)) {
493 w_object(key, p);
494 w_object(value, p);
495 }
496 w_object((PyObject *)NULL, p);
497 }
498 else if (PyAnySet_CheckExact(v)) {
499 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 if (PyObject_TypeCheck(v, &PySet_Type))
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700502 W_TYPE(TYPE_SET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 else
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700504 W_TYPE(TYPE_FROZENSET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 n = PyObject_Size(v);
506 if (n == -1) {
507 p->depth--;
508 p->error = WFERR_UNMARSHALLABLE;
509 return;
510 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200511 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 it = PyObject_GetIter(v);
513 if (it == NULL) {
514 p->depth--;
515 p->error = WFERR_UNMARSHALLABLE;
516 return;
517 }
518 while ((value = PyIter_Next(it)) != NULL) {
519 w_object(value, p);
520 Py_DECREF(value);
521 }
522 Py_DECREF(it);
523 if (PyErr_Occurred()) {
524 p->depth--;
525 p->error = WFERR_UNMARSHALLABLE;
526 return;
527 }
528 }
529 else if (PyCode_Check(v)) {
530 PyCodeObject *co = (PyCodeObject *)v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700531 W_TYPE(TYPE_CODE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 w_long(co->co_argcount, p);
533 w_long(co->co_kwonlyargcount, p);
534 w_long(co->co_nlocals, p);
535 w_long(co->co_stacksize, p);
536 w_long(co->co_flags, p);
537 w_object(co->co_code, p);
538 w_object(co->co_consts, p);
539 w_object(co->co_names, p);
540 w_object(co->co_varnames, p);
541 w_object(co->co_freevars, p);
542 w_object(co->co_cellvars, p);
543 w_object(co->co_filename, p);
544 w_object(co->co_name, p);
545 w_long(co->co_firstlineno, p);
546 w_object(co->co_lnotab, p);
547 }
548 else if (PyObject_CheckBuffer(v)) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +0200549 /* Write unknown bytes-like objects as a bytes object */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100551 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100553 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100555 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700557 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300558 w_pstring(view.buf, view.len, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100559 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 }
561 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700562 W_TYPE(TYPE_UNKNOWN, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 p->error = WFERR_UNMARSHALLABLE;
564 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000565}
566
Serhiy Storchakace921c622015-02-11 15:53:31 +0200567static int
568w_init_refs(WFILE *wf, int version)
569{
570 if (version >= 3) {
Victor Stinner285cf0a2016-03-21 22:00:58 +0100571 wf->hashtable = _Py_hashtable_new(sizeof(PyObject *), sizeof(int),
572 _Py_hashtable_hash_ptr,
Serhiy Storchakace921c622015-02-11 15:53:31 +0200573 _Py_hashtable_compare_direct);
574 if (wf->hashtable == NULL) {
575 PyErr_NoMemory();
576 return -1;
577 }
578 }
579 return 0;
580}
581
582static int
Victor Stinner285cf0a2016-03-21 22:00:58 +0100583w_decref_entry(_Py_hashtable_t *ht, _Py_hashtable_entry_t *entry,
584 void *Py_UNUSED(data))
Serhiy Storchakace921c622015-02-11 15:53:31 +0200585{
Victor Stinner285cf0a2016-03-21 22:00:58 +0100586 PyObject *entry_key;
587
Victor Stinner5dacbd42016-03-23 09:52:13 +0100588 _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, entry_key);
Victor Stinner285cf0a2016-03-21 22:00:58 +0100589 Py_XDECREF(entry_key);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200590 return 0;
591}
592
593static void
594w_clear_refs(WFILE *wf)
595{
596 if (wf->hashtable != NULL) {
597 _Py_hashtable_foreach(wf->hashtable, w_decref_entry, NULL);
598 _Py_hashtable_destroy(wf->hashtable);
599 }
600}
601
Serhiy Storchaka95949422013-08-27 19:40:23 +0300602/* version currently has no effect for writing ints. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000603void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000604PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000605{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200606 char buf[4];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 WFILE wf;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200608 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 wf.fp = fp;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200610 wf.ptr = wf.buf = buf;
611 wf.end = wf.ptr + sizeof(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 wf.version = version;
614 w_long(x, &wf);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200615 w_flush(&wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000616}
617
618void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000619PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000620{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200621 char buf[BUFSIZ];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 WFILE wf;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200623 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 wf.fp = fp;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200625 wf.ptr = wf.buf = buf;
626 wf.end = wf.ptr + sizeof(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 wf.version = version;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200629 if (w_init_refs(&wf, version))
630 return; /* caller mush check PyErr_Occurred() */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 w_object(x, &wf);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200632 w_clear_refs(&wf);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200633 w_flush(&wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000634}
635
Serhiy Storchakac07422c2015-02-11 16:18:09 +0200636typedef struct {
637 FILE *fp;
638 int depth;
639 PyObject *readable; /* Stream-like object being read from */
Serhiy Storchakac07422c2015-02-11 16:18:09 +0200640 char *ptr;
641 char *end;
642 char *buf;
643 Py_ssize_t buf_size;
644 PyObject *refs; /* a list */
645} RFILE;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000646
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200647static const char *
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200648r_string(Py_ssize_t n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000649{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200650 Py_ssize_t read = -1;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100651
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200652 if (p->ptr != NULL) {
653 /* Fast path for loads() */
654 char *res = p->ptr;
655 Py_ssize_t left = p->end - p->ptr;
656 if (left < n) {
657 PyErr_SetString(PyExc_EOFError,
658 "marshal data too short");
659 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100660 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200661 p->ptr += n;
662 return res;
663 }
664 if (p->buf == NULL) {
665 p->buf = PyMem_MALLOC(n);
666 if (p->buf == NULL) {
667 PyErr_NoMemory();
668 return NULL;
669 }
670 p->buf_size = n;
671 }
672 else if (p->buf_size < n) {
Zackery Spytz4c49da02018-12-07 03:11:30 -0700673 char *tmp = PyMem_REALLOC(p->buf, n);
674 if (tmp == NULL) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200675 PyErr_NoMemory();
676 return NULL;
677 }
Zackery Spytz4c49da02018-12-07 03:11:30 -0700678 p->buf = tmp;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200679 p->buf_size = n;
680 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100681
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200682 if (!p->readable) {
683 assert(p->fp != NULL);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200684 read = fread(p->buf, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100685 }
686 else {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200687 _Py_IDENTIFIER(readinto);
688 PyObject *res, *mview;
689 Py_buffer buf;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200690
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200691 if (PyBuffer_FillInfo(&buf, NULL, p->buf, n, 0, PyBUF_CONTIG) == -1)
692 return NULL;
693 mview = PyMemoryView_FromBuffer(&buf);
694 if (mview == NULL)
695 return NULL;
696
697 res = _PyObject_CallMethodId(p->readable, &PyId_readinto, "N", mview);
698 if (res != NULL) {
699 read = PyNumber_AsSsize_t(res, PyExc_ValueError);
700 Py_DECREF(res);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100701 }
702 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200703 if (read != n) {
704 if (!PyErr_Occurred()) {
705 if (read > n)
706 PyErr_Format(PyExc_ValueError,
707 "read() returned too much data: "
708 "%zd bytes requested, %zd returned",
709 n, read);
710 else
711 PyErr_SetString(PyExc_EOFError,
712 "EOF read where not expected");
713 }
714 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100715 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200716 return p->buf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100717}
718
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100719static int
720r_byte(RFILE *p)
721{
722 int c = EOF;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100723
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200724 if (p->ptr != NULL) {
725 if (p->ptr < p->end)
726 c = (unsigned char) *p->ptr++;
727 return c;
728 }
729 if (!p->readable) {
730 assert(p->fp);
731 c = getc(p->fp);
732 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100733 else {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200734 const char *ptr = r_string(1, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200735 if (ptr != NULL)
736 c = *(unsigned char *) ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100737 }
738 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000739}
740
741static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000742r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000743{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200744 short x = -1;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200745 const unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100746
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200747 buffer = (const unsigned char *) r_string(2, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200748 if (buffer != NULL) {
749 x = buffer[0];
750 x |= buffer[1] << 8;
751 /* Sign-extension, in case short greater than 16 bits */
752 x |= -(x & 0x8000);
753 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000755}
756
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000757static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000758r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000759{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200760 long x = -1;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200761 const unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100762
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200763 buffer = (const unsigned char *) r_string(4, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200764 if (buffer != NULL) {
765 x = buffer[0];
766 x |= (long)buffer[1] << 8;
767 x |= (long)buffer[2] << 16;
768 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000769#if SIZEOF_LONG > 4
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200770 /* Sign extension for 64-bit machines */
771 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000772#endif
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200773 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000775}
776
Serhiy Storchaka00987f62017-11-15 17:41:05 +0200777/* r_long64 deals with the TYPE_INT64 code. */
778static PyObject *
779r_long64(RFILE *p)
780{
781 const unsigned char *buffer = (const unsigned char *) r_string(8, p);
782 if (buffer == NULL) {
783 return NULL;
784 }
785 return _PyLong_FromByteArray(buffer, 8,
786 1 /* little endian */,
787 1 /* signed */);
788}
789
Guido van Rossum79f25d91997-04-29 20:08:16 +0000790static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000791r_PyLong(RFILE *p)
792{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200794 long n, size, i;
795 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100799 if (PyErr_Occurred())
800 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 if (n == 0)
802 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200803 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 PyErr_SetString(PyExc_ValueError,
805 "bad marshal data (long size out of range)");
806 return NULL;
807 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000808
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200809 size = 1 + (Py_ABS(n) - 1) / PyLong_MARSHAL_RATIO;
810 shorts_in_top_digit = 1 + (Py_ABS(n) - 1) % PyLong_MARSHAL_RATIO;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 ob = _PyLong_New(size);
812 if (ob == NULL)
813 return NULL;
Victor Stinner763b0d12013-10-31 16:56:38 +0100814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 for (i = 0; i < size-1; i++) {
818 d = 0;
819 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
820 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100821 if (PyErr_Occurred()) {
822 Py_DECREF(ob);
823 return NULL;
824 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 if (md < 0 || md > PyLong_MARSHAL_BASE)
826 goto bad_digit;
827 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
828 }
829 ob->ob_digit[i] = d;
830 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 d = 0;
833 for (j=0; j < shorts_in_top_digit; j++) {
834 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100835 if (PyErr_Occurred()) {
836 Py_DECREF(ob);
837 return NULL;
838 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 if (md < 0 || md > PyLong_MARSHAL_BASE)
840 goto bad_digit;
841 /* topmost marshal digit should be nonzero */
842 if (md == 0 && j == shorts_in_top_digit - 1) {
843 Py_DECREF(ob);
844 PyErr_SetString(PyExc_ValueError,
845 "bad marshal data (unnormalized long data)");
846 return NULL;
847 }
848 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
849 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100850 if (PyErr_Occurred()) {
851 Py_DECREF(ob);
852 return NULL;
853 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 /* top digit should be nonzero, else the resulting PyLong won't be
855 normalized */
856 ob->ob_digit[size-1] = d;
857 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000858 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 Py_DECREF(ob);
860 PyErr_SetString(PyExc_ValueError,
861 "bad marshal data (digit out of range in long)");
862 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000863}
864
Serhiy Storchakac5734992018-07-24 10:55:47 +0300865static double
866r_float_bin(RFILE *p)
867{
868 const unsigned char *buf = (const unsigned char *) r_string(8, p);
869 if (buf == NULL)
870 return -1;
871 return _PyFloat_Unpack8(buf, 1);
872}
873
874/* Issue #33720: Disable inlining for reducing the C stack consumption
875 on PGO builds. */
876_Py_NO_INLINE static double
877r_float_str(RFILE *p)
878{
879 int n;
880 char buf[256];
881 const char *ptr;
882 n = r_byte(p);
883 if (n == EOF) {
884 PyErr_SetString(PyExc_EOFError,
885 "EOF read where object expected");
886 return -1;
887 }
888 ptr = r_string(n, p);
889 if (ptr == NULL) {
890 return -1;
891 }
892 memcpy(buf, ptr, n);
893 buf[n] = '\0';
894 return PyOS_string_to_double(buf, NULL, NULL);
895}
896
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700897/* allocate the reflist index for a new object. Return -1 on failure */
898static Py_ssize_t
899r_ref_reserve(int flag, RFILE *p)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700900{
901 if (flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200902 Py_ssize_t idx = PyList_GET_SIZE(p->refs);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700903 if (idx >= 0x7ffffffe) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700904 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700905 return -1;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700906 }
907 if (PyList_Append(p->refs, Py_None) < 0)
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700908 return -1;
909 return idx;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700910 } else
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700911 return 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700912}
913
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700914/* insert the new object 'o' to the reflist at previously
915 * allocated index 'idx'.
916 * 'o' can be NULL, in which case nothing is done.
917 * if 'o' was non-NULL, and the function succeeds, 'o' is returned.
918 * if 'o' was non-NULL, and the function fails, 'o' is released and
919 * NULL returned. This simplifies error checking at the call site since
920 * a single test for NULL for the function result is enough.
921 */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700922static PyObject *
923r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
924{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700925 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200926 PyObject *tmp = PyList_GET_ITEM(p->refs, idx);
927 Py_INCREF(o);
928 PyList_SET_ITEM(p->refs, idx, o);
929 Py_DECREF(tmp);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700930 }
931 return o;
932}
933
934/* combination of both above, used when an object can be
935 * created whenever it is seen in the file, as opposed to
936 * after having loaded its sub-objects.
937 */
938static PyObject *
939r_ref(PyObject *o, int flag, RFILE *p)
940{
Victor Stinner359fabc2013-10-31 17:09:01 +0100941 assert(flag & FLAG_REF);
942 if (o == NULL)
943 return NULL;
944 if (PyList_Append(p->refs, o) < 0) {
945 Py_DECREF(o); /* release the new object */
946 return NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700947 }
948 return o;
949}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000950
951static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000952r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 /* NULL is a valid return value, it does not necessarily means that
955 an exception is set. */
956 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500957 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700959 int type, code = r_byte(p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200960 int flag, is_interned = 0;
Christian Heimes35728422013-10-13 02:29:06 +0200961 PyObject *retval = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000962
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700963 if (code == EOF) {
964 PyErr_SetString(PyExc_EOFError,
965 "EOF read where object expected");
966 return NULL;
967 }
968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
972 p->depth--;
973 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
974 return NULL;
975 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000976
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700977 flag = code & FLAG_REF;
978 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700979
980#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700981 if (flag) \
982 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700983} while (0)
984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 case TYPE_NULL:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 case TYPE_NONE:
991 Py_INCREF(Py_None);
992 retval = Py_None;
993 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 case TYPE_STOPITER:
996 Py_INCREF(PyExc_StopIteration);
997 retval = PyExc_StopIteration;
998 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 case TYPE_ELLIPSIS:
1001 Py_INCREF(Py_Ellipsis);
1002 retval = Py_Ellipsis;
1003 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 case TYPE_FALSE:
1006 Py_INCREF(Py_False);
1007 retval = Py_False;
1008 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +00001009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 case TYPE_TRUE:
1011 Py_INCREF(Py_True);
1012 retval = Py_True;
1013 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +00001014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001016 n = r_long(p);
1017 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001018 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001020
Serhiy Storchaka00987f62017-11-15 17:41:05 +02001021 case TYPE_INT64:
1022 retval = r_long64(p);
1023 R_REF(retval);
1024 break;
1025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 case TYPE_LONG:
1027 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001028 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 case TYPE_FLOAT:
1032 {
Serhiy Storchakac5734992018-07-24 10:55:47 +03001033 double x = r_float_str(p);
1034 if (x == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 break;
Serhiy Storchakac5734992018-07-24 10:55:47 +03001036 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001037 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 break;
1039 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 case TYPE_BINARY_FLOAT:
1042 {
Serhiy Storchakac5734992018-07-24 10:55:47 +03001043 double x = r_float_bin(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001044 if (x == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001047 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 break;
1049 }
Michael W. Hudsondf888462005-06-03 14:41:55 +00001050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 case TYPE_COMPLEX:
1052 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 Py_complex c;
Serhiy Storchakac5734992018-07-24 10:55:47 +03001054 c.real = r_float_str(p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 if (c.real == -1.0 && PyErr_Occurred())
1056 break;
Serhiy Storchakac5734992018-07-24 10:55:47 +03001057 c.imag = r_float_str(p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 if (c.imag == -1.0 && PyErr_Occurred())
1059 break;
1060 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001061 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 break;
1063 }
Michael W. Hudsondf888462005-06-03 14:41:55 +00001064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 case TYPE_BINARY_COMPLEX:
1066 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 Py_complex c;
Serhiy Storchakac5734992018-07-24 10:55:47 +03001068 c.real = r_float_bin(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001069 if (c.real == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 break;
Serhiy Storchakac5734992018-07-24 10:55:47 +03001071 c.imag = r_float_bin(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001072 if (c.imag == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001075 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 break;
1077 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 case TYPE_STRING:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001080 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001081 const char *ptr;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001082 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001083 if (PyErr_Occurred())
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001084 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001085 if (n < 0 || n > SIZE32_MAX) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001086 PyErr_SetString(PyExc_ValueError, "bad marshal data (bytes object size out of range)");
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001087 break;
1088 }
1089 v = PyBytes_FromStringAndSize((char *)NULL, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001090 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001091 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001092 ptr = r_string(n, p);
1093 if (ptr == NULL) {
1094 Py_DECREF(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001095 break;
1096 }
1097 memcpy(PyBytes_AS_STRING(v), ptr, n);
1098 retval = v;
1099 R_REF(retval);
1100 break;
1101 }
1102
1103 case TYPE_ASCII_INTERNED:
1104 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001105 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001106 case TYPE_ASCII:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001108 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001109 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001110 if (n < 0 || n > SIZE32_MAX) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001111 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 break;
1113 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001114 goto _read_ascii;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001115
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001116 case TYPE_SHORT_ASCII_INTERNED:
1117 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001118 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001119 case TYPE_SHORT_ASCII:
1120 n = r_byte(p);
1121 if (n == EOF) {
1122 PyErr_SetString(PyExc_EOFError,
1123 "EOF read where object expected");
1124 break;
1125 }
1126 _read_ascii:
1127 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001128 const char *ptr;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001129 ptr = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001130 if (ptr == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001131 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001132 v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001133 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001134 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001135 if (is_interned)
1136 PyUnicode_InternInPlace(&v);
1137 retval = v;
1138 R_REF(retval);
1139 break;
1140 }
1141
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001142 case TYPE_INTERNED:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001143 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001144 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001145 case TYPE_UNICODE:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001147 const char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +00001148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001150 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001151 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001152 if (n < 0 || n > SIZE32_MAX) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001153 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 break;
1155 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001156 if (n != 0) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001157 buffer = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001158 if (buffer == NULL)
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001159 break;
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001160 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001162 else {
1163 v = PyUnicode_New(0, 0);
1164 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001165 if (v == NULL)
Victor Stinner3a8b79d2013-07-08 22:23:32 +02001166 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001167 if (is_interned)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001168 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001170 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 break;
1172 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001173
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001174 case TYPE_SMALL_TUPLE:
1175 n = (unsigned char) r_byte(p);
Victor Stinnerb1b7b182013-10-31 17:07:08 +01001176 if (PyErr_Occurred())
1177 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001178 goto _read_tuple;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 case TYPE_TUPLE:
1180 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001181 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001182 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001183 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 break;
1186 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001187 _read_tuple:
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001188 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001189 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001190 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 break;
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 for (i = 0; i < n; i++) {
1194 v2 = r_object(p);
1195 if ( v2 == NULL ) {
1196 if (!PyErr_Occurred())
1197 PyErr_SetString(PyExc_TypeError,
1198 "NULL object in marshal data for tuple");
1199 Py_DECREF(v);
1200 v = NULL;
1201 break;
1202 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001203 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 }
1205 retval = v;
1206 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 case TYPE_LIST:
1209 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001210 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001211 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001212 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 break;
1215 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001216 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001217 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001218 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 for (i = 0; i < n; i++) {
1221 v2 = r_object(p);
1222 if ( v2 == NULL ) {
1223 if (!PyErr_Occurred())
1224 PyErr_SetString(PyExc_TypeError,
1225 "NULL object in marshal data for list");
1226 Py_DECREF(v);
1227 v = NULL;
1228 break;
1229 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001230 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 }
1232 retval = v;
1233 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 case TYPE_DICT:
1236 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001237 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001238 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 for (;;) {
1241 PyObject *key, *val;
1242 key = r_object(p);
1243 if (key == NULL)
1244 break;
1245 val = r_object(p);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001246 if (val == NULL) {
1247 Py_DECREF(key);
1248 break;
1249 }
1250 if (PyDict_SetItem(v, key, val) < 0) {
1251 Py_DECREF(key);
1252 Py_DECREF(val);
1253 break;
1254 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 Py_DECREF(key);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001256 Py_DECREF(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 }
1258 if (PyErr_Occurred()) {
1259 Py_DECREF(v);
1260 v = NULL;
1261 }
1262 retval = v;
1263 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 case TYPE_SET:
1266 case TYPE_FROZENSET:
1267 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001268 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001269 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001270 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 break;
1273 }
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001274
Victor Stinner1aa78932016-01-23 14:15:48 +01001275 if (n == 0 && type == TYPE_FROZENSET) {
1276 /* call frozenset() to get the empty frozenset singleton */
Victor Stinner4778eab2016-12-01 14:51:04 +01001277 v = _PyObject_CallNoArg((PyObject*)&PyFrozenSet_Type);
Victor Stinner1aa78932016-01-23 14:15:48 +01001278 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 break;
Victor Stinner1aa78932016-01-23 14:15:48 +01001280 R_REF(v);
1281 retval = v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 }
Victor Stinner1aa78932016-01-23 14:15:48 +01001283 else {
1284 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
1285 if (type == TYPE_SET) {
1286 R_REF(v);
1287 } else {
1288 /* must use delayed registration of frozensets because they must
1289 * be init with a refcount of 1
1290 */
1291 idx = r_ref_reserve(flag, p);
1292 if (idx < 0)
1293 Py_CLEAR(v); /* signal error */
1294 }
1295 if (v == NULL)
1296 break;
1297
1298 for (i = 0; i < n; i++) {
1299 v2 = r_object(p);
1300 if ( v2 == NULL ) {
1301 if (!PyErr_Occurred())
1302 PyErr_SetString(PyExc_TypeError,
1303 "NULL object in marshal data for set");
1304 Py_DECREF(v);
1305 v = NULL;
1306 break;
1307 }
1308 if (PySet_Add(v, v2) == -1) {
1309 Py_DECREF(v);
1310 Py_DECREF(v2);
1311 v = NULL;
1312 break;
1313 }
1314 Py_DECREF(v2);
1315 }
1316 if (type != TYPE_SET)
1317 v = r_ref_insert(v, idx, flag, p);
1318 retval = v;
1319 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 case TYPE_CODE:
1323 {
1324 int argcount;
1325 int kwonlyargcount;
1326 int nlocals;
1327 int stacksize;
1328 int flags;
1329 PyObject *code = NULL;
1330 PyObject *consts = NULL;
1331 PyObject *names = NULL;
1332 PyObject *varnames = NULL;
1333 PyObject *freevars = NULL;
1334 PyObject *cellvars = NULL;
1335 PyObject *filename = NULL;
1336 PyObject *name = NULL;
1337 int firstlineno;
1338 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001339
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001340 idx = r_ref_reserve(flag, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001341 if (idx < 0)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001342 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 /* XXX ignore long->int overflows for now */
1347 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001348 if (PyErr_Occurred())
1349 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001351 if (PyErr_Occurred())
1352 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001354 if (PyErr_Occurred())
1355 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001357 if (PyErr_Occurred())
1358 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001360 if (PyErr_Occurred())
1361 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 code = r_object(p);
1363 if (code == NULL)
1364 goto code_error;
1365 consts = r_object(p);
1366 if (consts == NULL)
1367 goto code_error;
1368 names = r_object(p);
1369 if (names == NULL)
1370 goto code_error;
1371 varnames = r_object(p);
1372 if (varnames == NULL)
1373 goto code_error;
1374 freevars = r_object(p);
1375 if (freevars == NULL)
1376 goto code_error;
1377 cellvars = r_object(p);
1378 if (cellvars == NULL)
1379 goto code_error;
1380 filename = r_object(p);
1381 if (filename == NULL)
1382 goto code_error;
1383 name = r_object(p);
1384 if (name == NULL)
1385 goto code_error;
1386 firstlineno = (int)r_long(p);
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001387 if (firstlineno == -1 && PyErr_Occurred())
1388 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 lnotab = r_object(p);
1390 if (lnotab == NULL)
1391 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 v = (PyObject *) PyCode_New(
1394 argcount, kwonlyargcount,
1395 nlocals, stacksize, flags,
1396 code, consts, names, varnames,
1397 freevars, cellvars, filename, name,
1398 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001399 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 code_error:
1402 Py_XDECREF(code);
1403 Py_XDECREF(consts);
1404 Py_XDECREF(names);
1405 Py_XDECREF(varnames);
1406 Py_XDECREF(freevars);
1407 Py_XDECREF(cellvars);
1408 Py_XDECREF(filename);
1409 Py_XDECREF(name);
1410 Py_XDECREF(lnotab);
1411 }
1412 retval = v;
1413 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001414
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001415 case TYPE_REF:
1416 n = r_long(p);
1417 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001418 if (n == -1 && PyErr_Occurred())
1419 break;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001420 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001421 break;
1422 }
1423 v = PyList_GET_ITEM(p->refs, n);
1424 if (v == Py_None) {
1425 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001426 break;
1427 }
1428 Py_INCREF(v);
1429 retval = v;
1430 break;
1431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 default:
1433 /* Bogus data got written, which isn't ideal.
1434 This will let you keep working and recover. */
1435 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 break;
1437
1438 }
1439 p->depth--;
1440 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001441}
1442
Neal Norwitzd85c4522004-06-13 20:31:49 +00001443static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001444read_object(RFILE *p)
1445{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 PyObject *v;
1447 if (PyErr_Occurred()) {
1448 fprintf(stderr, "XXX readobject called with exception set\n");
1449 return NULL;
1450 }
1451 v = r_object(p);
1452 if (v == NULL && !PyErr_Occurred())
1453 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1454 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001455}
1456
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001457int
1458PyMarshal_ReadShortFromFile(FILE *fp)
1459{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001461 int res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001463 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 rf.fp = fp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465 rf.end = rf.ptr = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001466 rf.buf = NULL;
1467 res = r_short(&rf);
1468 if (rf.buf != NULL)
1469 PyMem_FREE(rf.buf);
1470 return res;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001471}
1472
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001473long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001474PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001475{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001477 long res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001479 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001481 rf.buf = NULL;
1482 res = r_long(&rf);
1483 if (rf.buf != NULL)
1484 PyMem_FREE(rf.buf);
1485 return res;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001486}
1487
Steve Dowerf2f373f2015-02-21 08:44:05 -08001488/* Return size of file in bytes; < 0 if unknown or INT_MAX if too big */
Tim Peters691e0e92001-01-18 04:39:16 +00001489static off_t
1490getfilesize(FILE *fp)
1491{
Steve Dowerf2f373f2015-02-21 08:44:05 -08001492 struct _Py_stat_struct st;
Victor Stinnere134a7f2015-03-30 10:09:31 +02001493 if (_Py_fstat_noraise(fileno(fp), &st) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 return -1;
Steve Dowerf2f373f2015-02-21 08:44:05 -08001495#if SIZEOF_OFF_T == 4
1496 else if (st.st_size >= INT_MAX)
1497 return (off_t)INT_MAX;
1498#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 else
Steve Dowerf2f373f2015-02-21 08:44:05 -08001500 return (off_t)st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001501}
Tim Petersd9b9ac82001-01-28 00:27:39 +00001502
Tim Peters691e0e92001-01-18 04:39:16 +00001503/* If we can get the size of the file up-front, and it's reasonably small,
1504 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1505 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001506 * CAUTION: since this may read the entire remainder of the file, don't
1507 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001508 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001509PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001510PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001511{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001512/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001513#define REASONABLE_FILE_LIMIT (1L << 18)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 off_t filesize;
1515 filesize = getfilesize(fp);
1516 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1517 char* pBuf = (char *)PyMem_MALLOC(filesize);
1518 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001519 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1520 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 PyMem_FREE(pBuf);
1522 return v;
1523 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 /* We don't have fstat, or we do but the file is larger than
1527 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1528 */
1529 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001530
Tim Peters691e0e92001-01-18 04:39:16 +00001531#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001532}
1533
Guido van Rossum79f25d91997-04-29 20:08:16 +00001534PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001535PyMarshal_ReadObjectFromFile(FILE *fp)
1536{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 RFILE rf;
1538 PyObject *result;
1539 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001540 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 rf.depth = 0;
1542 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001543 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001544 rf.refs = PyList_New(0);
1545 if (rf.refs == NULL)
1546 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001548 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001549 if (rf.buf != NULL)
1550 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001552}
1553
1554PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03001555PyMarshal_ReadObjectFromString(const char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001556{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 RFILE rf;
1558 PyObject *result;
1559 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001560 rf.readable = NULL;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001561 rf.ptr = (char *)str;
1562 rf.end = (char *)str + len;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001563 rf.buf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001565 rf.refs = PyList_New(0);
1566 if (rf.refs == NULL)
1567 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001569 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001570 if (rf.buf != NULL)
1571 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001573}
1574
Guido van Rossum79f25d91997-04-29 20:08:16 +00001575PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001576PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001577{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001579
Serhiy Storchakace921c622015-02-11 15:53:31 +02001580 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1582 if (wf.str == NULL)
1583 return NULL;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +02001584 wf.ptr = wf.buf = PyBytes_AS_STRING((PyBytesObject *)wf.str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 wf.end = wf.ptr + PyBytes_Size(wf.str);
1586 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 wf.version = version;
Serhiy Storchakace921c622015-02-11 15:53:31 +02001588 if (w_init_refs(&wf, version)) {
1589 Py_DECREF(wf.str);
1590 return NULL;
1591 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 w_object(x, &wf);
Serhiy Storchakace921c622015-02-11 15:53:31 +02001593 w_clear_refs(&wf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 if (wf.str != NULL) {
1595 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1596 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1597 Py_DECREF(wf.str);
1598 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001599 "too much marshal data for a bytes object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 return NULL;
1601 }
1602 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1603 return NULL;
1604 }
1605 if (wf.error != WFERR_OK) {
1606 Py_XDECREF(wf.str);
1607 if (wf.error == WFERR_NOMEMORY)
1608 PyErr_NoMemory();
1609 else
1610 PyErr_SetString(PyExc_ValueError,
1611 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1612 :"object too deeply nested to marshal");
1613 return NULL;
1614 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001615 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001616}
1617
Guido van Rossum64b45521991-06-07 13:58:22 +00001618/* And an interface for Python programs... */
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001619/*[clinic input]
1620marshal.dump
1621
1622 value: object
1623 Must be a supported type.
1624 file: object
1625 Must be a writeable binary file.
1626 version: int(c_default="Py_MARSHAL_VERSION") = version
1627 Indicates the data format that dump should use.
1628 /
1629
1630Write the value on the open file.
1631
1632If the value has (or contains an object that has) an unsupported type, a
1633ValueError exception is raised - but garbage data will also be written
1634to the file. The object will not be properly read back by load().
1635[clinic start generated code]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001636
Guido van Rossum79f25d91997-04-29 20:08:16 +00001637static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001638marshal_dump_impl(PyObject *module, PyObject *value, PyObject *file,
1639 int version)
1640/*[clinic end generated code: output=aaee62c7028a7cb2 input=6c7a3c23c6fef556]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001641{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 /* XXX Quick hack -- need to do this differently */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 PyObject *s;
1644 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001645 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001646
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001647 s = PyMarshal_WriteObjectToString(value, version);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001648 if (s == NULL)
1649 return NULL;
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001650 res = _PyObject_CallMethodIdObjArgs(file, &PyId_write, s, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 Py_DECREF(s);
1652 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001653}
1654
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001655/*[clinic input]
1656marshal.load
1657
1658 file: object
1659 Must be readable binary file.
1660 /
1661
1662Read one value from the open file and return it.
1663
1664If no valid value is read (e.g. because the data has a different Python
1665version's incompatible marshal format), raise EOFError, ValueError or
1666TypeError.
1667
1668Note: If an object containing an unsupported type was marshalled with
1669dump(), load() will substitute None for the unmarshallable type.
1670[clinic start generated code]*/
R. David Murraydd226ea2009-05-13 12:27:21 +00001671
Guido van Rossum79f25d91997-04-29 20:08:16 +00001672static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001673marshal_load(PyObject *module, PyObject *file)
1674/*[clinic end generated code: output=f8e5c33233566344 input=c85c2b594cd8124a]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001675{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001677 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001679
1680 /*
1681 * Make a call to the read method, but read zero bytes.
1682 * This is to ensure that the object passed in at least
1683 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001684 * This can be removed if we guarantee good error handling
1685 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001686 */
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001687 data = _PyObject_CallMethodId(file, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 if (data == NULL)
1689 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001690 if (!PyBytes_Check(data)) {
1691 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001692 "file.read() returned not bytes but %.100s",
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001693 data->ob_type->tp_name);
1694 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 }
1696 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001697 rf.depth = 0;
1698 rf.fp = NULL;
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001699 rf.readable = file;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001700 rf.ptr = rf.end = NULL;
1701 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001702 if ((rf.refs = PyList_New(0)) != NULL) {
1703 result = read_object(&rf);
1704 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001705 if (rf.buf != NULL)
1706 PyMem_FREE(rf.buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001707 } else
1708 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 Py_DECREF(data);
1711 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001712}
1713
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001714/*[clinic input]
1715marshal.dumps
R. David Murraydd226ea2009-05-13 12:27:21 +00001716
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001717 value: object
1718 Must be a supported type.
1719 version: int(c_default="Py_MARSHAL_VERSION") = version
1720 Indicates the data format that dumps should use.
1721 /
1722
1723Return the bytes object that would be written to a file by dump(value, file).
1724
1725Raise a ValueError exception if value has (or contains an object that has) an
1726unsupported type.
1727[clinic start generated code]*/
R. David Murraydd226ea2009-05-13 12:27:21 +00001728
Guido van Rossum79f25d91997-04-29 20:08:16 +00001729static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001730marshal_dumps_impl(PyObject *module, PyObject *value, int version)
1731/*[clinic end generated code: output=9c200f98d7256cad input=a2139ea8608e9b27]*/
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001732{
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001733 return PyMarshal_WriteObjectToString(value, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001734}
1735
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001736/*[clinic input]
1737marshal.loads
R. David Murraydd226ea2009-05-13 12:27:21 +00001738
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001739 bytes: Py_buffer
1740 /
1741
1742Convert the bytes-like object to a value.
1743
1744If no valid value is found, raise EOFError, ValueError or TypeError. Extra
1745bytes in the input are ignored.
1746[clinic start generated code]*/
R. David Murraydd226ea2009-05-13 12:27:21 +00001747
Guido van Rossum79f25d91997-04-29 20:08:16 +00001748static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001749marshal_loads_impl(PyObject *module, Py_buffer *bytes)
1750/*[clinic end generated code: output=9fc65985c93d1bb1 input=6f426518459c8495]*/
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 RFILE rf;
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001753 char *s = bytes->buf;
1754 Py_ssize_t n = bytes->len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 PyObject* result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001757 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 rf.ptr = s;
1759 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001761 if ((rf.refs = PyList_New(0)) == NULL)
1762 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 result = read_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001764 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001766}
1767
Guido van Rossum79f25d91997-04-29 20:08:16 +00001768static PyMethodDef marshal_methods[] = {
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001769 MARSHAL_DUMP_METHODDEF
1770 MARSHAL_LOAD_METHODDEF
1771 MARSHAL_DUMPS_METHODDEF
1772 MARSHAL_LOADS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001774};
1775
R. David Murraydd226ea2009-05-13 12:27:21 +00001776
1777PyDoc_STRVAR(module_doc,
1778"This module contains functions that can read and write Python values in\n\
1779a binary format. The format is specific to Python, but independent of\n\
1780machine architecture issues.\n\
1781\n\
1782Not all Python object types are supported; in general, only objects\n\
1783whose value is independent from a particular invocation of Python can be\n\
1784written and read by this module. The following types are supported:\n\
1785None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1786tuples, lists, sets, dictionaries, and code objects, where it\n\
1787should be understood that tuples, lists and dictionaries are only\n\
1788supported as long as the values contained therein are themselves\n\
1789supported; and recursive lists and dictionaries should not be written\n\
1790(they will cause infinite loops).\n\
1791\n\
1792Variables:\n\
1793\n\
1794version -- indicates the format that the module uses. Version 0 is the\n\
1795 historical format, version 1 shares interned strings and version 2\n\
1796 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001797 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001798\n\
1799Functions:\n\
1800\n\
1801dump() -- write value to a file\n\
1802load() -- read value from a file\n\
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001803dumps() -- marshal value as a bytes object\n\
1804loads() -- read value from a bytes-like object");
R. David Murraydd226ea2009-05-13 12:27:21 +00001805
1806
1807
Brett Cannon429ef652008-06-27 00:35:35 +00001808static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 PyModuleDef_HEAD_INIT,
1810 "marshal",
1811 module_doc,
1812 0,
1813 marshal_methods,
1814 NULL,
1815 NULL,
1816 NULL,
1817 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001818};
1819
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001820PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001821PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001822{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 PyObject *mod = PyModule_Create(&marshalmodule);
1824 if (mod == NULL)
1825 return NULL;
1826 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1827 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001828}