blob: 1997e1964f20531b25c16e9ee351b3265cade00b [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"
15
Mark Dickinsonbd792642009-03-18 20:06:12 +000016#define ABS(x) ((x) < 0 ? -(x) : (x))
17
Fred Drake6da0b912000-06-28 18:47:56 +000018/* High water mark to determine when the marshalled object is dangerously deep
19 * and risks coring the interpreter. When the object stack gets this deep,
20 * raise an exception instead of continuing.
Guido van Rossum63175a12007-08-29 20:39:13 +000021 * On Windows debug builds, reduce this value.
Fred Drake6da0b912000-06-28 18:47:56 +000022 */
Guido van Rossum63175a12007-08-29 20:39:13 +000023#if defined(MS_WINDOWS) && defined(_DEBUG)
24#define MAX_MARSHAL_STACK_DEPTH 1500
25#else
Guido van Rossumd59da4b2007-05-22 18:11:13 +000026#define MAX_MARSHAL_STACK_DEPTH 2000
Guido van Rossum63175a12007-08-29 20:39:13 +000027#endif
Fred Drake6da0b912000-06-28 18:47:56 +000028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000029#define TYPE_NULL '0'
30#define TYPE_NONE 'N'
31#define TYPE_FALSE 'F'
32#define TYPE_TRUE 'T'
33#define TYPE_STOPITER 'S'
34#define TYPE_ELLIPSIS '.'
35#define TYPE_INT 'i'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000036#define TYPE_FLOAT 'f'
37#define TYPE_BINARY_FLOAT 'g'
38#define TYPE_COMPLEX 'x'
39#define TYPE_BINARY_COMPLEX 'y'
40#define TYPE_LONG 'l'
41#define TYPE_STRING 's'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070042#define TYPE_INTERNED 't'
43#define TYPE_REF 'r'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044#define TYPE_TUPLE '('
45#define TYPE_LIST '['
46#define TYPE_DICT '{'
47#define TYPE_CODE 'c'
48#define TYPE_UNICODE 'u'
49#define TYPE_UNKNOWN '?'
50#define TYPE_SET '<'
51#define TYPE_FROZENSET '>'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070052#define FLAG_REF '\x80' /* with a type, add obj to index */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000053
Eric Smithb1a03cf2009-04-21 11:57:38 +000054#define WFERR_OK 0
55#define WFERR_UNMARSHALLABLE 1
56#define WFERR_NESTEDTOODEEP 2
57#define WFERR_NOMEMORY 3
58
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000059typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 FILE *fp;
61 int error; /* see WFERR_* values */
62 int depth;
63 /* If fp == NULL, the following are valid: */
Éric Araujo6c0ba442011-07-26 17:23:57 +020064 PyObject *readable; /* Stream-like object being read from */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 PyObject *str;
Benjamin Peterson43b06862011-05-27 09:08:01 -050066 PyObject *current_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 char *ptr;
68 char *end;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070069 PyObject *refs; /* dict on marshal, list on unmarshal */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070 int version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000071} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000072
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000073#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
75 else w_more(c, p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000076
77static void
Fredrik Lundh11534382000-07-23 18:24:06 +000078w_more(int c, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000079{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000080 Py_ssize_t size, newsize;
81 if (p->str == NULL)
82 return; /* An error already occurred */
83 size = PyBytes_Size(p->str);
84 newsize = size + size + 1024;
85 if (newsize > 32*1024*1024) {
86 newsize = size + (size >> 3); /* 12.5% overallocation */
87 }
88 if (_PyBytes_Resize(&p->str, newsize) != 0) {
89 p->ptr = p->end = NULL;
90 }
91 else {
92 p->ptr = PyBytes_AS_STRING((PyBytesObject *)p->str) + size;
93 p->end =
94 PyBytes_AS_STRING((PyBytesObject *)p->str) + newsize;
95 *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char);
96 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000097}
98
99static void
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300100w_string(const char *s, Py_ssize_t n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000101{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 if (p->fp != NULL) {
103 fwrite(s, 1, n, p->fp);
104 }
105 else {
106 while (--n >= 0) {
107 w_byte(*s, p);
108 s++;
109 }
110 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000111}
112
113static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000114w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 w_byte((char)( x & 0xff), p);
117 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000118}
119
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000120static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000121w_long(long x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000123 w_byte((char)( x & 0xff), p);
124 w_byte((char)((x>> 8) & 0xff), p);
125 w_byte((char)((x>>16) & 0xff), p);
126 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000127}
128
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200129#define SIZE32_MAX 0x7FFFFFFF
130
131#if SIZEOF_SIZE_T > 4
132# define W_SIZE(n, p) do { \
133 if ((n) > SIZE32_MAX) { \
134 (p)->depth--; \
135 (p)->error = WFERR_UNMARSHALLABLE; \
136 return; \
137 } \
138 w_long((long)(n), p); \
139 } while(0)
140#else
141# define W_SIZE w_long
142#endif
143
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300144static void
145w_pstring(const char *s, Py_ssize_t n, WFILE *p)
146{
147 W_SIZE(n, p);
148 w_string(s, n, p);
149}
150
Mark Dickinsonbd792642009-03-18 20:06:12 +0000151/* We assume that Python longs are stored internally in base some power of
152 2**15; for the sake of portability we'll always read and write them in base
153 exactly 2**15. */
154
155#define PyLong_MARSHAL_SHIFT 15
156#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
157#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
158#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
159#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
160#endif
161#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
162
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700163#define W_TYPE(t, p) do { \
164 w_byte((t) | flag, (p)); \
165} while(0)
166
Mark Dickinsonbd792642009-03-18 20:06:12 +0000167static void
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700168w_PyLong(const PyLongObject *ob, char flag, WFILE *p)
Mark Dickinsonbd792642009-03-18 20:06:12 +0000169{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000170 Py_ssize_t i, j, n, l;
171 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000172
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700173 W_TYPE(TYPE_LONG, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 if (Py_SIZE(ob) == 0) {
175 w_long((long)0, p);
176 return;
177 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000179 /* set l to number of base PyLong_MARSHAL_BASE digits */
180 n = ABS(Py_SIZE(ob));
181 l = (n-1) * PyLong_MARSHAL_RATIO;
182 d = ob->ob_digit[n-1];
183 assert(d != 0); /* a PyLong is always normalized */
184 do {
185 d >>= PyLong_MARSHAL_SHIFT;
186 l++;
187 } while (d != 0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200188 if (l > SIZE32_MAX) {
189 p->depth--;
190 p->error = WFERR_UNMARSHALLABLE;
191 return;
192 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000193 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 for (i=0; i < n-1; i++) {
196 d = ob->ob_digit[i];
197 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
198 w_short(d & PyLong_MARSHAL_MASK, p);
199 d >>= PyLong_MARSHAL_SHIFT;
200 }
201 assert (d == 0);
202 }
203 d = ob->ob_digit[n-1];
204 do {
205 w_short(d & PyLong_MARSHAL_MASK, p);
206 d >>= PyLong_MARSHAL_SHIFT;
207 } while (d != 0);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000208}
209
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700210static int
211w_ref(PyObject *v, char *flag, WFILE *p)
212{
213 PyObject *id;
214 PyObject *idx;
215
216 if (p->version < 3 || p->refs == NULL)
217 return 0; /* not writing object references */
218
219 /* if it has only one reference, it definitely isn't shared */
220 if (Py_REFCNT(v) == 1)
221 return 0;
222
223 id = PyLong_FromVoidPtr((void*)v);
224 if (id == NULL)
225 goto err;
226 idx = PyDict_GetItem(p->refs, id);
227 if (idx != NULL) {
228 /* write the reference index to the stream */
229 long w = PyLong_AsLong(idx);
230 Py_DECREF(id);
231 if (w == -1 && PyErr_Occurred()) {
232 goto err;
233 }
234 /* we don't store "long" indices in the dict */
235 assert(0 <= w && w <= 0x7fffffff);
236 w_byte(TYPE_REF, p);
237 w_long(w, p);
238 return 1;
239 } else {
240 int ok;
241 Py_ssize_t s = PyDict_Size(p->refs);
242 /* we don't support long indices */
243 if (s >= 0x7fffffff) {
244 PyErr_SetString(PyExc_ValueError, "too many objects");
245 goto err;
246 }
247 idx = PyLong_FromSsize_t(s);
248 ok = idx && PyDict_SetItem(p->refs, id, idx) == 0;
249 Py_DECREF(id);
250 Py_XDECREF(idx);
251 if (!ok)
252 goto err;
253 *flag |= FLAG_REF;
254 return 0;
255 }
256err:
257 p->error = WFERR_UNMARSHALLABLE;
258 return 1;
259}
260
261static void
262w_complex_object(PyObject *v, char flag, WFILE *p);
263
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000264static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000265w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000266{
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700267 char flag = '\0';
Fred Drake6da0b912000-06-28 18:47:56 +0000268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
272 p->error = WFERR_NESTEDTOODEEP;
273 }
274 else if (v == NULL) {
275 w_byte(TYPE_NULL, p);
276 }
277 else if (v == Py_None) {
278 w_byte(TYPE_NONE, p);
279 }
280 else if (v == PyExc_StopIteration) {
281 w_byte(TYPE_STOPITER, p);
282 }
283 else if (v == Py_Ellipsis) {
284 w_byte(TYPE_ELLIPSIS, p);
285 }
286 else if (v == Py_False) {
287 w_byte(TYPE_FALSE, p);
288 }
289 else if (v == Py_True) {
290 w_byte(TYPE_TRUE, p);
291 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700292 else if (!w_ref(v, &flag, p))
293 w_complex_object(v, flag, p);
294
295 p->depth--;
296}
297
298static void
299w_complex_object(PyObject *v, char flag, WFILE *p)
300{
301 Py_ssize_t i, n;
302
303 if (PyLong_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 long x = PyLong_AsLong(v);
305 if ((x == -1) && PyErr_Occurred()) {
306 PyLongObject *ob = (PyLongObject *)v;
307 PyErr_Clear();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700308 w_PyLong(ob, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 }
310 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000311#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
313 if (y && y != -1) {
Martin v. Löwis7e395722012-07-28 19:44:05 +0200314 /* Too large for TYPE_INT */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700315 w_PyLong((PyLongObject*)v, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 }
317 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000318#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000319 {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700320 W_TYPE(TYPE_INT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321 w_long(x, p);
322 }
323 }
324 }
325 else if (PyFloat_CheckExact(v)) {
326 if (p->version > 1) {
327 unsigned char buf[8];
328 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
329 buf, 1) < 0) {
330 p->error = WFERR_UNMARSHALLABLE;
331 return;
332 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700333 W_TYPE(TYPE_BINARY_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 w_string((char*)buf, 8, p);
335 }
336 else {
337 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
338 'g', 17, 0, NULL);
339 if (!buf) {
340 p->error = WFERR_NOMEMORY;
341 return;
342 }
343 n = strlen(buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700344 W_TYPE(TYPE_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200346 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 PyMem_Free(buf);
348 }
349 }
350 else if (PyComplex_CheckExact(v)) {
351 if (p->version > 1) {
352 unsigned char buf[8];
353 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
354 buf, 1) < 0) {
355 p->error = WFERR_UNMARSHALLABLE;
356 return;
357 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700358 W_TYPE(TYPE_BINARY_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 w_string((char*)buf, 8, p);
360 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
361 buf, 1) < 0) {
362 p->error = WFERR_UNMARSHALLABLE;
363 return;
364 }
365 w_string((char*)buf, 8, p);
366 }
367 else {
368 char *buf;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700369 W_TYPE(TYPE_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
371 'g', 17, 0, NULL);
372 if (!buf) {
373 p->error = WFERR_NOMEMORY;
374 return;
375 }
376 n = strlen(buf);
377 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200378 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 PyMem_Free(buf);
380 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
381 'g', 17, 0, NULL);
382 if (!buf) {
383 p->error = WFERR_NOMEMORY;
384 return;
385 }
386 n = strlen(buf);
387 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200388 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 PyMem_Free(buf);
390 }
391 }
392 else if (PyBytes_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700393 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300394 w_pstring(PyBytes_AS_STRING(v), PyBytes_GET_SIZE(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 }
396 else if (PyUnicode_CheckExact(v)) {
397 PyObject *utf8;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200398 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 if (utf8 == NULL) {
400 p->depth--;
401 p->error = WFERR_UNMARSHALLABLE;
402 return;
403 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700404 if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v))
405 W_TYPE(TYPE_INTERNED, p);
406 else
407 W_TYPE(TYPE_UNICODE, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300408 w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409 Py_DECREF(utf8);
410 }
411 else if (PyTuple_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700412 W_TYPE(TYPE_TUPLE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 n = PyTuple_Size(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200414 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 for (i = 0; i < n; i++) {
416 w_object(PyTuple_GET_ITEM(v, i), p);
417 }
418 }
419 else if (PyList_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700420 W_TYPE(TYPE_LIST, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 n = PyList_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200422 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 for (i = 0; i < n; i++) {
424 w_object(PyList_GET_ITEM(v, i), p);
425 }
426 }
427 else if (PyDict_CheckExact(v)) {
428 Py_ssize_t pos;
429 PyObject *key, *value;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700430 W_TYPE(TYPE_DICT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 /* This one is NULL object terminated! */
432 pos = 0;
433 while (PyDict_Next(v, &pos, &key, &value)) {
434 w_object(key, p);
435 w_object(value, p);
436 }
437 w_object((PyObject *)NULL, p);
438 }
439 else if (PyAnySet_CheckExact(v)) {
440 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 if (PyObject_TypeCheck(v, &PySet_Type))
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700443 W_TYPE(TYPE_SET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 else
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700445 W_TYPE(TYPE_FROZENSET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000446 n = PyObject_Size(v);
447 if (n == -1) {
448 p->depth--;
449 p->error = WFERR_UNMARSHALLABLE;
450 return;
451 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200452 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 it = PyObject_GetIter(v);
454 if (it == NULL) {
455 p->depth--;
456 p->error = WFERR_UNMARSHALLABLE;
457 return;
458 }
459 while ((value = PyIter_Next(it)) != NULL) {
460 w_object(value, p);
461 Py_DECREF(value);
462 }
463 Py_DECREF(it);
464 if (PyErr_Occurred()) {
465 p->depth--;
466 p->error = WFERR_UNMARSHALLABLE;
467 return;
468 }
469 }
470 else if (PyCode_Check(v)) {
471 PyCodeObject *co = (PyCodeObject *)v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700472 W_TYPE(TYPE_CODE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 w_long(co->co_argcount, p);
474 w_long(co->co_kwonlyargcount, p);
475 w_long(co->co_nlocals, p);
476 w_long(co->co_stacksize, p);
477 w_long(co->co_flags, p);
478 w_object(co->co_code, p);
479 w_object(co->co_consts, p);
480 w_object(co->co_names, p);
481 w_object(co->co_varnames, p);
482 w_object(co->co_freevars, p);
483 w_object(co->co_cellvars, p);
484 w_object(co->co_filename, p);
485 w_object(co->co_name, p);
486 w_long(co->co_firstlineno, p);
487 w_object(co->co_lnotab, p);
488 }
489 else if (PyObject_CheckBuffer(v)) {
490 /* Write unknown buffer-style objects as a string */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100492 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100494 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100496 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700498 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300499 w_pstring(view.buf, view.len, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100500 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 }
502 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700503 W_TYPE(TYPE_UNKNOWN, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 p->error = WFERR_UNMARSHALLABLE;
505 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000506}
507
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000508/* version currently has no effect for writing longs. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000509void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000510PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000511{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 WFILE wf;
513 wf.fp = fp;
514 wf.error = WFERR_OK;
515 wf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700516 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 wf.version = version;
518 w_long(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000519}
520
521void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000522PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 WFILE wf;
525 wf.fp = fp;
526 wf.error = WFERR_OK;
527 wf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700528 if (version >= 3) {
529 if ((wf.refs = PyDict_New()) == NULL)
530 return; /* caller mush check PyErr_Occurred() */
531 } else
532 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 wf.version = version;
534 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700535 Py_XDECREF(wf.refs);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000536}
537
538typedef WFILE RFILE; /* Same struct with different invariants */
539
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000540#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum8d617a61995-03-09 12:12:11 +0000541
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200542static Py_ssize_t
543r_string(char *s, Py_ssize_t n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000544{
Éric Araujo6c0ba442011-07-26 17:23:57 +0200545 char *ptr;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200546 Py_ssize_t read, left;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100547
548 if (!p->readable) {
549 if (p->fp != NULL)
550 /* The result fits into int because it must be <=n. */
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200551 read = fread(s, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100552 else {
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200553 left = p->end - p->ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100554 read = (left < n) ? left : n;
555 memcpy(s, p->ptr, read);
556 p->ptr += read;
557 }
558 }
559 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200560 _Py_IDENTIFIER(read);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200561
Serhiy Storchaka5a1f1522013-02-13 12:11:03 +0200562 PyObject *data = _PyObject_CallMethodId(p->readable, &PyId_read, "n", n);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100563 read = 0;
564 if (data != NULL) {
565 if (!PyBytes_Check(data)) {
566 PyErr_Format(PyExc_TypeError,
567 "f.read() returned not bytes but %.100s",
568 data->ob_type->tp_name);
569 }
570 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700571 read = (int)PyBytes_GET_SIZE(data);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100572 if (read > 0) {
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300573 if (read > n) {
574 PyErr_Format(PyExc_ValueError,
575 "read() returned too much data: "
576 "%zd bytes requested, %zd returned",
577 n, read);
578 read = -1;
579 }
580 else {
581 ptr = PyBytes_AS_STRING(data);
582 memcpy(s, ptr, read);
583 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100584 }
585 }
586 Py_DECREF(data);
587 }
588 }
589 if (!PyErr_Occurred() && (read < n)) {
590 PyErr_SetString(PyExc_EOFError, "EOF read where not expected");
591 }
592 return read;
593}
594
595
596static int
597r_byte(RFILE *p)
598{
599 int c = EOF;
600 unsigned char ch;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200601 Py_ssize_t n;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100602
603 if (!p->readable)
604 c = p->fp ? getc(p->fp) : rs_byte(p);
605 else {
606 n = r_string((char *) &ch, 1, p);
607 if (n > 0)
608 c = ch;
609 }
610 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000611}
612
613static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000614r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 register short x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100617 unsigned char buffer[2];
618
619 r_string((char *) buffer, 2, p);
620 x = buffer[0];
621 x |= buffer[1] << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 /* Sign-extension, in case short greater than 16 bits */
623 x |= -(x & 0x8000);
624 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000625}
626
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000627static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000628r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000629{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 register long x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100631 unsigned char buffer[4];
632
633 r_string((char *) buffer, 4, p);
634 x = buffer[0];
635 x |= (long)buffer[1] << 8;
636 x |= (long)buffer[2] << 16;
637 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000638#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 /* Sign extension for 64-bit machines */
640 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000641#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000643}
644
Guido van Rossum79f25d91997-04-29 20:08:16 +0000645static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000646r_PyLong(RFILE *p)
647{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200649 long n, size, i;
650 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100654 if (PyErr_Occurred())
655 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 if (n == 0)
657 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200658 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 PyErr_SetString(PyExc_ValueError,
660 "bad marshal data (long size out of range)");
661 return NULL;
662 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
665 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
666 ob = _PyLong_New(size);
667 if (ob == NULL)
668 return NULL;
669 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 for (i = 0; i < size-1; i++) {
672 d = 0;
673 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
674 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100675 if (PyErr_Occurred())
676 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 if (md < 0 || md > PyLong_MARSHAL_BASE)
678 goto bad_digit;
679 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
680 }
681 ob->ob_digit[i] = d;
682 }
683 d = 0;
684 for (j=0; j < shorts_in_top_digit; j++) {
685 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100686 if (PyErr_Occurred())
687 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 if (md < 0 || md > PyLong_MARSHAL_BASE)
689 goto bad_digit;
690 /* topmost marshal digit should be nonzero */
691 if (md == 0 && j == shorts_in_top_digit - 1) {
692 Py_DECREF(ob);
693 PyErr_SetString(PyExc_ValueError,
694 "bad marshal data (unnormalized long data)");
695 return NULL;
696 }
697 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
698 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100699 if (PyErr_Occurred()) {
700 Py_DECREF(ob);
701 return NULL;
702 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 /* top digit should be nonzero, else the resulting PyLong won't be
704 normalized */
705 ob->ob_digit[size-1] = d;
706 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000707 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 Py_DECREF(ob);
709 PyErr_SetString(PyExc_ValueError,
710 "bad marshal data (digit out of range in long)");
711 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000712}
713
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700714/* allocate the reflist index for a new object. Return -1 on failure */
715static Py_ssize_t
716r_ref_reserve(int flag, RFILE *p)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700717{
718 if (flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700719 Py_ssize_t idx = PyList_Size(p->refs);
720 if (idx < 0)
721 return -1;
722 if (idx >= 0x7ffffffe) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700723 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700724 return -1;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700725 }
726 if (PyList_Append(p->refs, Py_None) < 0)
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700727 return -1;
728 return idx;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700729 } else
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700730 return 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700731}
732
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700733/* insert the new object 'o' to the reflist at previously
734 * allocated index 'idx'.
735 * 'o' can be NULL, in which case nothing is done.
736 * if 'o' was non-NULL, and the function succeeds, 'o' is returned.
737 * if 'o' was non-NULL, and the function fails, 'o' is released and
738 * NULL returned. This simplifies error checking at the call site since
739 * a single test for NULL for the function result is enough.
740 */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700741static PyObject *
742r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
743{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700744 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700745 if (PyList_SetItem(p->refs, idx, o) < 0) {
746 Py_DECREF(o); /* release the new object */
747 return NULL;
748 } else {
749 Py_INCREF(o); /* a reference for the list */
750 }
751 }
752 return o;
753}
754
755/* combination of both above, used when an object can be
756 * created whenever it is seen in the file, as opposed to
757 * after having loaded its sub-objects.
758 */
759static PyObject *
760r_ref(PyObject *o, int flag, RFILE *p)
761{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700762 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700763 if (PyList_Append(p->refs, o) < 0) {
764 Py_DECREF(o); /* release the new object */
765 return NULL;
766 }
767 }
768 return o;
769}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000770
771static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000772r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000773{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 /* NULL is a valid return value, it does not necessarily means that
775 an exception is set. */
776 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500777 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700779 int type, code = r_byte(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700780 int flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 PyObject *retval;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000782
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700783 if (code == EOF) {
784 PyErr_SetString(PyExc_EOFError,
785 "EOF read where object expected");
786 return NULL;
787 }
788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
792 p->depth--;
793 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
794 return NULL;
795 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000796
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700797 flag = code & FLAG_REF;
798 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700799
800#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700801 if (flag) \
802 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700803} while (0)
804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 case TYPE_NULL:
808 retval = NULL;
809 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 case TYPE_NONE:
812 Py_INCREF(Py_None);
813 retval = Py_None;
814 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 case TYPE_STOPITER:
817 Py_INCREF(PyExc_StopIteration);
818 retval = PyExc_StopIteration;
819 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 case TYPE_ELLIPSIS:
822 Py_INCREF(Py_Ellipsis);
823 retval = Py_Ellipsis;
824 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 case TYPE_FALSE:
827 Py_INCREF(Py_False);
828 retval = Py_False;
829 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 case TYPE_TRUE:
832 Py_INCREF(Py_True);
833 retval = Py_True;
834 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100837 n = r_long(p);
838 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700839 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 case TYPE_LONG:
843 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700844 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 case TYPE_FLOAT:
848 {
849 char buf[256];
850 double dx;
851 retval = NULL;
852 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300853 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 PyErr_SetString(PyExc_EOFError,
855 "EOF read where object expected");
856 break;
857 }
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300858 if (r_string(buf, n, p) != n)
859 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 buf[n] = '\0';
861 dx = PyOS_string_to_double(buf, NULL, NULL);
862 if (dx == -1.0 && PyErr_Occurred())
863 break;
864 retval = PyFloat_FromDouble(dx);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700865 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 break;
867 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 case TYPE_BINARY_FLOAT:
870 {
871 unsigned char buf[8];
872 double x;
873 if (r_string((char*)buf, 8, p) != 8) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 retval = NULL;
875 break;
876 }
877 x = _PyFloat_Unpack8(buf, 1);
878 if (x == -1.0 && PyErr_Occurred()) {
879 retval = NULL;
880 break;
881 }
882 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700883 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 break;
885 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 case TYPE_COMPLEX:
888 {
889 char buf[256];
890 Py_complex c;
891 retval = NULL;
892 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300893 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 PyErr_SetString(PyExc_EOFError,
895 "EOF read where object expected");
896 break;
897 }
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300898 if (r_string(buf, n, p) != n)
899 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 buf[n] = '\0';
901 c.real = PyOS_string_to_double(buf, NULL, NULL);
902 if (c.real == -1.0 && PyErr_Occurred())
903 break;
904 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300905 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 PyErr_SetString(PyExc_EOFError,
907 "EOF read where object expected");
908 break;
909 }
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300910 if (r_string(buf, n, p) != n)
911 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 buf[n] = '\0';
913 c.imag = PyOS_string_to_double(buf, NULL, NULL);
914 if (c.imag == -1.0 && PyErr_Occurred())
915 break;
916 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700917 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 break;
919 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 case TYPE_BINARY_COMPLEX:
922 {
923 unsigned char buf[8];
924 Py_complex c;
925 if (r_string((char*)buf, 8, p) != 8) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 retval = NULL;
927 break;
928 }
929 c.real = _PyFloat_Unpack8(buf, 1);
930 if (c.real == -1.0 && PyErr_Occurred()) {
931 retval = NULL;
932 break;
933 }
934 if (r_string((char*)buf, 8, p) != 8) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 retval = NULL;
936 break;
937 }
938 c.imag = _PyFloat_Unpack8(buf, 1);
939 if (c.imag == -1.0 && PyErr_Occurred()) {
940 retval = NULL;
941 break;
942 }
943 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700944 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 break;
946 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 case TYPE_STRING:
949 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100950 if (PyErr_Occurred()) {
951 retval = NULL;
952 break;
953 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200954 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
956 retval = NULL;
957 break;
958 }
959 v = PyBytes_FromStringAndSize((char *)NULL, n);
960 if (v == NULL) {
961 retval = NULL;
962 break;
963 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200964 if (r_string(PyBytes_AS_STRING(v), n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 Py_DECREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 retval = NULL;
967 break;
968 }
969 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700970 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 case TYPE_UNICODE:
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700974 case TYPE_INTERNED:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 {
976 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +0000977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100979 if (PyErr_Occurred()) {
980 retval = NULL;
981 break;
982 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200983 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
985 retval = NULL;
986 break;
987 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +0200988 if (n != 0) {
989 buffer = PyMem_NEW(char, n);
990 if (buffer == NULL) {
991 retval = PyErr_NoMemory();
992 break;
993 }
994 if (r_string(buffer, n, p) != n) {
995 PyMem_DEL(buffer);
Victor Stinnerf1913ca2013-06-21 19:08:06 +0200996 retval = NULL;
997 break;
998 }
999 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 PyMem_DEL(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001002 else {
1003 v = PyUnicode_New(0, 0);
1004 }
Victor Stinner3a8b79d2013-07-08 22:23:32 +02001005 if (v == NULL) {
1006 retval = NULL;
1007 break;
1008 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001009 if (type == TYPE_INTERNED)
1010 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001012 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 break;
1014 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 case TYPE_TUPLE:
1017 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001018 if (PyErr_Occurred()) {
1019 retval = NULL;
1020 break;
1021 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001022 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
1024 retval = NULL;
1025 break;
1026 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001027 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001028 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 if (v == NULL) {
1030 retval = NULL;
1031 break;
1032 }
1033 for (i = 0; i < n; i++) {
1034 v2 = r_object(p);
1035 if ( v2 == NULL ) {
1036 if (!PyErr_Occurred())
1037 PyErr_SetString(PyExc_TypeError,
1038 "NULL object in marshal data for tuple");
1039 Py_DECREF(v);
1040 v = NULL;
1041 break;
1042 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001043 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 }
1045 retval = v;
1046 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 case TYPE_LIST:
1049 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001050 if (PyErr_Occurred()) {
1051 retval = NULL;
1052 break;
1053 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001054 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
1056 retval = NULL;
1057 break;
1058 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001059 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001060 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 if (v == NULL) {
1062 retval = NULL;
1063 break;
1064 }
1065 for (i = 0; i < n; i++) {
1066 v2 = r_object(p);
1067 if ( v2 == NULL ) {
1068 if (!PyErr_Occurred())
1069 PyErr_SetString(PyExc_TypeError,
1070 "NULL object in marshal data for list");
1071 Py_DECREF(v);
1072 v = NULL;
1073 break;
1074 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001075 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 }
1077 retval = v;
1078 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 case TYPE_DICT:
1081 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001082 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 if (v == NULL) {
1084 retval = NULL;
1085 break;
1086 }
1087 for (;;) {
1088 PyObject *key, *val;
1089 key = r_object(p);
1090 if (key == NULL)
1091 break;
1092 val = r_object(p);
1093 if (val != NULL)
1094 PyDict_SetItem(v, key, val);
1095 Py_DECREF(key);
1096 Py_XDECREF(val);
1097 }
1098 if (PyErr_Occurred()) {
1099 Py_DECREF(v);
1100 v = NULL;
1101 }
1102 retval = v;
1103 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 case TYPE_SET:
1106 case TYPE_FROZENSET:
1107 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001108 if (PyErr_Occurred()) {
1109 retval = NULL;
1110 break;
1111 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001112 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
1114 retval = NULL;
1115 break;
1116 }
1117 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001118 if (type == TYPE_SET) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001119 R_REF(v);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001120 } else {
1121 /* must use delayed registration of frozensets because they must
1122 * be init with a refcount of 1
1123 */
1124 idx = r_ref_reserve(flag, p);
1125 if (idx < 0)
1126 Py_CLEAR(v); /* signal error */
1127 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 if (v == NULL) {
1129 retval = NULL;
1130 break;
1131 }
1132 for (i = 0; i < n; i++) {
1133 v2 = r_object(p);
1134 if ( v2 == NULL ) {
1135 if (!PyErr_Occurred())
1136 PyErr_SetString(PyExc_TypeError,
1137 "NULL object in marshal data for set");
1138 Py_DECREF(v);
1139 v = NULL;
1140 break;
1141 }
1142 if (PySet_Add(v, v2) == -1) {
1143 Py_DECREF(v);
1144 Py_DECREF(v2);
1145 v = NULL;
1146 break;
1147 }
1148 Py_DECREF(v2);
1149 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001150 if (type != TYPE_SET)
1151 v = r_ref_insert(v, idx, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 retval = v;
1153 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 case TYPE_CODE:
1156 {
1157 int argcount;
1158 int kwonlyargcount;
1159 int nlocals;
1160 int stacksize;
1161 int flags;
1162 PyObject *code = NULL;
1163 PyObject *consts = NULL;
1164 PyObject *names = NULL;
1165 PyObject *varnames = NULL;
1166 PyObject *freevars = NULL;
1167 PyObject *cellvars = NULL;
1168 PyObject *filename = NULL;
1169 PyObject *name = NULL;
1170 int firstlineno;
1171 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001172
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001173 idx = r_ref_reserve(flag, p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001174 if (idx < 0) {
1175 retval = NULL;
1176 break;
1177 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 /* XXX ignore long->int overflows for now */
1182 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001183 if (PyErr_Occurred())
1184 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001186 if (PyErr_Occurred())
1187 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001189 if (PyErr_Occurred())
1190 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001192 if (PyErr_Occurred())
1193 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001195 if (PyErr_Occurred())
1196 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 code = r_object(p);
1198 if (code == NULL)
1199 goto code_error;
1200 consts = r_object(p);
1201 if (consts == NULL)
1202 goto code_error;
1203 names = r_object(p);
1204 if (names == NULL)
1205 goto code_error;
1206 varnames = r_object(p);
1207 if (varnames == NULL)
1208 goto code_error;
1209 freevars = r_object(p);
1210 if (freevars == NULL)
1211 goto code_error;
1212 cellvars = r_object(p);
1213 if (cellvars == NULL)
1214 goto code_error;
1215 filename = r_object(p);
1216 if (filename == NULL)
1217 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001218 if (PyUnicode_CheckExact(filename)) {
1219 if (p->current_filename != NULL) {
1220 if (!PyUnicode_Compare(filename, p->current_filename)) {
1221 Py_DECREF(filename);
1222 Py_INCREF(p->current_filename);
1223 filename = p->current_filename;
1224 }
1225 }
1226 else {
1227 p->current_filename = filename;
1228 }
1229 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 name = r_object(p);
1231 if (name == NULL)
1232 goto code_error;
1233 firstlineno = (int)r_long(p);
1234 lnotab = r_object(p);
1235 if (lnotab == NULL)
1236 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 v = (PyObject *) PyCode_New(
1239 argcount, kwonlyargcount,
1240 nlocals, stacksize, flags,
1241 code, consts, names, varnames,
1242 freevars, cellvars, filename, name,
1243 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001244 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 code_error:
1247 Py_XDECREF(code);
1248 Py_XDECREF(consts);
1249 Py_XDECREF(names);
1250 Py_XDECREF(varnames);
1251 Py_XDECREF(freevars);
1252 Py_XDECREF(cellvars);
1253 Py_XDECREF(filename);
1254 Py_XDECREF(name);
1255 Py_XDECREF(lnotab);
1256 }
1257 retval = v;
1258 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001259
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001260 case TYPE_REF:
1261 n = r_long(p);
1262 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
1263 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
1264 retval = NULL;
1265 break;
1266 }
1267 v = PyList_GET_ITEM(p->refs, n);
1268 if (v == Py_None) {
1269 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
1270 retval = NULL;
1271 break;
1272 }
1273 Py_INCREF(v);
1274 retval = v;
1275 break;
1276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 default:
1278 /* Bogus data got written, which isn't ideal.
1279 This will let you keep working and recover. */
1280 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1281 retval = NULL;
1282 break;
1283
1284 }
1285 p->depth--;
1286 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001287}
1288
Neal Norwitzd85c4522004-06-13 20:31:49 +00001289static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001290read_object(RFILE *p)
1291{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 PyObject *v;
1293 if (PyErr_Occurred()) {
1294 fprintf(stderr, "XXX readobject called with exception set\n");
1295 return NULL;
1296 }
1297 v = r_object(p);
1298 if (v == NULL && !PyErr_Occurred())
1299 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1300 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001301}
1302
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001303int
1304PyMarshal_ReadShortFromFile(FILE *fp)
1305{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 RFILE rf;
1307 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001308 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001310 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 rf.end = rf.ptr = NULL;
1312 return r_short(&rf);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001313}
1314
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001315long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001316PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 RFILE rf;
1319 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001320 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001321 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 rf.ptr = rf.end = NULL;
1323 return r_long(&rf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001324}
1325
Tim Peters691e0e92001-01-18 04:39:16 +00001326#ifdef HAVE_FSTAT
1327/* Return size of file in bytes; < 0 if unknown. */
1328static off_t
1329getfilesize(FILE *fp)
1330{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 struct stat st;
1332 if (fstat(fileno(fp), &st) != 0)
1333 return -1;
1334 else
1335 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001336}
1337#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001338
Tim Peters691e0e92001-01-18 04:39:16 +00001339/* If we can get the size of the file up-front, and it's reasonably small,
1340 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1341 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001342 * CAUTION: since this may read the entire remainder of the file, don't
1343 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001344 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001345PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001346PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001347{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001348/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001349#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001350#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 off_t filesize;
1352 filesize = getfilesize(fp);
1353 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1354 char* pBuf = (char *)PyMem_MALLOC(filesize);
1355 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001356 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1357 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 PyMem_FREE(pBuf);
1359 return v;
1360 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 }
Tim Peters691e0e92001-01-18 04:39:16 +00001363#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 /* We don't have fstat, or we do but the file is larger than
1365 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1366 */
1367 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001368
Tim Peters691e0e92001-01-18 04:39:16 +00001369#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001370}
1371
Guido van Rossum79f25d91997-04-29 20:08:16 +00001372PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001373PyMarshal_ReadObjectFromFile(FILE *fp)
1374{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 RFILE rf;
1376 PyObject *result;
1377 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001378 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001379 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 rf.depth = 0;
1381 rf.ptr = rf.end = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001382 rf.refs = PyList_New(0);
1383 if (rf.refs == NULL)
1384 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001386 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001388}
1389
1390PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001391PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001392{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 RFILE rf;
1394 PyObject *result;
1395 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001396 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001397 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 rf.ptr = str;
1399 rf.end = str + len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001401 rf.refs = PyList_New(0);
1402 if (rf.refs == NULL)
1403 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001405 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001407}
1408
Guido van Rossum79f25d91997-04-29 20:08:16 +00001409PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001410PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001411{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 wf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001415 wf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1417 if (wf.str == NULL)
1418 return NULL;
1419 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1420 wf.end = wf.ptr + PyBytes_Size(wf.str);
1421 wf.error = WFERR_OK;
1422 wf.depth = 0;
1423 wf.version = version;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001424 if (version >= 3) {
1425 if ((wf.refs = PyDict_New()) == NULL)
1426 return NULL;
1427 } else
1428 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001430 Py_XDECREF(wf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 if (wf.str != NULL) {
1432 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1433 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1434 Py_DECREF(wf.str);
1435 PyErr_SetString(PyExc_OverflowError,
1436 "too much marshal data for a string");
1437 return NULL;
1438 }
1439 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1440 return NULL;
1441 }
1442 if (wf.error != WFERR_OK) {
1443 Py_XDECREF(wf.str);
1444 if (wf.error == WFERR_NOMEMORY)
1445 PyErr_NoMemory();
1446 else
1447 PyErr_SetString(PyExc_ValueError,
1448 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1449 :"object too deeply nested to marshal");
1450 return NULL;
1451 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001452 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001453}
1454
Guido van Rossum64b45521991-06-07 13:58:22 +00001455/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001456
Guido van Rossum79f25d91997-04-29 20:08:16 +00001457static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001458marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001459{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 /* XXX Quick hack -- need to do this differently */
1461 PyObject *x;
1462 PyObject *f;
1463 int version = Py_MARSHAL_VERSION;
1464 PyObject *s;
1465 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001466 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1469 return NULL;
1470 s = PyMarshal_WriteObjectToString(x, version);
1471 if (s == NULL)
1472 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001473 res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 Py_DECREF(s);
1475 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001476}
1477
R. David Murraydd226ea2009-05-13 12:27:21 +00001478PyDoc_STRVAR(dump_doc,
1479"dump(value, file[, version])\n\
1480\n\
1481Write the value on the open file. The value must be a supported type.\n\
1482The file must be an open file object such as sys.stdout or returned by\n\
1483open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1484\n\
1485If the value has (or contains an object that has) an unsupported type, a\n\
1486ValueError exception is raised but garbage data will also be written\n\
1487to the file. The object will not be properly read back by load()\n\
1488\n\
1489The version argument indicates the data format that dump should use.");
1490
Guido van Rossum79f25d91997-04-29 20:08:16 +00001491static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001492marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001493{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001495 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001497
1498 /*
1499 * Make a call to the read method, but read zero bytes.
1500 * This is to ensure that the object passed in at least
1501 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001502 * This can be removed if we guarantee good error handling
1503 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001504 */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001505 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 if (data == NULL)
1507 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001508 if (!PyBytes_Check(data)) {
1509 PyErr_Format(PyExc_TypeError,
1510 "f.read() returned not bytes but %.100s",
1511 data->ob_type->tp_name);
1512 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 }
1514 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001515 rf.depth = 0;
1516 rf.fp = NULL;
1517 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001518 rf.current_filename = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001519 if ((rf.refs = PyList_New(0)) != NULL) {
1520 result = read_object(&rf);
1521 Py_DECREF(rf.refs);
1522 } else
1523 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 Py_DECREF(data);
1526 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001527}
1528
R. David Murraydd226ea2009-05-13 12:27:21 +00001529PyDoc_STRVAR(load_doc,
1530"load(file)\n\
1531\n\
1532Read one value from the open file and return it. If no valid value is\n\
1533read (e.g. because the data has a different Python versions\n\
1534incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1535The file must be an open file object opened in binary mode ('rb' or\n\
1536'r+b').\n\
1537\n\
1538Note: If an object containing an unsupported type was marshalled with\n\
1539dump(), load() will substitute None for the unmarshallable type.");
1540
1541
Guido van Rossum79f25d91997-04-29 20:08:16 +00001542static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001543marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001544{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 PyObject *x;
1546 int version = Py_MARSHAL_VERSION;
1547 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1548 return NULL;
1549 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001550}
1551
R. David Murraydd226ea2009-05-13 12:27:21 +00001552PyDoc_STRVAR(dumps_doc,
1553"dumps(value[, version])\n\
1554\n\
1555Return the string that would be written to a file by dump(value, file).\n\
1556The value must be a supported type. Raise a ValueError exception if\n\
1557value has (or contains an object that has) an unsupported type.\n\
1558\n\
1559The version argument indicates the data format that dumps should use.");
1560
1561
Guido van Rossum79f25d91997-04-29 20:08:16 +00001562static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001563marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001564{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 RFILE rf;
1566 Py_buffer p;
1567 char *s;
1568 Py_ssize_t n;
1569 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001570 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 return NULL;
1572 s = p.buf;
1573 n = p.len;
1574 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001575 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001576 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 rf.ptr = s;
1578 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001580 if ((rf.refs = PyList_New(0)) == NULL)
1581 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 PyBuffer_Release(&p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001584 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001586}
1587
R. David Murraydd226ea2009-05-13 12:27:21 +00001588PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001589"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001590\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001591Convert the bytes object to a value. If no valid value is found, raise\n\
1592EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001593ignored.");
1594
Guido van Rossum79f25d91997-04-29 20:08:16 +00001595static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1597 {"load", marshal_load, METH_O, load_doc},
1598 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1599 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1600 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001601};
1602
R. David Murraydd226ea2009-05-13 12:27:21 +00001603
1604PyDoc_STRVAR(module_doc,
1605"This module contains functions that can read and write Python values in\n\
1606a binary format. The format is specific to Python, but independent of\n\
1607machine architecture issues.\n\
1608\n\
1609Not all Python object types are supported; in general, only objects\n\
1610whose value is independent from a particular invocation of Python can be\n\
1611written and read by this module. The following types are supported:\n\
1612None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1613tuples, lists, sets, dictionaries, and code objects, where it\n\
1614should be understood that tuples, lists and dictionaries are only\n\
1615supported as long as the values contained therein are themselves\n\
1616supported; and recursive lists and dictionaries should not be written\n\
1617(they will cause infinite loops).\n\
1618\n\
1619Variables:\n\
1620\n\
1621version -- indicates the format that the module uses. Version 0 is the\n\
1622 historical format, version 1 shares interned strings and version 2\n\
1623 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001624 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001625\n\
1626Functions:\n\
1627\n\
1628dump() -- write value to a file\n\
1629load() -- read value from a file\n\
1630dumps() -- write value to a string\n\
1631loads() -- read value from a string");
1632
1633
1634
Brett Cannon429ef652008-06-27 00:35:35 +00001635static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 PyModuleDef_HEAD_INIT,
1637 "marshal",
1638 module_doc,
1639 0,
1640 marshal_methods,
1641 NULL,
1642 NULL,
1643 NULL,
1644 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001645};
1646
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001647PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001648PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 PyObject *mod = PyModule_Create(&marshalmodule);
1651 if (mod == NULL)
1652 return NULL;
1653 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1654 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001655}