blob: a9ba7a436fd19d279f1e70483e5c41af0da76097 [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);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100533 w_long(co->co_posonlyargcount, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 w_long(co->co_kwonlyargcount, p);
535 w_long(co->co_nlocals, p);
536 w_long(co->co_stacksize, p);
537 w_long(co->co_flags, p);
538 w_object(co->co_code, p);
539 w_object(co->co_consts, p);
540 w_object(co->co_names, p);
541 w_object(co->co_varnames, p);
542 w_object(co->co_freevars, p);
543 w_object(co->co_cellvars, p);
544 w_object(co->co_filename, p);
545 w_object(co->co_name, p);
546 w_long(co->co_firstlineno, p);
547 w_object(co->co_lnotab, p);
548 }
549 else if (PyObject_CheckBuffer(v)) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +0200550 /* Write unknown bytes-like objects as a bytes object */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100552 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100554 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100556 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700558 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300559 w_pstring(view.buf, view.len, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100560 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 }
562 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700563 W_TYPE(TYPE_UNKNOWN, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 p->error = WFERR_UNMARSHALLABLE;
565 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000566}
567
Serhiy Storchakace921c622015-02-11 15:53:31 +0200568static int
569w_init_refs(WFILE *wf, int version)
570{
571 if (version >= 3) {
Victor Stinner285cf0a2016-03-21 22:00:58 +0100572 wf->hashtable = _Py_hashtable_new(sizeof(PyObject *), sizeof(int),
573 _Py_hashtable_hash_ptr,
Serhiy Storchakace921c622015-02-11 15:53:31 +0200574 _Py_hashtable_compare_direct);
575 if (wf->hashtable == NULL) {
576 PyErr_NoMemory();
577 return -1;
578 }
579 }
580 return 0;
581}
582
583static int
Victor Stinner285cf0a2016-03-21 22:00:58 +0100584w_decref_entry(_Py_hashtable_t *ht, _Py_hashtable_entry_t *entry,
585 void *Py_UNUSED(data))
Serhiy Storchakace921c622015-02-11 15:53:31 +0200586{
Victor Stinner285cf0a2016-03-21 22:00:58 +0100587 PyObject *entry_key;
588
Victor Stinner5dacbd42016-03-23 09:52:13 +0100589 _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, entry_key);
Victor Stinner285cf0a2016-03-21 22:00:58 +0100590 Py_XDECREF(entry_key);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200591 return 0;
592}
593
594static void
595w_clear_refs(WFILE *wf)
596{
597 if (wf->hashtable != NULL) {
598 _Py_hashtable_foreach(wf->hashtable, w_decref_entry, NULL);
599 _Py_hashtable_destroy(wf->hashtable);
600 }
601}
602
Serhiy Storchaka95949422013-08-27 19:40:23 +0300603/* version currently has no effect for writing ints. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000604void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000605PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000606{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200607 char buf[4];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 WFILE wf;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200609 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 wf.fp = fp;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200611 wf.ptr = wf.buf = buf;
612 wf.end = wf.ptr + sizeof(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 wf.version = version;
615 w_long(x, &wf);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200616 w_flush(&wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000617}
618
619void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000620PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000621{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200622 char buf[BUFSIZ];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 WFILE wf;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200624 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 wf.fp = fp;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200626 wf.ptr = wf.buf = buf;
627 wf.end = wf.ptr + sizeof(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 wf.version = version;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200630 if (w_init_refs(&wf, version))
631 return; /* caller mush check PyErr_Occurred() */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 w_object(x, &wf);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200633 w_clear_refs(&wf);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200634 w_flush(&wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000635}
636
Serhiy Storchakac07422c2015-02-11 16:18:09 +0200637typedef struct {
638 FILE *fp;
639 int depth;
640 PyObject *readable; /* Stream-like object being read from */
Serhiy Storchakac07422c2015-02-11 16:18:09 +0200641 char *ptr;
642 char *end;
643 char *buf;
644 Py_ssize_t buf_size;
645 PyObject *refs; /* a list */
646} RFILE;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000647
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200648static const char *
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200649r_string(Py_ssize_t n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000650{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200651 Py_ssize_t read = -1;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100652
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200653 if (p->ptr != NULL) {
654 /* Fast path for loads() */
655 char *res = p->ptr;
656 Py_ssize_t left = p->end - p->ptr;
657 if (left < n) {
658 PyErr_SetString(PyExc_EOFError,
659 "marshal data too short");
660 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100661 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200662 p->ptr += n;
663 return res;
664 }
665 if (p->buf == NULL) {
666 p->buf = PyMem_MALLOC(n);
667 if (p->buf == NULL) {
668 PyErr_NoMemory();
669 return NULL;
670 }
671 p->buf_size = n;
672 }
673 else if (p->buf_size < n) {
Zackery Spytz4c49da02018-12-07 03:11:30 -0700674 char *tmp = PyMem_REALLOC(p->buf, n);
675 if (tmp == NULL) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200676 PyErr_NoMemory();
677 return NULL;
678 }
Zackery Spytz4c49da02018-12-07 03:11:30 -0700679 p->buf = tmp;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200680 p->buf_size = n;
681 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100682
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200683 if (!p->readable) {
684 assert(p->fp != NULL);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200685 read = fread(p->buf, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100686 }
687 else {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200688 _Py_IDENTIFIER(readinto);
689 PyObject *res, *mview;
690 Py_buffer buf;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200691
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200692 if (PyBuffer_FillInfo(&buf, NULL, p->buf, n, 0, PyBUF_CONTIG) == -1)
693 return NULL;
694 mview = PyMemoryView_FromBuffer(&buf);
695 if (mview == NULL)
696 return NULL;
697
698 res = _PyObject_CallMethodId(p->readable, &PyId_readinto, "N", mview);
699 if (res != NULL) {
700 read = PyNumber_AsSsize_t(res, PyExc_ValueError);
701 Py_DECREF(res);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100702 }
703 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200704 if (read != n) {
705 if (!PyErr_Occurred()) {
706 if (read > n)
707 PyErr_Format(PyExc_ValueError,
708 "read() returned too much data: "
709 "%zd bytes requested, %zd returned",
710 n, read);
711 else
712 PyErr_SetString(PyExc_EOFError,
713 "EOF read where not expected");
714 }
715 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100716 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200717 return p->buf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100718}
719
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100720static int
721r_byte(RFILE *p)
722{
723 int c = EOF;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100724
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200725 if (p->ptr != NULL) {
726 if (p->ptr < p->end)
727 c = (unsigned char) *p->ptr++;
728 return c;
729 }
730 if (!p->readable) {
731 assert(p->fp);
732 c = getc(p->fp);
733 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100734 else {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200735 const char *ptr = r_string(1, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200736 if (ptr != NULL)
Miss Islington (bot)190433d2020-02-11 18:47:20 -0800737 c = *(const unsigned char *) ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100738 }
739 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000740}
741
742static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000743r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000744{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200745 short x = -1;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200746 const unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100747
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200748 buffer = (const unsigned char *) r_string(2, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200749 if (buffer != NULL) {
750 x = buffer[0];
751 x |= buffer[1] << 8;
752 /* Sign-extension, in case short greater than 16 bits */
753 x |= -(x & 0x8000);
754 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000755 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000756}
757
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000758static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000759r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000760{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200761 long x = -1;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200762 const unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100763
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200764 buffer = (const unsigned char *) r_string(4, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200765 if (buffer != NULL) {
766 x = buffer[0];
767 x |= (long)buffer[1] << 8;
768 x |= (long)buffer[2] << 16;
769 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000770#if SIZEOF_LONG > 4
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200771 /* Sign extension for 64-bit machines */
772 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000773#endif
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200774 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000776}
777
Serhiy Storchaka00987f62017-11-15 17:41:05 +0200778/* r_long64 deals with the TYPE_INT64 code. */
779static PyObject *
780r_long64(RFILE *p)
781{
782 const unsigned char *buffer = (const unsigned char *) r_string(8, p);
783 if (buffer == NULL) {
784 return NULL;
785 }
786 return _PyLong_FromByteArray(buffer, 8,
787 1 /* little endian */,
788 1 /* signed */);
789}
790
Guido van Rossum79f25d91997-04-29 20:08:16 +0000791static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000792r_PyLong(RFILE *p)
793{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200795 long n, size, i;
796 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100800 if (PyErr_Occurred())
801 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 if (n == 0)
803 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200804 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 PyErr_SetString(PyExc_ValueError,
806 "bad marshal data (long size out of range)");
807 return NULL;
808 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000809
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200810 size = 1 + (Py_ABS(n) - 1) / PyLong_MARSHAL_RATIO;
811 shorts_in_top_digit = 1 + (Py_ABS(n) - 1) % PyLong_MARSHAL_RATIO;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 ob = _PyLong_New(size);
813 if (ob == NULL)
814 return NULL;
Victor Stinner763b0d12013-10-31 16:56:38 +0100815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 for (i = 0; i < size-1; i++) {
819 d = 0;
820 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
821 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100822 if (PyErr_Occurred()) {
823 Py_DECREF(ob);
824 return NULL;
825 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 if (md < 0 || md > PyLong_MARSHAL_BASE)
827 goto bad_digit;
828 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
829 }
830 ob->ob_digit[i] = d;
831 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 d = 0;
834 for (j=0; j < shorts_in_top_digit; j++) {
835 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100836 if (PyErr_Occurred()) {
837 Py_DECREF(ob);
838 return NULL;
839 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 if (md < 0 || md > PyLong_MARSHAL_BASE)
841 goto bad_digit;
842 /* topmost marshal digit should be nonzero */
843 if (md == 0 && j == shorts_in_top_digit - 1) {
844 Py_DECREF(ob);
845 PyErr_SetString(PyExc_ValueError,
846 "bad marshal data (unnormalized long data)");
847 return NULL;
848 }
849 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
850 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100851 if (PyErr_Occurred()) {
852 Py_DECREF(ob);
853 return NULL;
854 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 /* top digit should be nonzero, else the resulting PyLong won't be
856 normalized */
857 ob->ob_digit[size-1] = d;
858 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000859 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 Py_DECREF(ob);
861 PyErr_SetString(PyExc_ValueError,
862 "bad marshal data (digit out of range in long)");
863 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000864}
865
Serhiy Storchakac5734992018-07-24 10:55:47 +0300866static double
867r_float_bin(RFILE *p)
868{
869 const unsigned char *buf = (const unsigned char *) r_string(8, p);
870 if (buf == NULL)
871 return -1;
872 return _PyFloat_Unpack8(buf, 1);
873}
874
875/* Issue #33720: Disable inlining for reducing the C stack consumption
876 on PGO builds. */
877_Py_NO_INLINE static double
878r_float_str(RFILE *p)
879{
880 int n;
881 char buf[256];
882 const char *ptr;
883 n = r_byte(p);
884 if (n == EOF) {
885 PyErr_SetString(PyExc_EOFError,
886 "EOF read where object expected");
887 return -1;
888 }
889 ptr = r_string(n, p);
890 if (ptr == NULL) {
891 return -1;
892 }
893 memcpy(buf, ptr, n);
894 buf[n] = '\0';
895 return PyOS_string_to_double(buf, NULL, NULL);
896}
897
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700898/* allocate the reflist index for a new object. Return -1 on failure */
899static Py_ssize_t
900r_ref_reserve(int flag, RFILE *p)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700901{
902 if (flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200903 Py_ssize_t idx = PyList_GET_SIZE(p->refs);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700904 if (idx >= 0x7ffffffe) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700905 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700906 return -1;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700907 }
908 if (PyList_Append(p->refs, Py_None) < 0)
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700909 return -1;
910 return idx;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700911 } else
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700912 return 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700913}
914
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700915/* insert the new object 'o' to the reflist at previously
916 * allocated index 'idx'.
917 * 'o' can be NULL, in which case nothing is done.
918 * if 'o' was non-NULL, and the function succeeds, 'o' is returned.
919 * if 'o' was non-NULL, and the function fails, 'o' is released and
920 * NULL returned. This simplifies error checking at the call site since
921 * a single test for NULL for the function result is enough.
922 */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700923static PyObject *
924r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
925{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700926 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200927 PyObject *tmp = PyList_GET_ITEM(p->refs, idx);
928 Py_INCREF(o);
929 PyList_SET_ITEM(p->refs, idx, o);
930 Py_DECREF(tmp);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700931 }
932 return o;
933}
934
935/* combination of both above, used when an object can be
936 * created whenever it is seen in the file, as opposed to
937 * after having loaded its sub-objects.
938 */
939static PyObject *
940r_ref(PyObject *o, int flag, RFILE *p)
941{
Victor Stinner359fabc2013-10-31 17:09:01 +0100942 assert(flag & FLAG_REF);
943 if (o == NULL)
944 return NULL;
945 if (PyList_Append(p->refs, o) < 0) {
946 Py_DECREF(o); /* release the new object */
947 return NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700948 }
949 return o;
950}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000951
952static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000953r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000954{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 /* NULL is a valid return value, it does not necessarily means that
956 an exception is set. */
957 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500958 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700960 int type, code = r_byte(p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200961 int flag, is_interned = 0;
Christian Heimes35728422013-10-13 02:29:06 +0200962 PyObject *retval = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000963
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700964 if (code == EOF) {
965 PyErr_SetString(PyExc_EOFError,
966 "EOF read where object expected");
967 return NULL;
968 }
969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
973 p->depth--;
974 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
975 return NULL;
976 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000977
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700978 flag = code & FLAG_REF;
979 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700980
981#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700982 if (flag) \
983 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700984} while (0)
985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 case TYPE_NULL:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 case TYPE_NONE:
992 Py_INCREF(Py_None);
993 retval = Py_None;
994 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 case TYPE_STOPITER:
997 Py_INCREF(PyExc_StopIteration);
998 retval = PyExc_StopIteration;
999 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00001000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 case TYPE_ELLIPSIS:
1002 Py_INCREF(Py_Ellipsis);
1003 retval = Py_Ellipsis;
1004 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 case TYPE_FALSE:
1007 Py_INCREF(Py_False);
1008 retval = Py_False;
1009 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +00001010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 case TYPE_TRUE:
1012 Py_INCREF(Py_True);
1013 retval = Py_True;
1014 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +00001015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001017 n = r_long(p);
1018 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001019 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001021
Serhiy Storchaka00987f62017-11-15 17:41:05 +02001022 case TYPE_INT64:
1023 retval = r_long64(p);
1024 R_REF(retval);
1025 break;
1026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 case TYPE_LONG:
1028 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001029 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 case TYPE_FLOAT:
1033 {
Serhiy Storchakac5734992018-07-24 10:55:47 +03001034 double x = r_float_str(p);
1035 if (x == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 break;
Serhiy Storchakac5734992018-07-24 10:55:47 +03001037 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001038 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 break;
1040 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 case TYPE_BINARY_FLOAT:
1043 {
Serhiy Storchakac5734992018-07-24 10:55:47 +03001044 double x = r_float_bin(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001045 if (x == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001048 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 break;
1050 }
Michael W. Hudsondf888462005-06-03 14:41:55 +00001051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 case TYPE_COMPLEX:
1053 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 Py_complex c;
Serhiy Storchakac5734992018-07-24 10:55:47 +03001055 c.real = r_float_str(p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 if (c.real == -1.0 && PyErr_Occurred())
1057 break;
Serhiy Storchakac5734992018-07-24 10:55:47 +03001058 c.imag = r_float_str(p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 if (c.imag == -1.0 && PyErr_Occurred())
1060 break;
1061 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001062 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 break;
1064 }
Michael W. Hudsondf888462005-06-03 14:41:55 +00001065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 case TYPE_BINARY_COMPLEX:
1067 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 Py_complex c;
Serhiy Storchakac5734992018-07-24 10:55:47 +03001069 c.real = r_float_bin(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001070 if (c.real == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 break;
Serhiy Storchakac5734992018-07-24 10:55:47 +03001072 c.imag = r_float_bin(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001073 if (c.imag == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001076 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 break;
1078 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 case TYPE_STRING:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001081 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001082 const char *ptr;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001083 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001084 if (PyErr_Occurred())
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001085 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001086 if (n < 0 || n > SIZE32_MAX) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001087 PyErr_SetString(PyExc_ValueError, "bad marshal data (bytes object size out of range)");
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001088 break;
1089 }
1090 v = PyBytes_FromStringAndSize((char *)NULL, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001091 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001092 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001093 ptr = r_string(n, p);
1094 if (ptr == NULL) {
1095 Py_DECREF(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001096 break;
1097 }
1098 memcpy(PyBytes_AS_STRING(v), ptr, n);
1099 retval = v;
1100 R_REF(retval);
1101 break;
1102 }
1103
1104 case TYPE_ASCII_INTERNED:
1105 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001106 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001107 case TYPE_ASCII:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001109 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001110 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001111 if (n < 0 || n > SIZE32_MAX) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001112 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 break;
1114 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001115 goto _read_ascii;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001116
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001117 case TYPE_SHORT_ASCII_INTERNED:
1118 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001119 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001120 case TYPE_SHORT_ASCII:
1121 n = r_byte(p);
1122 if (n == EOF) {
1123 PyErr_SetString(PyExc_EOFError,
1124 "EOF read where object expected");
1125 break;
1126 }
1127 _read_ascii:
1128 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001129 const char *ptr;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001130 ptr = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001131 if (ptr == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001132 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001133 v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001134 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001135 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001136 if (is_interned)
1137 PyUnicode_InternInPlace(&v);
1138 retval = v;
1139 R_REF(retval);
1140 break;
1141 }
1142
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001143 case TYPE_INTERNED:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001144 is_interned = 1;
Stefan Krahf432a322017-08-21 13:09:59 +02001145 /* fall through */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001146 case TYPE_UNICODE:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 {
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001148 const char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +00001149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001151 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001152 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001153 if (n < 0 || n > SIZE32_MAX) {
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001154 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 break;
1156 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001157 if (n != 0) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001158 buffer = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001159 if (buffer == NULL)
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001160 break;
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001161 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001163 else {
1164 v = PyUnicode_New(0, 0);
1165 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001166 if (v == NULL)
Victor Stinner3a8b79d2013-07-08 22:23:32 +02001167 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001168 if (is_interned)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001169 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001171 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 break;
1173 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001174
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001175 case TYPE_SMALL_TUPLE:
1176 n = (unsigned char) r_byte(p);
Victor Stinnerb1b7b182013-10-31 17:07:08 +01001177 if (PyErr_Occurred())
1178 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001179 goto _read_tuple;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 case TYPE_TUPLE:
1181 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001182 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001183 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001184 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 break;
1187 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001188 _read_tuple:
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001189 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001190 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001191 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 break;
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 for (i = 0; i < n; i++) {
1195 v2 = r_object(p);
1196 if ( v2 == NULL ) {
1197 if (!PyErr_Occurred())
1198 PyErr_SetString(PyExc_TypeError,
1199 "NULL object in marshal data for tuple");
1200 Py_DECREF(v);
1201 v = NULL;
1202 break;
1203 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001204 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 }
1206 retval = v;
1207 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 case TYPE_LIST:
1210 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001211 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001212 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001213 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 break;
1216 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001217 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001218 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001219 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 for (i = 0; i < n; i++) {
1222 v2 = r_object(p);
1223 if ( v2 == NULL ) {
1224 if (!PyErr_Occurred())
1225 PyErr_SetString(PyExc_TypeError,
1226 "NULL object in marshal data for list");
1227 Py_DECREF(v);
1228 v = NULL;
1229 break;
1230 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001231 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 }
1233 retval = v;
1234 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 case TYPE_DICT:
1237 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001238 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001239 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 for (;;) {
1242 PyObject *key, *val;
1243 key = r_object(p);
1244 if (key == NULL)
1245 break;
1246 val = r_object(p);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001247 if (val == NULL) {
1248 Py_DECREF(key);
1249 break;
1250 }
1251 if (PyDict_SetItem(v, key, val) < 0) {
1252 Py_DECREF(key);
1253 Py_DECREF(val);
1254 break;
1255 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 Py_DECREF(key);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001257 Py_DECREF(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 }
1259 if (PyErr_Occurred()) {
1260 Py_DECREF(v);
1261 v = NULL;
1262 }
1263 retval = v;
1264 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 case TYPE_SET:
1267 case TYPE_FROZENSET:
1268 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001269 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001270 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001271 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 break;
1274 }
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001275
Victor Stinner1aa78932016-01-23 14:15:48 +01001276 if (n == 0 && type == TYPE_FROZENSET) {
1277 /* call frozenset() to get the empty frozenset singleton */
Victor Stinner4778eab2016-12-01 14:51:04 +01001278 v = _PyObject_CallNoArg((PyObject*)&PyFrozenSet_Type);
Victor Stinner1aa78932016-01-23 14:15:48 +01001279 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 break;
Victor Stinner1aa78932016-01-23 14:15:48 +01001281 R_REF(v);
1282 retval = v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 }
Victor Stinner1aa78932016-01-23 14:15:48 +01001284 else {
1285 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
1286 if (type == TYPE_SET) {
1287 R_REF(v);
1288 } else {
1289 /* must use delayed registration of frozensets because they must
1290 * be init with a refcount of 1
1291 */
1292 idx = r_ref_reserve(flag, p);
1293 if (idx < 0)
1294 Py_CLEAR(v); /* signal error */
1295 }
1296 if (v == NULL)
1297 break;
1298
1299 for (i = 0; i < n; i++) {
1300 v2 = r_object(p);
1301 if ( v2 == NULL ) {
1302 if (!PyErr_Occurred())
1303 PyErr_SetString(PyExc_TypeError,
1304 "NULL object in marshal data for set");
1305 Py_DECREF(v);
1306 v = NULL;
1307 break;
1308 }
1309 if (PySet_Add(v, v2) == -1) {
1310 Py_DECREF(v);
1311 Py_DECREF(v2);
1312 v = NULL;
1313 break;
1314 }
1315 Py_DECREF(v2);
1316 }
1317 if (type != TYPE_SET)
1318 v = r_ref_insert(v, idx, flag, p);
1319 retval = v;
1320 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 case TYPE_CODE:
1324 {
1325 int argcount;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001326 int posonlyargcount;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 int kwonlyargcount;
1328 int nlocals;
1329 int stacksize;
1330 int flags;
1331 PyObject *code = NULL;
1332 PyObject *consts = NULL;
1333 PyObject *names = NULL;
1334 PyObject *varnames = NULL;
1335 PyObject *freevars = NULL;
1336 PyObject *cellvars = NULL;
1337 PyObject *filename = NULL;
1338 PyObject *name = NULL;
1339 int firstlineno;
1340 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001341
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001342 idx = r_ref_reserve(flag, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001343 if (idx < 0)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001344 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 /* XXX ignore long->int overflows for now */
1349 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001350 if (PyErr_Occurred())
1351 goto code_error;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001352 posonlyargcount = (int)r_long(p);
1353 if (PyErr_Occurred()) {
1354 goto code_error;
1355 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 kwonlyargcount = (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 nlocals = (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 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001363 if (PyErr_Occurred())
1364 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001366 if (PyErr_Occurred())
1367 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 code = r_object(p);
1369 if (code == NULL)
1370 goto code_error;
1371 consts = r_object(p);
1372 if (consts == NULL)
1373 goto code_error;
1374 names = r_object(p);
1375 if (names == NULL)
1376 goto code_error;
1377 varnames = r_object(p);
1378 if (varnames == NULL)
1379 goto code_error;
1380 freevars = r_object(p);
1381 if (freevars == NULL)
1382 goto code_error;
1383 cellvars = r_object(p);
1384 if (cellvars == NULL)
1385 goto code_error;
1386 filename = r_object(p);
1387 if (filename == NULL)
1388 goto code_error;
1389 name = r_object(p);
1390 if (name == NULL)
1391 goto code_error;
1392 firstlineno = (int)r_long(p);
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001393 if (firstlineno == -1 && PyErr_Occurred())
1394 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 lnotab = r_object(p);
1396 if (lnotab == NULL)
1397 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001398
Miss Islington (bot)c1d91652020-07-03 14:13:29 -07001399 if (PySys_Audit("code.__new__", "OOOiiiiii",
1400 code, filename, name, argcount, posonlyargcount,
1401 kwonlyargcount, nlocals, stacksize, flags) < 0) {
1402 goto code_error;
1403 }
1404
Miss Islington (bot)cb083f72019-07-01 04:29:14 -07001405 v = (PyObject *) PyCode_NewWithPosOnlyArgs(
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001406 argcount, posonlyargcount, kwonlyargcount,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 nlocals, stacksize, flags,
1408 code, consts, names, varnames,
1409 freevars, cellvars, filename, name,
1410 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001411 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 code_error:
1414 Py_XDECREF(code);
1415 Py_XDECREF(consts);
1416 Py_XDECREF(names);
1417 Py_XDECREF(varnames);
1418 Py_XDECREF(freevars);
1419 Py_XDECREF(cellvars);
1420 Py_XDECREF(filename);
1421 Py_XDECREF(name);
1422 Py_XDECREF(lnotab);
1423 }
1424 retval = v;
1425 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001426
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001427 case TYPE_REF:
1428 n = r_long(p);
1429 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001430 if (n == -1 && PyErr_Occurred())
1431 break;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001432 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001433 break;
1434 }
1435 v = PyList_GET_ITEM(p->refs, n);
1436 if (v == Py_None) {
1437 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001438 break;
1439 }
1440 Py_INCREF(v);
1441 retval = v;
1442 break;
1443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 default:
1445 /* Bogus data got written, which isn't ideal.
1446 This will let you keep working and recover. */
1447 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 break;
1449
1450 }
1451 p->depth--;
1452 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001453}
1454
Neal Norwitzd85c4522004-06-13 20:31:49 +00001455static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001456read_object(RFILE *p)
1457{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 PyObject *v;
1459 if (PyErr_Occurred()) {
1460 fprintf(stderr, "XXX readobject called with exception set\n");
1461 return NULL;
1462 }
1463 v = r_object(p);
1464 if (v == NULL && !PyErr_Occurred())
1465 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1466 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001467}
1468
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001469int
1470PyMarshal_ReadShortFromFile(FILE *fp)
1471{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001473 int res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001475 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 rf.fp = fp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 rf.end = rf.ptr = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001478 rf.buf = NULL;
1479 res = r_short(&rf);
1480 if (rf.buf != NULL)
1481 PyMem_FREE(rf.buf);
1482 return res;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001483}
1484
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001485long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001486PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001487{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001489 long res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001491 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001493 rf.buf = NULL;
1494 res = r_long(&rf);
1495 if (rf.buf != NULL)
1496 PyMem_FREE(rf.buf);
1497 return res;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001498}
1499
Steve Dowerf2f373f2015-02-21 08:44:05 -08001500/* Return size of file in bytes; < 0 if unknown or INT_MAX if too big */
Tim Peters691e0e92001-01-18 04:39:16 +00001501static off_t
1502getfilesize(FILE *fp)
1503{
Steve Dowerf2f373f2015-02-21 08:44:05 -08001504 struct _Py_stat_struct st;
Victor Stinnere134a7f2015-03-30 10:09:31 +02001505 if (_Py_fstat_noraise(fileno(fp), &st) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 return -1;
Steve Dowerf2f373f2015-02-21 08:44:05 -08001507#if SIZEOF_OFF_T == 4
1508 else if (st.st_size >= INT_MAX)
1509 return (off_t)INT_MAX;
1510#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 else
Steve Dowerf2f373f2015-02-21 08:44:05 -08001512 return (off_t)st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001513}
Tim Petersd9b9ac82001-01-28 00:27:39 +00001514
Tim Peters691e0e92001-01-18 04:39:16 +00001515/* If we can get the size of the file up-front, and it's reasonably small,
1516 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1517 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001518 * CAUTION: since this may read the entire remainder of the file, don't
1519 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001520 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001521PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001522PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001523{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001524/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001525#define REASONABLE_FILE_LIMIT (1L << 18)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 off_t filesize;
1527 filesize = getfilesize(fp);
1528 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1529 char* pBuf = (char *)PyMem_MALLOC(filesize);
1530 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001531 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1532 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 PyMem_FREE(pBuf);
1534 return v;
1535 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 /* We don't have fstat, or we do but the file is larger than
1539 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1540 */
1541 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001542
Tim Peters691e0e92001-01-18 04:39:16 +00001543#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001544}
1545
Guido van Rossum79f25d91997-04-29 20:08:16 +00001546PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001547PyMarshal_ReadObjectFromFile(FILE *fp)
1548{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 RFILE rf;
1550 PyObject *result;
1551 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001552 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 rf.depth = 0;
1554 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001555 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001556 rf.refs = PyList_New(0);
1557 if (rf.refs == NULL)
1558 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001560 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001561 if (rf.buf != NULL)
1562 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001564}
1565
1566PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03001567PyMarshal_ReadObjectFromString(const char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001568{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 RFILE rf;
1570 PyObject *result;
1571 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001572 rf.readable = NULL;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001573 rf.ptr = (char *)str;
1574 rf.end = (char *)str + len;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001575 rf.buf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001577 rf.refs = PyList_New(0);
1578 if (rf.refs == NULL)
1579 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001581 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001582 if (rf.buf != NULL)
1583 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001585}
1586
Guido van Rossum79f25d91997-04-29 20:08:16 +00001587PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001588PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001589{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001591
Serhiy Storchakace921c622015-02-11 15:53:31 +02001592 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1594 if (wf.str == NULL)
1595 return NULL;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +02001596 wf.ptr = wf.buf = PyBytes_AS_STRING((PyBytesObject *)wf.str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 wf.end = wf.ptr + PyBytes_Size(wf.str);
1598 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 wf.version = version;
Serhiy Storchakace921c622015-02-11 15:53:31 +02001600 if (w_init_refs(&wf, version)) {
1601 Py_DECREF(wf.str);
1602 return NULL;
1603 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 w_object(x, &wf);
Serhiy Storchakace921c622015-02-11 15:53:31 +02001605 w_clear_refs(&wf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 if (wf.str != NULL) {
1607 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1608 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1609 Py_DECREF(wf.str);
1610 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001611 "too much marshal data for a bytes object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 return NULL;
1613 }
1614 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1615 return NULL;
1616 }
1617 if (wf.error != WFERR_OK) {
1618 Py_XDECREF(wf.str);
1619 if (wf.error == WFERR_NOMEMORY)
1620 PyErr_NoMemory();
1621 else
1622 PyErr_SetString(PyExc_ValueError,
1623 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1624 :"object too deeply nested to marshal");
1625 return NULL;
1626 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001627 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001628}
1629
Guido van Rossum64b45521991-06-07 13:58:22 +00001630/* And an interface for Python programs... */
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001631/*[clinic input]
1632marshal.dump
1633
1634 value: object
1635 Must be a supported type.
1636 file: object
1637 Must be a writeable binary file.
1638 version: int(c_default="Py_MARSHAL_VERSION") = version
1639 Indicates the data format that dump should use.
1640 /
1641
1642Write the value on the open file.
1643
1644If the value has (or contains an object that has) an unsupported type, a
1645ValueError exception is raised - but garbage data will also be written
1646to the file. The object will not be properly read back by load().
1647[clinic start generated code]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001648
Guido van Rossum79f25d91997-04-29 20:08:16 +00001649static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001650marshal_dump_impl(PyObject *module, PyObject *value, PyObject *file,
1651 int version)
1652/*[clinic end generated code: output=aaee62c7028a7cb2 input=6c7a3c23c6fef556]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001653{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 /* XXX Quick hack -- need to do this differently */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 PyObject *s;
1656 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001657 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001658
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001659 s = PyMarshal_WriteObjectToString(value, version);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 if (s == NULL)
1661 return NULL;
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001662 res = _PyObject_CallMethodIdObjArgs(file, &PyId_write, s, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 Py_DECREF(s);
1664 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001665}
1666
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001667/*[clinic input]
1668marshal.load
1669
1670 file: object
1671 Must be readable binary file.
1672 /
1673
1674Read one value from the open file and return it.
1675
1676If no valid value is read (e.g. because the data has a different Python
1677version's incompatible marshal format), raise EOFError, ValueError or
1678TypeError.
1679
1680Note: If an object containing an unsupported type was marshalled with
1681dump(), load() will substitute None for the unmarshallable type.
1682[clinic start generated code]*/
R. David Murraydd226ea2009-05-13 12:27:21 +00001683
Guido van Rossum79f25d91997-04-29 20:08:16 +00001684static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001685marshal_load(PyObject *module, PyObject *file)
1686/*[clinic end generated code: output=f8e5c33233566344 input=c85c2b594cd8124a]*/
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001689 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001691
1692 /*
1693 * Make a call to the read method, but read zero bytes.
1694 * This is to ensure that the object passed in at least
1695 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001696 * This can be removed if we guarantee good error handling
1697 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001698 */
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001699 data = _PyObject_CallMethodId(file, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 if (data == NULL)
1701 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001702 if (!PyBytes_Check(data)) {
1703 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001704 "file.read() returned not bytes but %.100s",
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001705 data->ob_type->tp_name);
1706 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 }
1708 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001709 rf.depth = 0;
1710 rf.fp = NULL;
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001711 rf.readable = file;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001712 rf.ptr = rf.end = NULL;
1713 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001714 if ((rf.refs = PyList_New(0)) != NULL) {
1715 result = read_object(&rf);
1716 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001717 if (rf.buf != NULL)
1718 PyMem_FREE(rf.buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001719 } else
1720 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 Py_DECREF(data);
1723 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001724}
1725
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001726/*[clinic input]
1727marshal.dumps
R. David Murraydd226ea2009-05-13 12:27:21 +00001728
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001729 value: object
1730 Must be a supported type.
1731 version: int(c_default="Py_MARSHAL_VERSION") = version
1732 Indicates the data format that dumps should use.
1733 /
1734
1735Return the bytes object that would be written to a file by dump(value, file).
1736
1737Raise a ValueError exception if value has (or contains an object that has) an
1738unsupported type.
1739[clinic start generated code]*/
R. David Murraydd226ea2009-05-13 12:27:21 +00001740
Guido van Rossum79f25d91997-04-29 20:08:16 +00001741static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001742marshal_dumps_impl(PyObject *module, PyObject *value, int version)
1743/*[clinic end generated code: output=9c200f98d7256cad input=a2139ea8608e9b27]*/
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001744{
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001745 return PyMarshal_WriteObjectToString(value, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001746}
1747
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001748/*[clinic input]
1749marshal.loads
R. David Murraydd226ea2009-05-13 12:27:21 +00001750
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001751 bytes: Py_buffer
1752 /
1753
1754Convert the bytes-like object to a value.
1755
1756If no valid value is found, raise EOFError, ValueError or TypeError. Extra
1757bytes in the input are ignored.
1758[clinic start generated code]*/
R. David Murraydd226ea2009-05-13 12:27:21 +00001759
Guido van Rossum79f25d91997-04-29 20:08:16 +00001760static PyObject *
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001761marshal_loads_impl(PyObject *module, Py_buffer *bytes)
1762/*[clinic end generated code: output=9fc65985c93d1bb1 input=6f426518459c8495]*/
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001763{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 RFILE rf;
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001765 char *s = bytes->buf;
1766 Py_ssize_t n = bytes->len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 PyObject* result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001769 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 rf.ptr = s;
1771 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001773 if ((rf.refs = PyList_New(0)) == NULL)
1774 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 result = read_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001776 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001778}
1779
Guido van Rossum79f25d91997-04-29 20:08:16 +00001780static PyMethodDef marshal_methods[] = {
Serhiy Storchaka0767ad42017-03-12 09:20:15 +02001781 MARSHAL_DUMP_METHODDEF
1782 MARSHAL_LOAD_METHODDEF
1783 MARSHAL_DUMPS_METHODDEF
1784 MARSHAL_LOADS_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001786};
1787
R. David Murraydd226ea2009-05-13 12:27:21 +00001788
1789PyDoc_STRVAR(module_doc,
1790"This module contains functions that can read and write Python values in\n\
1791a binary format. The format is specific to Python, but independent of\n\
1792machine architecture issues.\n\
1793\n\
1794Not all Python object types are supported; in general, only objects\n\
1795whose value is independent from a particular invocation of Python can be\n\
1796written and read by this module. The following types are supported:\n\
1797None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1798tuples, lists, sets, dictionaries, and code objects, where it\n\
1799should be understood that tuples, lists and dictionaries are only\n\
1800supported as long as the values contained therein are themselves\n\
1801supported; and recursive lists and dictionaries should not be written\n\
1802(they will cause infinite loops).\n\
1803\n\
1804Variables:\n\
1805\n\
1806version -- indicates the format that the module uses. Version 0 is the\n\
1807 historical format, version 1 shares interned strings and version 2\n\
1808 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001809 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001810\n\
1811Functions:\n\
1812\n\
1813dump() -- write value to a file\n\
1814load() -- read value from a file\n\
Serhiy Storchakac611a5b2017-03-12 08:53:22 +02001815dumps() -- marshal value as a bytes object\n\
1816loads() -- read value from a bytes-like object");
R. David Murraydd226ea2009-05-13 12:27:21 +00001817
1818
1819
Brett Cannon429ef652008-06-27 00:35:35 +00001820static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 PyModuleDef_HEAD_INIT,
1822 "marshal",
1823 module_doc,
1824 0,
1825 marshal_methods,
1826 NULL,
1827 NULL,
1828 NULL,
1829 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001830};
1831
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001832PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001833PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001834{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 PyObject *mod = PyModule_Create(&marshalmodule);
1836 if (mod == NULL)
1837 return NULL;
Miss Islington (bot)2ea4c37c2019-11-20 02:16:02 -08001838 if (PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION) < 0) {
1839 Py_DECREF(mod);
1840 return NULL;
1841 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001843}