blob: a45e148ff9d80b068cba33819c3ef33f090a53f3 [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) {
573 ptr = PyBytes_AS_STRING(data);
574 memcpy(s, ptr, read);
575 }
576 }
577 Py_DECREF(data);
578 }
579 }
580 if (!PyErr_Occurred() && (read < n)) {
581 PyErr_SetString(PyExc_EOFError, "EOF read where not expected");
582 }
583 return read;
584}
585
586
587static int
588r_byte(RFILE *p)
589{
590 int c = EOF;
591 unsigned char ch;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200592 Py_ssize_t n;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100593
594 if (!p->readable)
595 c = p->fp ? getc(p->fp) : rs_byte(p);
596 else {
597 n = r_string((char *) &ch, 1, p);
598 if (n > 0)
599 c = ch;
600 }
601 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000602}
603
604static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000605r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000606{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 register short x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100608 unsigned char buffer[2];
609
610 r_string((char *) buffer, 2, p);
611 x = buffer[0];
612 x |= buffer[1] << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 /* Sign-extension, in case short greater than 16 bits */
614 x |= -(x & 0x8000);
615 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000616}
617
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000618static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000619r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000620{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 register long x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100622 unsigned char buffer[4];
623
624 r_string((char *) buffer, 4, p);
625 x = buffer[0];
626 x |= (long)buffer[1] << 8;
627 x |= (long)buffer[2] << 16;
628 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000629#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 /* Sign extension for 64-bit machines */
631 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000632#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000634}
635
Guido van Rossum79f25d91997-04-29 20:08:16 +0000636static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000637r_PyLong(RFILE *p)
638{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200640 long n, size, i;
641 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100645 if (PyErr_Occurred())
646 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 if (n == 0)
648 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200649 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 PyErr_SetString(PyExc_ValueError,
651 "bad marshal data (long size out of range)");
652 return NULL;
653 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
656 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
657 ob = _PyLong_New(size);
658 if (ob == NULL)
659 return NULL;
660 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 for (i = 0; i < size-1; i++) {
663 d = 0;
664 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
665 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100666 if (PyErr_Occurred())
667 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 if (md < 0 || md > PyLong_MARSHAL_BASE)
669 goto bad_digit;
670 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
671 }
672 ob->ob_digit[i] = d;
673 }
674 d = 0;
675 for (j=0; j < shorts_in_top_digit; j++) {
676 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100677 if (PyErr_Occurred())
678 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 if (md < 0 || md > PyLong_MARSHAL_BASE)
680 goto bad_digit;
681 /* topmost marshal digit should be nonzero */
682 if (md == 0 && j == shorts_in_top_digit - 1) {
683 Py_DECREF(ob);
684 PyErr_SetString(PyExc_ValueError,
685 "bad marshal data (unnormalized long data)");
686 return NULL;
687 }
688 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
689 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100690 if (PyErr_Occurred()) {
691 Py_DECREF(ob);
692 return NULL;
693 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 /* top digit should be nonzero, else the resulting PyLong won't be
695 normalized */
696 ob->ob_digit[size-1] = d;
697 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000698 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 Py_DECREF(ob);
700 PyErr_SetString(PyExc_ValueError,
701 "bad marshal data (digit out of range in long)");
702 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000703}
704
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700705/* allocate the reflist index for a new object. Return -1 on failure */
706static Py_ssize_t
707r_ref_reserve(int flag, RFILE *p)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700708{
709 if (flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700710 Py_ssize_t idx = PyList_Size(p->refs);
711 if (idx < 0)
712 return -1;
713 if (idx >= 0x7ffffffe) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700714 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700715 return -1;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700716 }
717 if (PyList_Append(p->refs, Py_None) < 0)
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700718 return -1;
719 return idx;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700720 } else
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700721 return 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700722}
723
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700724/* insert the new object 'o' to the reflist at previously
725 * allocated index 'idx'.
726 * 'o' can be NULL, in which case nothing is done.
727 * if 'o' was non-NULL, and the function succeeds, 'o' is returned.
728 * if 'o' was non-NULL, and the function fails, 'o' is released and
729 * NULL returned. This simplifies error checking at the call site since
730 * a single test for NULL for the function result is enough.
731 */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700732static PyObject *
733r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
734{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700735 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700736 if (PyList_SetItem(p->refs, idx, o) < 0) {
737 Py_DECREF(o); /* release the new object */
738 return NULL;
739 } else {
740 Py_INCREF(o); /* a reference for the list */
741 }
742 }
743 return o;
744}
745
746/* combination of both above, used when an object can be
747 * created whenever it is seen in the file, as opposed to
748 * after having loaded its sub-objects.
749 */
750static PyObject *
751r_ref(PyObject *o, int flag, RFILE *p)
752{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700753 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700754 if (PyList_Append(p->refs, o) < 0) {
755 Py_DECREF(o); /* release the new object */
756 return NULL;
757 }
758 }
759 return o;
760}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000761
762static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000763r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000764{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 /* NULL is a valid return value, it does not necessarily means that
766 an exception is set. */
767 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500768 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700770 int type, code = r_byte(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700771 int flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 PyObject *retval;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000773
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700774 if (code == EOF) {
775 PyErr_SetString(PyExc_EOFError,
776 "EOF read where object expected");
777 return NULL;
778 }
779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
783 p->depth--;
784 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
785 return NULL;
786 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000787
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700788 flag = code & FLAG_REF;
789 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700790
791#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700792 if (flag) \
793 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700794} while (0)
795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 case TYPE_NULL:
799 retval = NULL;
800 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 case TYPE_NONE:
803 Py_INCREF(Py_None);
804 retval = Py_None;
805 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 case TYPE_STOPITER:
808 Py_INCREF(PyExc_StopIteration);
809 retval = PyExc_StopIteration;
810 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 case TYPE_ELLIPSIS:
813 Py_INCREF(Py_Ellipsis);
814 retval = Py_Ellipsis;
815 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 case TYPE_FALSE:
818 Py_INCREF(Py_False);
819 retval = Py_False;
820 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 case TYPE_TRUE:
823 Py_INCREF(Py_True);
824 retval = Py_True;
825 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100828 n = r_long(p);
829 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700830 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 case TYPE_LONG:
834 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700835 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 case TYPE_FLOAT:
839 {
840 char buf[256];
841 double dx;
842 retval = NULL;
843 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200844 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 PyErr_SetString(PyExc_EOFError,
846 "EOF read where object expected");
847 break;
848 }
849 buf[n] = '\0';
850 dx = PyOS_string_to_double(buf, NULL, NULL);
851 if (dx == -1.0 && PyErr_Occurred())
852 break;
853 retval = PyFloat_FromDouble(dx);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700854 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 break;
856 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 case TYPE_BINARY_FLOAT:
859 {
860 unsigned char buf[8];
861 double x;
862 if (r_string((char*)buf, 8, p) != 8) {
863 PyErr_SetString(PyExc_EOFError,
864 "EOF read where object expected");
865 retval = NULL;
866 break;
867 }
868 x = _PyFloat_Unpack8(buf, 1);
869 if (x == -1.0 && PyErr_Occurred()) {
870 retval = NULL;
871 break;
872 }
873 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700874 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 break;
876 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 case TYPE_COMPLEX:
879 {
880 char buf[256];
881 Py_complex c;
882 retval = NULL;
883 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200884 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 PyErr_SetString(PyExc_EOFError,
886 "EOF read where object expected");
887 break;
888 }
889 buf[n] = '\0';
890 c.real = PyOS_string_to_double(buf, NULL, NULL);
891 if (c.real == -1.0 && PyErr_Occurred())
892 break;
893 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200894 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 PyErr_SetString(PyExc_EOFError,
896 "EOF read where object expected");
897 break;
898 }
899 buf[n] = '\0';
900 c.imag = PyOS_string_to_double(buf, NULL, NULL);
901 if (c.imag == -1.0 && PyErr_Occurred())
902 break;
903 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700904 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 break;
906 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 case TYPE_BINARY_COMPLEX:
909 {
910 unsigned char buf[8];
911 Py_complex c;
912 if (r_string((char*)buf, 8, p) != 8) {
913 PyErr_SetString(PyExc_EOFError,
914 "EOF read where object expected");
915 retval = NULL;
916 break;
917 }
918 c.real = _PyFloat_Unpack8(buf, 1);
919 if (c.real == -1.0 && PyErr_Occurred()) {
920 retval = NULL;
921 break;
922 }
923 if (r_string((char*)buf, 8, p) != 8) {
924 PyErr_SetString(PyExc_EOFError,
925 "EOF read where object expected");
926 retval = NULL;
927 break;
928 }
929 c.imag = _PyFloat_Unpack8(buf, 1);
930 if (c.imag == -1.0 && PyErr_Occurred()) {
931 retval = NULL;
932 break;
933 }
934 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700935 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 break;
937 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 case TYPE_STRING:
940 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100941 if (PyErr_Occurred()) {
942 retval = NULL;
943 break;
944 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200945 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
947 retval = NULL;
948 break;
949 }
950 v = PyBytes_FromStringAndSize((char *)NULL, n);
951 if (v == NULL) {
952 retval = NULL;
953 break;
954 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200955 if (r_string(PyBytes_AS_STRING(v), n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 Py_DECREF(v);
957 PyErr_SetString(PyExc_EOFError,
958 "EOF read where object expected");
959 retval = NULL;
960 break;
961 }
962 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700963 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 case TYPE_UNICODE:
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700967 case TYPE_INTERNED:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 {
969 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +0000970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100972 if (PyErr_Occurred()) {
973 retval = NULL;
974 break;
975 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200976 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
978 retval = NULL;
979 break;
980 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +0200981 if (n != 0) {
982 buffer = PyMem_NEW(char, n);
983 if (buffer == NULL) {
984 retval = PyErr_NoMemory();
985 break;
986 }
987 if (r_string(buffer, n, p) != n) {
988 PyMem_DEL(buffer);
989 PyErr_SetString(PyExc_EOFError,
990 "EOF read where object expected");
991 retval = NULL;
992 break;
993 }
994 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 PyMem_DEL(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +0200997 else {
998 v = PyUnicode_New(0, 0);
999 }
Victor Stinner3a8b79d2013-07-08 22:23:32 +02001000 if (v == NULL) {
1001 retval = NULL;
1002 break;
1003 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001004 if (type == TYPE_INTERNED)
1005 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001007 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 break;
1009 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 case TYPE_TUPLE:
1012 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001013 if (PyErr_Occurred()) {
1014 retval = NULL;
1015 break;
1016 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001017 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
1019 retval = NULL;
1020 break;
1021 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001022 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001023 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 if (v == NULL) {
1025 retval = NULL;
1026 break;
1027 }
1028 for (i = 0; i < n; i++) {
1029 v2 = r_object(p);
1030 if ( v2 == NULL ) {
1031 if (!PyErr_Occurred())
1032 PyErr_SetString(PyExc_TypeError,
1033 "NULL object in marshal data for tuple");
1034 Py_DECREF(v);
1035 v = NULL;
1036 break;
1037 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001038 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 }
1040 retval = v;
1041 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 case TYPE_LIST:
1044 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001045 if (PyErr_Occurred()) {
1046 retval = NULL;
1047 break;
1048 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001049 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
1051 retval = NULL;
1052 break;
1053 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001054 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001055 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 if (v == NULL) {
1057 retval = NULL;
1058 break;
1059 }
1060 for (i = 0; i < n; i++) {
1061 v2 = r_object(p);
1062 if ( v2 == NULL ) {
1063 if (!PyErr_Occurred())
1064 PyErr_SetString(PyExc_TypeError,
1065 "NULL object in marshal data for list");
1066 Py_DECREF(v);
1067 v = NULL;
1068 break;
1069 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001070 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 }
1072 retval = v;
1073 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 case TYPE_DICT:
1076 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001077 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 if (v == NULL) {
1079 retval = NULL;
1080 break;
1081 }
1082 for (;;) {
1083 PyObject *key, *val;
1084 key = r_object(p);
1085 if (key == NULL)
1086 break;
1087 val = r_object(p);
1088 if (val != NULL)
1089 PyDict_SetItem(v, key, val);
1090 Py_DECREF(key);
1091 Py_XDECREF(val);
1092 }
1093 if (PyErr_Occurred()) {
1094 Py_DECREF(v);
1095 v = NULL;
1096 }
1097 retval = v;
1098 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 case TYPE_SET:
1101 case TYPE_FROZENSET:
1102 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001103 if (PyErr_Occurred()) {
1104 retval = NULL;
1105 break;
1106 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001107 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
1109 retval = NULL;
1110 break;
1111 }
1112 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001113 if (type == TYPE_SET) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001114 R_REF(v);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001115 } else {
1116 /* must use delayed registration of frozensets because they must
1117 * be init with a refcount of 1
1118 */
1119 idx = r_ref_reserve(flag, p);
1120 if (idx < 0)
1121 Py_CLEAR(v); /* signal error */
1122 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 if (v == NULL) {
1124 retval = NULL;
1125 break;
1126 }
1127 for (i = 0; i < n; i++) {
1128 v2 = r_object(p);
1129 if ( v2 == NULL ) {
1130 if (!PyErr_Occurred())
1131 PyErr_SetString(PyExc_TypeError,
1132 "NULL object in marshal data for set");
1133 Py_DECREF(v);
1134 v = NULL;
1135 break;
1136 }
1137 if (PySet_Add(v, v2) == -1) {
1138 Py_DECREF(v);
1139 Py_DECREF(v2);
1140 v = NULL;
1141 break;
1142 }
1143 Py_DECREF(v2);
1144 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001145 if (type != TYPE_SET)
1146 v = r_ref_insert(v, idx, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 retval = v;
1148 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 case TYPE_CODE:
1151 {
1152 int argcount;
1153 int kwonlyargcount;
1154 int nlocals;
1155 int stacksize;
1156 int flags;
1157 PyObject *code = NULL;
1158 PyObject *consts = NULL;
1159 PyObject *names = NULL;
1160 PyObject *varnames = NULL;
1161 PyObject *freevars = NULL;
1162 PyObject *cellvars = NULL;
1163 PyObject *filename = NULL;
1164 PyObject *name = NULL;
1165 int firstlineno;
1166 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001167
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001168 idx = r_ref_reserve(flag, p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001169 if (idx < 0) {
1170 retval = NULL;
1171 break;
1172 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 /* XXX ignore long->int overflows for now */
1177 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001178 if (PyErr_Occurred())
1179 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001181 if (PyErr_Occurred())
1182 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001184 if (PyErr_Occurred())
1185 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001187 if (PyErr_Occurred())
1188 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001190 if (PyErr_Occurred())
1191 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 code = r_object(p);
1193 if (code == NULL)
1194 goto code_error;
1195 consts = r_object(p);
1196 if (consts == NULL)
1197 goto code_error;
1198 names = r_object(p);
1199 if (names == NULL)
1200 goto code_error;
1201 varnames = r_object(p);
1202 if (varnames == NULL)
1203 goto code_error;
1204 freevars = r_object(p);
1205 if (freevars == NULL)
1206 goto code_error;
1207 cellvars = r_object(p);
1208 if (cellvars == NULL)
1209 goto code_error;
1210 filename = r_object(p);
1211 if (filename == NULL)
1212 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001213 if (PyUnicode_CheckExact(filename)) {
1214 if (p->current_filename != NULL) {
1215 if (!PyUnicode_Compare(filename, p->current_filename)) {
1216 Py_DECREF(filename);
1217 Py_INCREF(p->current_filename);
1218 filename = p->current_filename;
1219 }
1220 }
1221 else {
1222 p->current_filename = filename;
1223 }
1224 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 name = r_object(p);
1226 if (name == NULL)
1227 goto code_error;
1228 firstlineno = (int)r_long(p);
1229 lnotab = r_object(p);
1230 if (lnotab == NULL)
1231 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001233 v = (PyObject *) PyCode_New(
1234 argcount, kwonlyargcount,
1235 nlocals, stacksize, flags,
1236 code, consts, names, varnames,
1237 freevars, cellvars, filename, name,
1238 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001239 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 code_error:
1242 Py_XDECREF(code);
1243 Py_XDECREF(consts);
1244 Py_XDECREF(names);
1245 Py_XDECREF(varnames);
1246 Py_XDECREF(freevars);
1247 Py_XDECREF(cellvars);
1248 Py_XDECREF(filename);
1249 Py_XDECREF(name);
1250 Py_XDECREF(lnotab);
1251 }
1252 retval = v;
1253 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001254
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001255 case TYPE_REF:
1256 n = r_long(p);
1257 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
1258 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
1259 retval = NULL;
1260 break;
1261 }
1262 v = PyList_GET_ITEM(p->refs, n);
1263 if (v == Py_None) {
1264 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
1265 retval = NULL;
1266 break;
1267 }
1268 Py_INCREF(v);
1269 retval = v;
1270 break;
1271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 default:
1273 /* Bogus data got written, which isn't ideal.
1274 This will let you keep working and recover. */
1275 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1276 retval = NULL;
1277 break;
1278
1279 }
1280 p->depth--;
1281 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001282}
1283
Neal Norwitzd85c4522004-06-13 20:31:49 +00001284static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001285read_object(RFILE *p)
1286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 PyObject *v;
1288 if (PyErr_Occurred()) {
1289 fprintf(stderr, "XXX readobject called with exception set\n");
1290 return NULL;
1291 }
1292 v = r_object(p);
1293 if (v == NULL && !PyErr_Occurred())
1294 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1295 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001296}
1297
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001298int
1299PyMarshal_ReadShortFromFile(FILE *fp)
1300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 RFILE rf;
1302 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001303 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001305 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 rf.end = rf.ptr = NULL;
1307 return r_short(&rf);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001308}
1309
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001310long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001311PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001312{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 RFILE rf;
1314 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001315 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001316 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 rf.ptr = rf.end = NULL;
1318 return r_long(&rf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001319}
1320
Tim Peters691e0e92001-01-18 04:39:16 +00001321#ifdef HAVE_FSTAT
1322/* Return size of file in bytes; < 0 if unknown. */
1323static off_t
1324getfilesize(FILE *fp)
1325{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 struct stat st;
1327 if (fstat(fileno(fp), &st) != 0)
1328 return -1;
1329 else
1330 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001331}
1332#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001333
Tim Peters691e0e92001-01-18 04:39:16 +00001334/* If we can get the size of the file up-front, and it's reasonably small,
1335 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1336 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001337 * CAUTION: since this may read the entire remainder of the file, don't
1338 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001339 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001340PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001341PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001342{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001343/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001344#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001345#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 off_t filesize;
1347 filesize = getfilesize(fp);
1348 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1349 char* pBuf = (char *)PyMem_MALLOC(filesize);
1350 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001351 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1352 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 PyMem_FREE(pBuf);
1354 return v;
1355 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 }
Tim Peters691e0e92001-01-18 04:39:16 +00001358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 /* We don't have fstat, or we do but the file is larger than
1360 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1361 */
1362 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001363
Tim Peters691e0e92001-01-18 04:39:16 +00001364#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001365}
1366
Guido van Rossum79f25d91997-04-29 20:08:16 +00001367PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001368PyMarshal_ReadObjectFromFile(FILE *fp)
1369{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 RFILE rf;
1371 PyObject *result;
1372 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001373 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001374 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 rf.depth = 0;
1376 rf.ptr = rf.end = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001377 rf.refs = PyList_New(0);
1378 if (rf.refs == NULL)
1379 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001381 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001383}
1384
1385PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001386PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001387{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 RFILE rf;
1389 PyObject *result;
1390 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001391 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001392 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 rf.ptr = str;
1394 rf.end = str + len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001396 rf.refs = PyList_New(0);
1397 if (rf.refs == NULL)
1398 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001400 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001402}
1403
Guido van Rossum79f25d91997-04-29 20:08:16 +00001404PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001405PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001406{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 wf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001410 wf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1412 if (wf.str == NULL)
1413 return NULL;
1414 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1415 wf.end = wf.ptr + PyBytes_Size(wf.str);
1416 wf.error = WFERR_OK;
1417 wf.depth = 0;
1418 wf.version = version;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001419 if (version >= 3) {
1420 if ((wf.refs = PyDict_New()) == NULL)
1421 return NULL;
1422 } else
1423 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001425 Py_XDECREF(wf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 if (wf.str != NULL) {
1427 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1428 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1429 Py_DECREF(wf.str);
1430 PyErr_SetString(PyExc_OverflowError,
1431 "too much marshal data for a string");
1432 return NULL;
1433 }
1434 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1435 return NULL;
1436 }
1437 if (wf.error != WFERR_OK) {
1438 Py_XDECREF(wf.str);
1439 if (wf.error == WFERR_NOMEMORY)
1440 PyErr_NoMemory();
1441 else
1442 PyErr_SetString(PyExc_ValueError,
1443 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1444 :"object too deeply nested to marshal");
1445 return NULL;
1446 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001447 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001448}
1449
Guido van Rossum64b45521991-06-07 13:58:22 +00001450/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001451
Guido van Rossum79f25d91997-04-29 20:08:16 +00001452static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001453marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 /* XXX Quick hack -- need to do this differently */
1456 PyObject *x;
1457 PyObject *f;
1458 int version = Py_MARSHAL_VERSION;
1459 PyObject *s;
1460 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001461 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1464 return NULL;
1465 s = PyMarshal_WriteObjectToString(x, version);
1466 if (s == NULL)
1467 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001468 res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 Py_DECREF(s);
1470 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001471}
1472
R. David Murraydd226ea2009-05-13 12:27:21 +00001473PyDoc_STRVAR(dump_doc,
1474"dump(value, file[, version])\n\
1475\n\
1476Write the value on the open file. The value must be a supported type.\n\
1477The file must be an open file object such as sys.stdout or returned by\n\
1478open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1479\n\
1480If the value has (or contains an object that has) an unsupported type, a\n\
1481ValueError exception is raised but garbage data will also be written\n\
1482to the file. The object will not be properly read back by load()\n\
1483\n\
1484The version argument indicates the data format that dump should use.");
1485
Guido van Rossum79f25d91997-04-29 20:08:16 +00001486static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001487marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001488{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001490 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001492
1493 /*
1494 * Make a call to the read method, but read zero bytes.
1495 * This is to ensure that the object passed in at least
1496 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001497 * This can be removed if we guarantee good error handling
1498 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001499 */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001500 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 if (data == NULL)
1502 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001503 if (!PyBytes_Check(data)) {
1504 PyErr_Format(PyExc_TypeError,
1505 "f.read() returned not bytes but %.100s",
1506 data->ob_type->tp_name);
1507 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 }
1509 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001510 rf.depth = 0;
1511 rf.fp = NULL;
1512 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001513 rf.current_filename = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001514 if ((rf.refs = PyList_New(0)) != NULL) {
1515 result = read_object(&rf);
1516 Py_DECREF(rf.refs);
1517 } else
1518 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 Py_DECREF(data);
1521 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001522}
1523
R. David Murraydd226ea2009-05-13 12:27:21 +00001524PyDoc_STRVAR(load_doc,
1525"load(file)\n\
1526\n\
1527Read one value from the open file and return it. If no valid value is\n\
1528read (e.g. because the data has a different Python versions\n\
1529incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1530The file must be an open file object opened in binary mode ('rb' or\n\
1531'r+b').\n\
1532\n\
1533Note: If an object containing an unsupported type was marshalled with\n\
1534dump(), load() will substitute None for the unmarshallable type.");
1535
1536
Guido van Rossum79f25d91997-04-29 20:08:16 +00001537static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001538marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001539{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 PyObject *x;
1541 int version = Py_MARSHAL_VERSION;
1542 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1543 return NULL;
1544 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001545}
1546
R. David Murraydd226ea2009-05-13 12:27:21 +00001547PyDoc_STRVAR(dumps_doc,
1548"dumps(value[, version])\n\
1549\n\
1550Return the string that would be written to a file by dump(value, file).\n\
1551The value must be a supported type. Raise a ValueError exception if\n\
1552value has (or contains an object that has) an unsupported type.\n\
1553\n\
1554The version argument indicates the data format that dumps should use.");
1555
1556
Guido van Rossum79f25d91997-04-29 20:08:16 +00001557static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001558marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001559{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001560 RFILE rf;
1561 Py_buffer p;
1562 char *s;
1563 Py_ssize_t n;
1564 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001565 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 return NULL;
1567 s = p.buf;
1568 n = p.len;
1569 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001570 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001571 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 rf.ptr = s;
1573 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001575 if ((rf.refs = PyList_New(0)) == NULL)
1576 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 PyBuffer_Release(&p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001579 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001581}
1582
R. David Murraydd226ea2009-05-13 12:27:21 +00001583PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001584"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001585\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001586Convert the bytes object to a value. If no valid value is found, raise\n\
1587EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001588ignored.");
1589
Guido van Rossum79f25d91997-04-29 20:08:16 +00001590static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1592 {"load", marshal_load, METH_O, load_doc},
1593 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1594 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1595 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001596};
1597
R. David Murraydd226ea2009-05-13 12:27:21 +00001598
1599PyDoc_STRVAR(module_doc,
1600"This module contains functions that can read and write Python values in\n\
1601a binary format. The format is specific to Python, but independent of\n\
1602machine architecture issues.\n\
1603\n\
1604Not all Python object types are supported; in general, only objects\n\
1605whose value is independent from a particular invocation of Python can be\n\
1606written and read by this module. The following types are supported:\n\
1607None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1608tuples, lists, sets, dictionaries, and code objects, where it\n\
1609should be understood that tuples, lists and dictionaries are only\n\
1610supported as long as the values contained therein are themselves\n\
1611supported; and recursive lists and dictionaries should not be written\n\
1612(they will cause infinite loops).\n\
1613\n\
1614Variables:\n\
1615\n\
1616version -- indicates the format that the module uses. Version 0 is the\n\
1617 historical format, version 1 shares interned strings and version 2\n\
1618 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001619 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001620\n\
1621Functions:\n\
1622\n\
1623dump() -- write value to a file\n\
1624load() -- read value from a file\n\
1625dumps() -- write value to a string\n\
1626loads() -- read value from a string");
1627
1628
1629
Brett Cannon429ef652008-06-27 00:35:35 +00001630static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 PyModuleDef_HEAD_INIT,
1632 "marshal",
1633 module_doc,
1634 0,
1635 marshal_methods,
1636 NULL,
1637 NULL,
1638 NULL,
1639 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001640};
1641
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001642PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001643PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001644{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 PyObject *mod = PyModule_Create(&marshalmodule);
1646 if (mod == NULL)
1647 return NULL;
1648 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1649 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001650}