blob: 91a0f8acb12487c5c4b3781071700b8216a01268 [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"
Victor Stinnerb6179932020-05-12 02:42:19 +020015#include "pycore_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;
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +030086 const 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;
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +0300117 size = PyBytes_GET_SIZE(p->str);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200118 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) {
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +0300129 p->end = p->ptr = p->buf = NULL;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200130 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 Storchaka2c003ef2020-03-31 23:23:21 +0300141w_string(const void *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
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +0300197w_pstring(const void *s, Py_ssize_t n, WFILE *p)
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300198{
199 W_SIZE(n, p);
200 w_string(s, n, p);
201}
202
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200203static void
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +0300204w_short_pstring(const void *s, Py_ssize_t n, WFILE *p)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200205{
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 }
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +0300277 w_string(buf, 8, p);
Serhiy Storchakac5734992018-07-24 10:55:47 +0300278}
279
280static void
281w_float_str(double v, WFILE *p)
282{
Serhiy Storchakac5734992018-07-24 10:55:47 +0300283 char *buf = PyOS_double_to_string(v, 'g', 17, 0, NULL);
284 if (!buf) {
285 p->error = WFERR_NOMEMORY;
286 return;
287 }
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +0300288 w_short_pstring(buf, strlen(buf), p);
Serhiy Storchakac5734992018-07-24 10:55:47 +0300289 PyMem_Free(buf);
290}
291
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700292static int
293w_ref(PyObject *v, char *flag, WFILE *p)
294{
Serhiy Storchakace921c622015-02-11 15:53:31 +0200295 _Py_hashtable_entry_t *entry;
296 int w;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700297
Serhiy Storchakace921c622015-02-11 15:53:31 +0200298 if (p->version < 3 || p->hashtable == NULL)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700299 return 0; /* not writing object references */
300
301 /* if it has only one reference, it definitely isn't shared */
302 if (Py_REFCNT(v) == 1)
303 return 0;
304
Victor Stinner5b0a3032020-05-13 04:40:30 +0200305 entry = _Py_hashtable_get_entry(p->hashtable, v);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200306 if (entry != NULL) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700307 /* write the reference index to the stream */
Victor Stinner5b0a3032020-05-13 04:40:30 +0200308 w = (int)(uintptr_t)entry->value;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700309 /* we don't store "long" indices in the dict */
310 assert(0 <= w && w <= 0x7fffffff);
311 w_byte(TYPE_REF, p);
312 w_long(w, p);
313 return 1;
314 } else {
Victor Stinnera482dc52020-05-14 21:55:47 +0200315 size_t s = p->hashtable->nentries;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700316 /* we don't support long indices */
317 if (s >= 0x7fffffff) {
318 PyErr_SetString(PyExc_ValueError, "too many objects");
319 goto err;
320 }
Serhiy Storchaka26861b02015-02-16 20:52:17 +0200321 w = (int)s;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200322 Py_INCREF(v);
Victor Stinner5b0a3032020-05-13 04:40:30 +0200323 if (_Py_hashtable_set(p->hashtable, v, (void *)(uintptr_t)w) < 0) {
Serhiy Storchakace921c622015-02-11 15:53:31 +0200324 Py_DECREF(v);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700325 goto err;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200326 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700327 *flag |= FLAG_REF;
328 return 0;
329 }
330err:
331 p->error = WFERR_UNMARSHALLABLE;
332 return 1;
333}
334
335static void
336w_complex_object(PyObject *v, char flag, WFILE *p);
337
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000338static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000339w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000340{
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700341 char flag = '\0';
Fred Drake6da0b912000-06-28 18:47:56 +0000342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
346 p->error = WFERR_NESTEDTOODEEP;
347 }
348 else if (v == NULL) {
349 w_byte(TYPE_NULL, p);
350 }
351 else if (v == Py_None) {
352 w_byte(TYPE_NONE, p);
353 }
354 else if (v == PyExc_StopIteration) {
355 w_byte(TYPE_STOPITER, p);
356 }
357 else if (v == Py_Ellipsis) {
358 w_byte(TYPE_ELLIPSIS, p);
359 }
360 else if (v == Py_False) {
361 w_byte(TYPE_FALSE, p);
362 }
363 else if (v == Py_True) {
364 w_byte(TYPE_TRUE, p);
365 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700366 else if (!w_ref(v, &flag, p))
367 w_complex_object(v, flag, p);
368
369 p->depth--;
370}
371
372static void
373w_complex_object(PyObject *v, char flag, WFILE *p)
374{
375 Py_ssize_t i, n;
376
377 if (PyLong_CheckExact(v)) {
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +0300378 int overflow;
379 long x = PyLong_AsLongAndOverflow(v, &overflow);
380 if (overflow) {
381 w_PyLong((PyLongObject *)v, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 }
383 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000384#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
386 if (y && y != -1) {
Martin v. Löwis7e395722012-07-28 19:44:05 +0200387 /* Too large for TYPE_INT */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700388 w_PyLong((PyLongObject*)v, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 }
390 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000391#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700393 W_TYPE(TYPE_INT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 w_long(x, p);
395 }
396 }
397 }
398 else if (PyFloat_CheckExact(v)) {
399 if (p->version > 1) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700400 W_TYPE(TYPE_BINARY_FLOAT, p);
Serhiy Storchakac5734992018-07-24 10:55:47 +0300401 w_float_bin(PyFloat_AS_DOUBLE(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 }
403 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700404 W_TYPE(TYPE_FLOAT, p);
Serhiy Storchakac5734992018-07-24 10:55:47 +0300405 w_float_str(PyFloat_AS_DOUBLE(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 }
407 }
408 else if (PyComplex_CheckExact(v)) {
409 if (p->version > 1) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700410 W_TYPE(TYPE_BINARY_COMPLEX, p);
Serhiy Storchakac5734992018-07-24 10:55:47 +0300411 w_float_bin(PyComplex_RealAsDouble(v), p);
412 w_float_bin(PyComplex_ImagAsDouble(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 }
414 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700415 W_TYPE(TYPE_COMPLEX, p);
Serhiy Storchakac5734992018-07-24 10:55:47 +0300416 w_float_str(PyComplex_RealAsDouble(v), p);
417 w_float_str(PyComplex_ImagAsDouble(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 }
419 }
420 else if (PyBytes_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700421 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300422 w_pstring(PyBytes_AS_STRING(v), PyBytes_GET_SIZE(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 }
424 else if (PyUnicode_CheckExact(v)) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200425 if (p->version >= 4 && PyUnicode_IS_ASCII(v)) {
426 int is_short = PyUnicode_GET_LENGTH(v) < 256;
427 if (is_short) {
428 if (PyUnicode_CHECK_INTERNED(v))
429 W_TYPE(TYPE_SHORT_ASCII_INTERNED, p);
430 else
431 W_TYPE(TYPE_SHORT_ASCII, p);
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +0300432 w_short_pstring(PyUnicode_1BYTE_DATA(v),
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200433 PyUnicode_GET_LENGTH(v), p);
434 }
435 else {
436 if (PyUnicode_CHECK_INTERNED(v))
437 W_TYPE(TYPE_ASCII_INTERNED, p);
438 else
439 W_TYPE(TYPE_ASCII, p);
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +0300440 w_pstring(PyUnicode_1BYTE_DATA(v),
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200441 PyUnicode_GET_LENGTH(v), p);
442 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200444 else {
445 PyObject *utf8;
446 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");
447 if (utf8 == NULL) {
448 p->depth--;
449 p->error = WFERR_UNMARSHALLABLE;
450 return;
451 }
452 if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v))
453 W_TYPE(TYPE_INTERNED, p);
454 else
455 W_TYPE(TYPE_UNICODE, p);
456 w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p);
457 Py_DECREF(utf8);
458 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 }
460 else if (PyTuple_CheckExact(v)) {
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +0300461 n = PyTuple_GET_SIZE(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200462 if (p->version >= 4 && n < 256) {
463 W_TYPE(TYPE_SMALL_TUPLE, p);
Victor Stinnerda062552013-11-16 00:13:29 +0100464 w_byte((unsigned char)n, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200465 }
466 else {
467 W_TYPE(TYPE_TUPLE, p);
468 W_SIZE(n, p);
469 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 for (i = 0; i < n; i++) {
471 w_object(PyTuple_GET_ITEM(v, i), p);
472 }
473 }
474 else if (PyList_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700475 W_TYPE(TYPE_LIST, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 n = PyList_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200477 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 for (i = 0; i < n; i++) {
479 w_object(PyList_GET_ITEM(v, i), p);
480 }
481 }
482 else if (PyDict_CheckExact(v)) {
483 Py_ssize_t pos;
484 PyObject *key, *value;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700485 W_TYPE(TYPE_DICT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 /* This one is NULL object terminated! */
487 pos = 0;
488 while (PyDict_Next(v, &pos, &key, &value)) {
489 w_object(key, p);
490 w_object(value, p);
491 }
492 w_object((PyObject *)NULL, p);
493 }
494 else if (PyAnySet_CheckExact(v)) {
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +0300495 PyObject *value;
496 Py_ssize_t pos = 0;
497 Py_hash_t hash;
Raymond Hettingera422c342005-01-11 03:03:27 +0000498
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +0300499 if (PyFrozenSet_CheckExact(v))
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700500 W_TYPE(TYPE_FROZENSET, p);
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +0300501 else
502 W_TYPE(TYPE_SET, p);
503 n = PySet_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200504 W_SIZE(n, p);
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +0300505 while (_PySet_NextEntry(v, &pos, &value, &hash)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 w_object(value, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 }
508 }
509 else if (PyCode_Check(v)) {
510 PyCodeObject *co = (PyCodeObject *)v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700511 W_TYPE(TYPE_CODE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 w_long(co->co_argcount, p);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100513 w_long(co->co_posonlyargcount, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 w_long(co->co_kwonlyargcount, p);
515 w_long(co->co_nlocals, p);
516 w_long(co->co_stacksize, p);
517 w_long(co->co_flags, p);
518 w_object(co->co_code, p);
519 w_object(co->co_consts, p);
520 w_object(co->co_names, p);
521 w_object(co->co_varnames, p);
522 w_object(co->co_freevars, p);
523 w_object(co->co_cellvars, p);
524 w_object(co->co_filename, p);
525 w_object(co->co_name, p);
526 w_long(co->co_firstlineno, p);
527 w_object(co->co_lnotab, p);
528 }
529 else if (PyObject_CheckBuffer(v)) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +0200530 /* Write unknown bytes-like objects as a bytes object */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100532 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100534 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100536 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700538 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300539 w_pstring(view.buf, view.len, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100540 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 }
542 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700543 W_TYPE(TYPE_UNKNOWN, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 p->error = WFERR_UNMARSHALLABLE;
545 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000546}
547
Victor Stinner2d0a3d62020-05-13 02:50:18 +0200548static void
549w_decref_entry(void *key)
550{
551 PyObject *entry_key = (PyObject *)key;
552 Py_XDECREF(entry_key);
553}
554
Serhiy Storchakace921c622015-02-11 15:53:31 +0200555static int
556w_init_refs(WFILE *wf, int version)
557{
558 if (version >= 3) {
Victor Stinner5b0a3032020-05-13 04:40:30 +0200559 wf->hashtable = _Py_hashtable_new_full(_Py_hashtable_hash_ptr,
Victor Stinner2d0a3d62020-05-13 02:50:18 +0200560 _Py_hashtable_compare_direct,
561 w_decref_entry, NULL, NULL);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200562 if (wf->hashtable == NULL) {
563 PyErr_NoMemory();
564 return -1;
565 }
566 }
567 return 0;
568}
569
Serhiy Storchakace921c622015-02-11 15:53:31 +0200570static void
571w_clear_refs(WFILE *wf)
572{
573 if (wf->hashtable != NULL) {
Serhiy Storchakace921c622015-02-11 15:53:31 +0200574 _Py_hashtable_destroy(wf->hashtable);
575 }
576}
577
Serhiy Storchaka95949422013-08-27 19:40:23 +0300578/* version currently has no effect for writing ints. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000579void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000580PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000581{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200582 char buf[4];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 WFILE wf;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200584 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 wf.fp = fp;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200586 wf.ptr = wf.buf = buf;
587 wf.end = wf.ptr + sizeof(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 wf.version = version;
590 w_long(x, &wf);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200591 w_flush(&wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000592}
593
594void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000595PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000596{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200597 char buf[BUFSIZ];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 WFILE wf;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200599 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 wf.fp = fp;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200601 wf.ptr = wf.buf = buf;
602 wf.end = wf.ptr + sizeof(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 wf.version = version;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200605 if (w_init_refs(&wf, version))
606 return; /* caller mush check PyErr_Occurred() */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 w_object(x, &wf);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200608 w_clear_refs(&wf);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200609 w_flush(&wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000610}
611
Serhiy Storchakac07422c2015-02-11 16:18:09 +0200612typedef struct {
613 FILE *fp;
614 int depth;
615 PyObject *readable; /* Stream-like object being read from */
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +0300616 const char *ptr;
617 const char *end;
Serhiy Storchakac07422c2015-02-11 16:18:09 +0200618 char *buf;
619 Py_ssize_t buf_size;
620 PyObject *refs; /* a list */
621} RFILE;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000622
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200623static const char *
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200624r_string(Py_ssize_t n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000625{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200626 Py_ssize_t read = -1;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100627
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200628 if (p->ptr != NULL) {
629 /* Fast path for loads() */
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +0300630 const char *res = p->ptr;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200631 Py_ssize_t left = p->end - p->ptr;
632 if (left < n) {
633 PyErr_SetString(PyExc_EOFError,
634 "marshal data too short");
635 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100636 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200637 p->ptr += n;
638 return res;
639 }
640 if (p->buf == NULL) {
641 p->buf = PyMem_MALLOC(n);
642 if (p->buf == NULL) {
643 PyErr_NoMemory();
644 return NULL;
645 }
646 p->buf_size = n;
647 }
648 else if (p->buf_size < n) {
Zackery Spytz4c49da02018-12-07 03:11:30 -0700649 char *tmp = PyMem_REALLOC(p->buf, n);
650 if (tmp == NULL) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200651 PyErr_NoMemory();
652 return NULL;
653 }
Zackery Spytz4c49da02018-12-07 03:11:30 -0700654 p->buf = tmp;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200655 p->buf_size = n;
656 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100657
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200658 if (!p->readable) {
659 assert(p->fp != NULL);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200660 read = fread(p->buf, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100661 }
662 else {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200663 _Py_IDENTIFIER(readinto);
664 PyObject *res, *mview;
665 Py_buffer buf;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200666
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200667 if (PyBuffer_FillInfo(&buf, NULL, p->buf, n, 0, PyBUF_CONTIG) == -1)
668 return NULL;
669 mview = PyMemoryView_FromBuffer(&buf);
670 if (mview == NULL)
671 return NULL;
672
673 res = _PyObject_CallMethodId(p->readable, &PyId_readinto, "N", mview);
674 if (res != NULL) {
675 read = PyNumber_AsSsize_t(res, PyExc_ValueError);
676 Py_DECREF(res);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100677 }
678 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200679 if (read != n) {
680 if (!PyErr_Occurred()) {
681 if (read > n)
682 PyErr_Format(PyExc_ValueError,
683 "read() returned too much data: "
684 "%zd bytes requested, %zd returned",
685 n, read);
686 else
687 PyErr_SetString(PyExc_EOFError,
688 "EOF read where not expected");
689 }
690 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100691 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200692 return p->buf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100693}
694
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100695static int
696r_byte(RFILE *p)
697{
698 int c = EOF;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100699
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200700 if (p->ptr != NULL) {
701 if (p->ptr < p->end)
702 c = (unsigned char) *p->ptr++;
703 return c;
704 }
705 if (!p->readable) {
706 assert(p->fp);
707 c = getc(p->fp);
708 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100709 else {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200710 const char *ptr = r_string(1, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200711 if (ptr != NULL)
Andy Lestere6be9b52020-02-11 20:28:35 -0600712 c = *(const unsigned char *) ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100713 }
714 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000715}
716
717static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000718r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000719{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200720 short x = -1;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200721 const unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100722
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200723 buffer = (const unsigned char *) r_string(2, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200724 if (buffer != NULL) {
725 x = buffer[0];
726 x |= buffer[1] << 8;
727 /* Sign-extension, in case short greater than 16 bits */
728 x |= -(x & 0x8000);
729 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000731}
732
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000733static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000734r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000735{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200736 long x = -1;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200737 const unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100738
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200739 buffer = (const unsigned char *) r_string(4, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200740 if (buffer != NULL) {
741 x = buffer[0];
742 x |= (long)buffer[1] << 8;
743 x |= (long)buffer[2] << 16;
744 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000745#if SIZEOF_LONG > 4
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200746 /* Sign extension for 64-bit machines */
747 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000748#endif
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200749 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000751}
752
Serhiy Storchaka00987f62017-11-15 17:41:05 +0200753/* r_long64 deals with the TYPE_INT64 code. */
754static PyObject *
755r_long64(RFILE *p)
756{
757 const unsigned char *buffer = (const unsigned char *) r_string(8, p);
758 if (buffer == NULL) {
759 return NULL;
760 }
761 return _PyLong_FromByteArray(buffer, 8,
762 1 /* little endian */,
763 1 /* signed */);
764}
765
Guido van Rossum79f25d91997-04-29 20:08:16 +0000766static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000767r_PyLong(RFILE *p)
768{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200770 long n, size, i;
771 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100775 if (PyErr_Occurred())
776 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000777 if (n == 0)
778 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200779 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 PyErr_SetString(PyExc_ValueError,
781 "bad marshal data (long size out of range)");
782 return NULL;
783 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000784
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200785 size = 1 + (Py_ABS(n) - 1) / PyLong_MARSHAL_RATIO;
786 shorts_in_top_digit = 1 + (Py_ABS(n) - 1) % PyLong_MARSHAL_RATIO;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000787 ob = _PyLong_New(size);
788 if (ob == NULL)
789 return NULL;
Victor Stinner763b0d12013-10-31 16:56:38 +0100790
Victor Stinner60ac6ed2020-02-07 23:18:08 +0100791 Py_SET_SIZE(ob, n > 0 ? size : -size);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 for (i = 0; i < size-1; i++) {
794 d = 0;
795 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
796 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100797 if (PyErr_Occurred()) {
798 Py_DECREF(ob);
799 return NULL;
800 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 if (md < 0 || md > PyLong_MARSHAL_BASE)
802 goto bad_digit;
803 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
804 }
805 ob->ob_digit[i] = d;
806 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 d = 0;
809 for (j=0; j < shorts_in_top_digit; j++) {
810 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100811 if (PyErr_Occurred()) {
812 Py_DECREF(ob);
813 return NULL;
814 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 if (md < 0 || md > PyLong_MARSHAL_BASE)
816 goto bad_digit;
817 /* topmost marshal digit should be nonzero */
818 if (md == 0 && j == shorts_in_top_digit - 1) {
819 Py_DECREF(ob);
820 PyErr_SetString(PyExc_ValueError,
821 "bad marshal data (unnormalized long data)");
822 return NULL;
823 }
824 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
825 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100826 if (PyErr_Occurred()) {
827 Py_DECREF(ob);
828 return NULL;
829 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 /* top digit should be nonzero, else the resulting PyLong won't be
831 normalized */
832 ob->ob_digit[size-1] = d;
833 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000834 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 Py_DECREF(ob);
836 PyErr_SetString(PyExc_ValueError,
837 "bad marshal data (digit out of range in long)");
838 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000839}
840
Serhiy Storchakac5734992018-07-24 10:55:47 +0300841static double
842r_float_bin(RFILE *p)
843{
844 const unsigned char *buf = (const unsigned char *) r_string(8, p);
845 if (buf == NULL)
846 return -1;
847 return _PyFloat_Unpack8(buf, 1);
848}
849
850/* Issue #33720: Disable inlining for reducing the C stack consumption
851 on PGO builds. */
852_Py_NO_INLINE static double
853r_float_str(RFILE *p)
854{
855 int n;
856 char buf[256];
857 const char *ptr;
858 n = r_byte(p);
859 if (n == EOF) {
860 PyErr_SetString(PyExc_EOFError,
861 "EOF read where object expected");
862 return -1;
863 }
864 ptr = r_string(n, p);
865 if (ptr == NULL) {
866 return -1;
867 }
868 memcpy(buf, ptr, n);
869 buf[n] = '\0';
870 return PyOS_string_to_double(buf, NULL, NULL);
871}
872
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700873/* allocate the reflist index for a new object. Return -1 on failure */
874static Py_ssize_t
875r_ref_reserve(int flag, RFILE *p)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700876{
877 if (flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200878 Py_ssize_t idx = PyList_GET_SIZE(p->refs);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700879 if (idx >= 0x7ffffffe) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700880 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700881 return -1;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700882 }
883 if (PyList_Append(p->refs, Py_None) < 0)
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700884 return -1;
885 return idx;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700886 } else
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700887 return 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700888}
889
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700890/* insert the new object 'o' to the reflist at previously
891 * allocated index 'idx'.
892 * 'o' can be NULL, in which case nothing is done.
893 * if 'o' was non-NULL, and the function succeeds, 'o' is returned.
894 * if 'o' was non-NULL, and the function fails, 'o' is released and
895 * NULL returned. This simplifies error checking at the call site since
896 * a single test for NULL for the function result is enough.
897 */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700898static PyObject *
899r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
900{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700901 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200902 PyObject *tmp = PyList_GET_ITEM(p->refs, idx);
903 Py_INCREF(o);
904 PyList_SET_ITEM(p->refs, idx, o);
905 Py_DECREF(tmp);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700906 }
907 return o;
908}
909
910/* combination of both above, used when an object can be
911 * created whenever it is seen in the file, as opposed to
912 * after having loaded its sub-objects.
913 */
914static PyObject *
915r_ref(PyObject *o, int flag, RFILE *p)
916{
Victor Stinner359fabc2013-10-31 17:09:01 +0100917 assert(flag & FLAG_REF);
918 if (o == NULL)
919 return NULL;
920 if (PyList_Append(p->refs, o) < 0) {
921 Py_DECREF(o); /* release the new object */
922 return NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700923 }
924 return o;
925}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000926
927static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000928r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 /* NULL is a valid return value, it does not necessarily means that
931 an exception is set. */
932 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500933 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700935 int type, code = r_byte(p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200936 int flag, is_interned = 0;
Christian Heimes35728422013-10-13 02:29:06 +0200937 PyObject *retval = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000938
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700939 if (code == EOF) {
940 PyErr_SetString(PyExc_EOFError,
941 "EOF read where object expected");
942 return NULL;
943 }
944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
948 p->depth--;
949 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
950 return NULL;
951 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000952
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700953 flag = code & FLAG_REF;
954 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700955
956#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700957 if (flag) \
958 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700959} while (0)
960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 case TYPE_NULL:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 case TYPE_NONE:
967 Py_INCREF(Py_None);
968 retval = Py_None;
969 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 case TYPE_STOPITER:
972 Py_INCREF(PyExc_StopIteration);
973 retval = PyExc_StopIteration;
974 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 case TYPE_ELLIPSIS:
977 Py_INCREF(Py_Ellipsis);
978 retval = Py_Ellipsis;
979 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 case TYPE_FALSE:
982 Py_INCREF(Py_False);
983 retval = Py_False;
984 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 case TYPE_TRUE:
987 Py_INCREF(Py_True);
988 retval = Py_True;
989 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100992 n = r_long(p);
993 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700994 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000996
Serhiy Storchaka00987f62017-11-15 17:41:05 +0200997 case TYPE_INT64:
998 retval = r_long64(p);
999 R_REF(retval);
1000 break;
1001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 case TYPE_LONG:
1003 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001004 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 case TYPE_FLOAT:
1008 {
Serhiy Storchakac5734992018-07-24 10:55:47 +03001009 double x = r_float_str(p);
1010 if (x == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 break;
Serhiy Storchakac5734992018-07-24 10:55:47 +03001012 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001013 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 break;
1015 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 case TYPE_BINARY_FLOAT:
1018 {
Serhiy Storchakac5734992018-07-24 10:55:47 +03001019 double x = r_float_bin(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001020 if (x == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001023 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 break;
1025 }
Michael W. Hudsondf888462005-06-03 14:41:55 +00001026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 case TYPE_COMPLEX:
1028 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 Py_complex c;
Serhiy Storchakac5734992018-07-24 10:55:47 +03001030 c.real = r_float_str(p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 if (c.real == -1.0 && PyErr_Occurred())
1032 break;
Serhiy Storchakac5734992018-07-24 10:55:47 +03001033 c.imag = r_float_str(p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 if (c.imag == -1.0 && PyErr_Occurred())
1035 break;
1036 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001037 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 break;
1039 }
Michael W. Hudsondf888462005-06-03 14:41:55 +00001040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 case TYPE_BINARY_COMPLEX:
1042 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 Py_complex c;
Serhiy Storchakac5734992018-07-24 10:55:47 +03001044 c.real = r_float_bin(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001045 if (c.real == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 break;
Serhiy Storchakac5734992018-07-24 10:55:47 +03001047 c.imag = r_float_bin(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001048 if (c.imag == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001051 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 break;
1053 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 case TYPE_STRING:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001056 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001057 const char *ptr;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001058 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001059 if (PyErr_Occurred())
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001060 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001061 if (n < 0 || n > SIZE32_MAX) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001062 PyErr_SetString(PyExc_ValueError, "bad marshal data (bytes object size out of range)");
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001063 break;
1064 }
1065 v = PyBytes_FromStringAndSize((char *)NULL, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001066 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001067 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001068 ptr = r_string(n, p);
1069 if (ptr == NULL) {
1070 Py_DECREF(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001071 break;
1072 }
1073 memcpy(PyBytes_AS_STRING(v), ptr, n);
1074 retval = v;
1075 R_REF(retval);
1076 break;
1077 }
1078
1079 case TYPE_ASCII_INTERNED:
1080 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001081 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001082 case TYPE_ASCII:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001084 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001085 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001086 if (n < 0 || n > SIZE32_MAX) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001087 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 break;
1089 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001090 goto _read_ascii;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001091
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001092 case TYPE_SHORT_ASCII_INTERNED:
1093 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001094 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001095 case TYPE_SHORT_ASCII:
1096 n = r_byte(p);
1097 if (n == EOF) {
1098 PyErr_SetString(PyExc_EOFError,
1099 "EOF read where object expected");
1100 break;
1101 }
1102 _read_ascii:
1103 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001104 const char *ptr;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001105 ptr = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001106 if (ptr == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001107 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001108 v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001109 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001110 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001111 if (is_interned)
1112 PyUnicode_InternInPlace(&v);
1113 retval = v;
1114 R_REF(retval);
1115 break;
1116 }
1117
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001118 case TYPE_INTERNED:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001119 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001120 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001121 case TYPE_UNICODE:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001123 const char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +00001124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001126 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001127 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001128 if (n < 0 || n > SIZE32_MAX) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001129 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 break;
1131 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001132 if (n != 0) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001133 buffer = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001134 if (buffer == NULL)
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001135 break;
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001136 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001138 else {
1139 v = PyUnicode_New(0, 0);
1140 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001141 if (v == NULL)
Victor Stinner3a8b79d2013-07-08 22:23:32 +02001142 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001143 if (is_interned)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001144 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001146 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 break;
1148 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001149
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001150 case TYPE_SMALL_TUPLE:
1151 n = (unsigned char) r_byte(p);
Victor Stinnerb1b7b182013-10-31 17:07:08 +01001152 if (PyErr_Occurred())
1153 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001154 goto _read_tuple;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 case TYPE_TUPLE:
1156 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001157 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001158 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001159 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 break;
1162 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001163 _read_tuple:
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001164 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001165 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001166 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 break;
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 for (i = 0; i < n; i++) {
1170 v2 = r_object(p);
1171 if ( v2 == NULL ) {
1172 if (!PyErr_Occurred())
1173 PyErr_SetString(PyExc_TypeError,
1174 "NULL object in marshal data for tuple");
1175 Py_DECREF(v);
1176 v = NULL;
1177 break;
1178 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001179 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 }
1181 retval = v;
1182 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 case TYPE_LIST:
1185 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001186 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001187 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001188 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 break;
1191 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001192 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001193 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001194 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 for (i = 0; i < n; i++) {
1197 v2 = r_object(p);
1198 if ( v2 == NULL ) {
1199 if (!PyErr_Occurred())
1200 PyErr_SetString(PyExc_TypeError,
1201 "NULL object in marshal data for list");
1202 Py_DECREF(v);
1203 v = NULL;
1204 break;
1205 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001206 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 }
1208 retval = v;
1209 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 case TYPE_DICT:
1212 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001213 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001214 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 for (;;) {
1217 PyObject *key, *val;
1218 key = r_object(p);
1219 if (key == NULL)
1220 break;
1221 val = r_object(p);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001222 if (val == NULL) {
1223 Py_DECREF(key);
1224 break;
1225 }
1226 if (PyDict_SetItem(v, key, val) < 0) {
1227 Py_DECREF(key);
1228 Py_DECREF(val);
1229 break;
1230 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 Py_DECREF(key);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001232 Py_DECREF(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001233 }
1234 if (PyErr_Occurred()) {
1235 Py_DECREF(v);
1236 v = NULL;
1237 }
1238 retval = v;
1239 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 case TYPE_SET:
1242 case TYPE_FROZENSET:
1243 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001244 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001245 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001246 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 break;
1249 }
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001250
Victor Stinner1aa78932016-01-23 14:15:48 +01001251 if (n == 0 && type == TYPE_FROZENSET) {
1252 /* call frozenset() to get the empty frozenset singleton */
Victor Stinner4778eab2016-12-01 14:51:04 +01001253 v = _PyObject_CallNoArg((PyObject*)&PyFrozenSet_Type);
Victor Stinner1aa78932016-01-23 14:15:48 +01001254 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 break;
Victor Stinner1aa78932016-01-23 14:15:48 +01001256 R_REF(v);
1257 retval = v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 }
Victor Stinner1aa78932016-01-23 14:15:48 +01001259 else {
1260 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
1261 if (type == TYPE_SET) {
1262 R_REF(v);
1263 } else {
1264 /* must use delayed registration of frozensets because they must
1265 * be init with a refcount of 1
1266 */
1267 idx = r_ref_reserve(flag, p);
1268 if (idx < 0)
1269 Py_CLEAR(v); /* signal error */
1270 }
1271 if (v == NULL)
1272 break;
1273
1274 for (i = 0; i < n; i++) {
1275 v2 = r_object(p);
1276 if ( v2 == NULL ) {
1277 if (!PyErr_Occurred())
1278 PyErr_SetString(PyExc_TypeError,
1279 "NULL object in marshal data for set");
1280 Py_DECREF(v);
1281 v = NULL;
1282 break;
1283 }
1284 if (PySet_Add(v, v2) == -1) {
1285 Py_DECREF(v);
1286 Py_DECREF(v2);
1287 v = NULL;
1288 break;
1289 }
1290 Py_DECREF(v2);
1291 }
1292 if (type != TYPE_SET)
1293 v = r_ref_insert(v, idx, flag, p);
1294 retval = v;
1295 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 case TYPE_CODE:
1299 {
1300 int argcount;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001301 int posonlyargcount;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 int kwonlyargcount;
1303 int nlocals;
1304 int stacksize;
1305 int flags;
1306 PyObject *code = NULL;
1307 PyObject *consts = NULL;
1308 PyObject *names = NULL;
1309 PyObject *varnames = NULL;
1310 PyObject *freevars = NULL;
1311 PyObject *cellvars = NULL;
1312 PyObject *filename = NULL;
1313 PyObject *name = NULL;
1314 int firstlineno;
1315 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001316
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001317 idx = r_ref_reserve(flag, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001318 if (idx < 0)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001319 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 /* XXX ignore long->int overflows for now */
1324 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001325 if (PyErr_Occurred())
1326 goto code_error;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001327 posonlyargcount = (int)r_long(p);
1328 if (PyErr_Occurred()) {
1329 goto code_error;
1330 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001332 if (PyErr_Occurred())
1333 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001335 if (PyErr_Occurred())
1336 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001338 if (PyErr_Occurred())
1339 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001341 if (PyErr_Occurred())
1342 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 code = r_object(p);
1344 if (code == NULL)
1345 goto code_error;
1346 consts = r_object(p);
1347 if (consts == NULL)
1348 goto code_error;
1349 names = r_object(p);
1350 if (names == NULL)
1351 goto code_error;
1352 varnames = r_object(p);
1353 if (varnames == NULL)
1354 goto code_error;
1355 freevars = r_object(p);
1356 if (freevars == NULL)
1357 goto code_error;
1358 cellvars = r_object(p);
1359 if (cellvars == NULL)
1360 goto code_error;
1361 filename = r_object(p);
1362 if (filename == NULL)
1363 goto code_error;
1364 name = r_object(p);
1365 if (name == NULL)
1366 goto code_error;
1367 firstlineno = (int)r_long(p);
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001368 if (firstlineno == -1 && PyErr_Occurred())
1369 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 lnotab = r_object(p);
1371 if (lnotab == NULL)
1372 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001373
tkmikand160e0f2020-07-04 04:56:30 +08001374 if (PySys_Audit("code.__new__", "OOOiiiiii",
1375 code, filename, name, argcount, posonlyargcount,
1376 kwonlyargcount, nlocals, stacksize, flags) < 0) {
1377 goto code_error;
1378 }
1379
Pablo Galindo4a2edc32019-07-01 11:35:05 +01001380 v = (PyObject *) PyCode_NewWithPosOnlyArgs(
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001381 argcount, posonlyargcount, kwonlyargcount,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 nlocals, stacksize, flags,
1383 code, consts, names, varnames,
1384 freevars, cellvars, filename, name,
1385 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001386 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 code_error:
1389 Py_XDECREF(code);
1390 Py_XDECREF(consts);
1391 Py_XDECREF(names);
1392 Py_XDECREF(varnames);
1393 Py_XDECREF(freevars);
1394 Py_XDECREF(cellvars);
1395 Py_XDECREF(filename);
1396 Py_XDECREF(name);
1397 Py_XDECREF(lnotab);
1398 }
1399 retval = v;
1400 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001401
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001402 case TYPE_REF:
1403 n = r_long(p);
1404 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001405 if (n == -1 && PyErr_Occurred())
1406 break;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001407 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001408 break;
1409 }
1410 v = PyList_GET_ITEM(p->refs, n);
1411 if (v == Py_None) {
1412 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001413 break;
1414 }
1415 Py_INCREF(v);
1416 retval = v;
1417 break;
1418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 default:
1420 /* Bogus data got written, which isn't ideal.
1421 This will let you keep working and recover. */
1422 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 break;
1424
1425 }
1426 p->depth--;
1427 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001428}
1429
Neal Norwitzd85c4522004-06-13 20:31:49 +00001430static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001431read_object(RFILE *p)
1432{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 PyObject *v;
1434 if (PyErr_Occurred()) {
1435 fprintf(stderr, "XXX readobject called with exception set\n");
1436 return NULL;
1437 }
1438 v = r_object(p);
1439 if (v == NULL && !PyErr_Occurred())
1440 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1441 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001442}
1443
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001444int
1445PyMarshal_ReadShortFromFile(FILE *fp)
1446{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001447 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001448 int res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001450 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 rf.fp = fp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 rf.end = rf.ptr = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001453 rf.buf = NULL;
1454 res = r_short(&rf);
1455 if (rf.buf != NULL)
1456 PyMem_FREE(rf.buf);
1457 return res;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001458}
1459
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001460long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001461PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001462{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001464 long res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001466 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001468 rf.buf = NULL;
1469 res = r_long(&rf);
1470 if (rf.buf != NULL)
1471 PyMem_FREE(rf.buf);
1472 return res;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001473}
1474
Steve Dowerf2f373f2015-02-21 08:44:05 -08001475/* Return size of file in bytes; < 0 if unknown or INT_MAX if too big */
Tim Peters691e0e92001-01-18 04:39:16 +00001476static off_t
1477getfilesize(FILE *fp)
1478{
Steve Dowerf2f373f2015-02-21 08:44:05 -08001479 struct _Py_stat_struct st;
Victor Stinnere134a7f2015-03-30 10:09:31 +02001480 if (_Py_fstat_noraise(fileno(fp), &st) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 return -1;
Steve Dowerf2f373f2015-02-21 08:44:05 -08001482#if SIZEOF_OFF_T == 4
1483 else if (st.st_size >= INT_MAX)
1484 return (off_t)INT_MAX;
1485#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 else
Steve Dowerf2f373f2015-02-21 08:44:05 -08001487 return (off_t)st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001488}
Tim Petersd9b9ac82001-01-28 00:27:39 +00001489
Tim Peters691e0e92001-01-18 04:39:16 +00001490/* If we can get the size of the file up-front, and it's reasonably small,
1491 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1492 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001493 * CAUTION: since this may read the entire remainder of the file, don't
1494 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001495 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001496PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001497PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001498{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001499/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001500#define REASONABLE_FILE_LIMIT (1L << 18)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 off_t filesize;
1502 filesize = getfilesize(fp);
1503 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1504 char* pBuf = (char *)PyMem_MALLOC(filesize);
1505 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001506 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1507 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 PyMem_FREE(pBuf);
1509 return v;
1510 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 /* We don't have fstat, or we do but the file is larger than
1514 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1515 */
1516 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001517
Tim Peters691e0e92001-01-18 04:39:16 +00001518#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001519}
1520
Guido van Rossum79f25d91997-04-29 20:08:16 +00001521PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001522PyMarshal_ReadObjectFromFile(FILE *fp)
1523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 RFILE rf;
1525 PyObject *result;
1526 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001527 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 rf.depth = 0;
1529 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001530 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001531 rf.refs = PyList_New(0);
1532 if (rf.refs == NULL)
1533 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001535 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001536 if (rf.buf != NULL)
1537 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001539}
1540
1541PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03001542PyMarshal_ReadObjectFromString(const char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001543{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 RFILE rf;
1545 PyObject *result;
1546 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001547 rf.readable = NULL;
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +03001548 rf.ptr = str;
1549 rf.end = str + len;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001550 rf.buf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001552 rf.refs = PyList_New(0);
1553 if (rf.refs == NULL)
1554 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001556 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001557 if (rf.buf != NULL)
1558 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001560}
1561
Guido van Rossum79f25d91997-04-29 20:08:16 +00001562PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001563PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001564{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001566
Serhiy Storchakace921c622015-02-11 15:53:31 +02001567 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1569 if (wf.str == NULL)
1570 return NULL;
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +03001571 wf.ptr = wf.buf = PyBytes_AS_STRING(wf.str);
1572 wf.end = wf.ptr + PyBytes_GET_SIZE(wf.str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 wf.version = version;
Serhiy Storchakace921c622015-02-11 15:53:31 +02001575 if (w_init_refs(&wf, version)) {
1576 Py_DECREF(wf.str);
1577 return NULL;
1578 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 w_object(x, &wf);
Serhiy Storchakace921c622015-02-11 15:53:31 +02001580 w_clear_refs(&wf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 if (wf.str != NULL) {
Serhiy Storchaka2c003ef2020-03-31 23:23:21 +03001582 const char *base = PyBytes_AS_STRING(wf.str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1584 return NULL;
1585 }
1586 if (wf.error != WFERR_OK) {
1587 Py_XDECREF(wf.str);
1588 if (wf.error == WFERR_NOMEMORY)
1589 PyErr_NoMemory();
1590 else
1591 PyErr_SetString(PyExc_ValueError,
1592 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1593 :"object too deeply nested to marshal");
1594 return NULL;
1595 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001596 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001597}
1598
Guido van Rossum64b45521991-06-07 13:58:22 +00001599/* And an interface for Python programs... */
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001600/*[clinic input]
1601marshal.dump
1602
1603 value: object
1604 Must be a supported type.
1605 file: object
1606 Must be a writeable binary file.
1607 version: int(c_default="Py_MARSHAL_VERSION") = version
1608 Indicates the data format that dump should use.
1609 /
1610
1611Write the value on the open file.
1612
1613If the value has (or contains an object that has) an unsupported type, a
1614ValueError exception is raised - but garbage data will also be written
1615to the file. The object will not be properly read back by load().
1616[clinic start generated code]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001617
Guido van Rossum79f25d91997-04-29 20:08:16 +00001618static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001619marshal_dump_impl(PyObject *module, PyObject *value, PyObject *file,
1620 int version)
1621/*[clinic end generated code: output=aaee62c7028a7cb2 input=6c7a3c23c6fef556]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001622{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 /* XXX Quick hack -- need to do this differently */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 PyObject *s;
1625 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001626 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001627
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001628 s = PyMarshal_WriteObjectToString(value, version);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 if (s == NULL)
1630 return NULL;
Jeroen Demeyer59ad1102019-07-11 10:59:05 +02001631 res = _PyObject_CallMethodIdOneArg(file, &PyId_write, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 Py_DECREF(s);
1633 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001634}
1635
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001636/*[clinic input]
1637marshal.load
1638
1639 file: object
1640 Must be readable binary file.
1641 /
1642
1643Read one value from the open file and return it.
1644
1645If no valid value is read (e.g. because the data has a different Python
1646version's incompatible marshal format), raise EOFError, ValueError or
1647TypeError.
1648
1649Note: If an object containing an unsupported type was marshalled with
1650dump(), load() will substitute None for the unmarshallable type.
1651[clinic start generated code]*/
R. David Murraydd226ea2009-05-13 12:27:21 +00001652
Guido van Rossum79f25d91997-04-29 20:08:16 +00001653static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001654marshal_load(PyObject *module, PyObject *file)
1655/*[clinic end generated code: output=f8e5c33233566344 input=c85c2b594cd8124a]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001656{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001658 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001660
1661 /*
1662 * Make a call to the read method, but read zero bytes.
1663 * This is to ensure that the object passed in at least
1664 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001665 * This can be removed if we guarantee good error handling
1666 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001667 */
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001668 data = _PyObject_CallMethodId(file, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 if (data == NULL)
1670 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001671 if (!PyBytes_Check(data)) {
1672 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001673 "file.read() returned not bytes but %.100s",
Victor Stinnera102ed72020-02-07 02:24:48 +01001674 Py_TYPE(data)->tp_name);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001675 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 }
1677 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001678 rf.depth = 0;
1679 rf.fp = NULL;
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001680 rf.readable = file;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001681 rf.ptr = rf.end = NULL;
1682 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001683 if ((rf.refs = PyList_New(0)) != NULL) {
1684 result = read_object(&rf);
1685 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001686 if (rf.buf != NULL)
1687 PyMem_FREE(rf.buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001688 } else
1689 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 Py_DECREF(data);
1692 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001693}
1694
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001695/*[clinic input]
1696marshal.dumps
R. David Murraydd226ea2009-05-13 12:27:21 +00001697
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001698 value: object
1699 Must be a supported type.
1700 version: int(c_default="Py_MARSHAL_VERSION") = version
1701 Indicates the data format that dumps should use.
1702 /
1703
1704Return the bytes object that would be written to a file by dump(value, file).
1705
1706Raise a ValueError exception if value has (or contains an object that has) an
1707unsupported type.
1708[clinic start generated code]*/
R. David Murraydd226ea2009-05-13 12:27:21 +00001709
Guido van Rossum79f25d91997-04-29 20:08:16 +00001710static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001711marshal_dumps_impl(PyObject *module, PyObject *value, int version)
1712/*[clinic end generated code: output=9c200f98d7256cad input=a2139ea8608e9b27]*/
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001713{
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001714 return PyMarshal_WriteObjectToString(value, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001715}
1716
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001717/*[clinic input]
1718marshal.loads
R. David Murraydd226ea2009-05-13 12:27:21 +00001719
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001720 bytes: Py_buffer
1721 /
1722
1723Convert the bytes-like object to a value.
1724
1725If no valid value is found, raise EOFError, ValueError or TypeError. Extra
1726bytes in the input are ignored.
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_loads_impl(PyObject *module, Py_buffer *bytes)
1731/*[clinic end generated code: output=9fc65985c93d1bb1 input=6f426518459c8495]*/
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001732{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 RFILE rf;
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001734 char *s = bytes->buf;
1735 Py_ssize_t n = bytes->len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 PyObject* result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001738 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 rf.ptr = s;
1740 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001742 if ((rf.refs = PyList_New(0)) == NULL)
1743 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 result = read_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001745 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001747}
1748
Guido van Rossum79f25d91997-04-29 20:08:16 +00001749static PyMethodDef marshal_methods[] = {
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001750 MARSHAL_DUMP_METHODDEF
1751 MARSHAL_LOAD_METHODDEF
1752 MARSHAL_DUMPS_METHODDEF
1753 MARSHAL_LOADS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001755};
1756
R. David Murraydd226ea2009-05-13 12:27:21 +00001757
1758PyDoc_STRVAR(module_doc,
1759"This module contains functions that can read and write Python values in\n\
1760a binary format. The format is specific to Python, but independent of\n\
1761machine architecture issues.\n\
1762\n\
1763Not all Python object types are supported; in general, only objects\n\
1764whose value is independent from a particular invocation of Python can be\n\
1765written and read by this module. The following types are supported:\n\
1766None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1767tuples, lists, sets, dictionaries, and code objects, where it\n\
1768should be understood that tuples, lists and dictionaries are only\n\
1769supported as long as the values contained therein are themselves\n\
1770supported; and recursive lists and dictionaries should not be written\n\
1771(they will cause infinite loops).\n\
1772\n\
1773Variables:\n\
1774\n\
1775version -- indicates the format that the module uses. Version 0 is the\n\
1776 historical format, version 1 shares interned strings and version 2\n\
1777 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001778 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001779\n\
1780Functions:\n\
1781\n\
1782dump() -- write value to a file\n\
1783load() -- read value from a file\n\
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001784dumps() -- marshal value as a bytes object\n\
1785loads() -- read value from a bytes-like object");
R. David Murraydd226ea2009-05-13 12:27:21 +00001786
1787
Victor Stinnerf3151422020-09-08 15:33:52 +02001788static int
1789marshal_module_exec(PyObject *mod)
1790{
1791 if (PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION) < 0) {
1792 return -1;
1793 }
1794 return 0;
1795}
1796
1797static PyModuleDef_Slot marshalmodule_slots[] = {
1798 {Py_mod_exec, marshal_module_exec},
1799 {0, NULL}
1800};
R. David Murraydd226ea2009-05-13 12:27:21 +00001801
Brett Cannon429ef652008-06-27 00:35:35 +00001802static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 PyModuleDef_HEAD_INIT,
Victor Stinnerf3151422020-09-08 15:33:52 +02001804 .m_name = "marshal",
1805 .m_doc = module_doc,
1806 .m_methods = marshal_methods,
1807 .m_slots = marshalmodule_slots,
Martin v. Löwis1a214512008-06-11 05:26:20 +00001808};
1809
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001810PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001811PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001812{
Victor Stinnerf3151422020-09-08 15:33:52 +02001813 return PyModuleDef_Init(&marshalmodule);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001814}