blob: e519fc9bfa89b3df9a7c8fba397dd923abd14775 [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 Storchaka7e019112013-02-13 12:08:15 +0200100w_string(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
Mark Dickinsonbd792642009-03-18 20:06:12 +0000144/* We assume that Python longs are stored internally in base some power of
145 2**15; for the sake of portability we'll always read and write them in base
146 exactly 2**15. */
147
148#define PyLong_MARSHAL_SHIFT 15
149#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
150#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
151#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
152#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
153#endif
154#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
155
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700156#define W_TYPE(t, p) do { \
157 w_byte((t) | flag, (p)); \
158} while(0)
159
Mark Dickinsonbd792642009-03-18 20:06:12 +0000160static void
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700161w_PyLong(const PyLongObject *ob, char flag, WFILE *p)
Mark Dickinsonbd792642009-03-18 20:06:12 +0000162{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000163 Py_ssize_t i, j, n, l;
164 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000165
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700166 W_TYPE(TYPE_LONG, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 if (Py_SIZE(ob) == 0) {
168 w_long((long)0, p);
169 return;
170 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 /* set l to number of base PyLong_MARSHAL_BASE digits */
173 n = ABS(Py_SIZE(ob));
174 l = (n-1) * PyLong_MARSHAL_RATIO;
175 d = ob->ob_digit[n-1];
176 assert(d != 0); /* a PyLong is always normalized */
177 do {
178 d >>= PyLong_MARSHAL_SHIFT;
179 l++;
180 } while (d != 0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200181 if (l > SIZE32_MAX) {
182 p->depth--;
183 p->error = WFERR_UNMARSHALLABLE;
184 return;
185 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 for (i=0; i < n-1; i++) {
189 d = ob->ob_digit[i];
190 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
191 w_short(d & PyLong_MARSHAL_MASK, p);
192 d >>= PyLong_MARSHAL_SHIFT;
193 }
194 assert (d == 0);
195 }
196 d = ob->ob_digit[n-1];
197 do {
198 w_short(d & PyLong_MARSHAL_MASK, p);
199 d >>= PyLong_MARSHAL_SHIFT;
200 } while (d != 0);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000201}
202
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700203static int
204w_ref(PyObject *v, char *flag, WFILE *p)
205{
206 PyObject *id;
207 PyObject *idx;
208
209 if (p->version < 3 || p->refs == NULL)
210 return 0; /* not writing object references */
211
212 /* if it has only one reference, it definitely isn't shared */
213 if (Py_REFCNT(v) == 1)
214 return 0;
215
216 id = PyLong_FromVoidPtr((void*)v);
217 if (id == NULL)
218 goto err;
219 idx = PyDict_GetItem(p->refs, id);
220 if (idx != NULL) {
221 /* write the reference index to the stream */
222 long w = PyLong_AsLong(idx);
223 Py_DECREF(id);
224 if (w == -1 && PyErr_Occurred()) {
225 goto err;
226 }
227 /* we don't store "long" indices in the dict */
228 assert(0 <= w && w <= 0x7fffffff);
229 w_byte(TYPE_REF, p);
230 w_long(w, p);
231 return 1;
232 } else {
233 int ok;
234 Py_ssize_t s = PyDict_Size(p->refs);
235 /* we don't support long indices */
236 if (s >= 0x7fffffff) {
237 PyErr_SetString(PyExc_ValueError, "too many objects");
238 goto err;
239 }
240 idx = PyLong_FromSsize_t(s);
241 ok = idx && PyDict_SetItem(p->refs, id, idx) == 0;
242 Py_DECREF(id);
243 Py_XDECREF(idx);
244 if (!ok)
245 goto err;
246 *flag |= FLAG_REF;
247 return 0;
248 }
249err:
250 p->error = WFERR_UNMARSHALLABLE;
251 return 1;
252}
253
254static void
255w_complex_object(PyObject *v, char flag, WFILE *p);
256
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000257static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000258w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000259{
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700260 char flag = '\0';
Fred Drake6da0b912000-06-28 18:47:56 +0000261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
265 p->error = WFERR_NESTEDTOODEEP;
266 }
267 else if (v == NULL) {
268 w_byte(TYPE_NULL, p);
269 }
270 else if (v == Py_None) {
271 w_byte(TYPE_NONE, p);
272 }
273 else if (v == PyExc_StopIteration) {
274 w_byte(TYPE_STOPITER, p);
275 }
276 else if (v == Py_Ellipsis) {
277 w_byte(TYPE_ELLIPSIS, p);
278 }
279 else if (v == Py_False) {
280 w_byte(TYPE_FALSE, p);
281 }
282 else if (v == Py_True) {
283 w_byte(TYPE_TRUE, p);
284 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700285 else if (!w_ref(v, &flag, p))
286 w_complex_object(v, flag, p);
287
288 p->depth--;
289}
290
291static void
292w_complex_object(PyObject *v, char flag, WFILE *p)
293{
294 Py_ssize_t i, n;
295
296 if (PyLong_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 long x = PyLong_AsLong(v);
298 if ((x == -1) && PyErr_Occurred()) {
299 PyLongObject *ob = (PyLongObject *)v;
300 PyErr_Clear();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700301 w_PyLong(ob, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000302 }
303 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000304#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
306 if (y && y != -1) {
Martin v. Löwis7e395722012-07-28 19:44:05 +0200307 /* Too large for TYPE_INT */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700308 w_PyLong((PyLongObject*)v, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 }
310 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700313 W_TYPE(TYPE_INT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000314 w_long(x, p);
315 }
316 }
317 }
318 else if (PyFloat_CheckExact(v)) {
319 if (p->version > 1) {
320 unsigned char buf[8];
321 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
322 buf, 1) < 0) {
323 p->error = WFERR_UNMARSHALLABLE;
324 return;
325 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700326 W_TYPE(TYPE_BINARY_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 w_string((char*)buf, 8, p);
328 }
329 else {
330 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
331 'g', 17, 0, NULL);
332 if (!buf) {
333 p->error = WFERR_NOMEMORY;
334 return;
335 }
336 n = strlen(buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700337 W_TYPE(TYPE_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200339 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 PyMem_Free(buf);
341 }
342 }
343 else if (PyComplex_CheckExact(v)) {
344 if (p->version > 1) {
345 unsigned char buf[8];
346 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
347 buf, 1) < 0) {
348 p->error = WFERR_UNMARSHALLABLE;
349 return;
350 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700351 W_TYPE(TYPE_BINARY_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 w_string((char*)buf, 8, p);
353 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
354 buf, 1) < 0) {
355 p->error = WFERR_UNMARSHALLABLE;
356 return;
357 }
358 w_string((char*)buf, 8, p);
359 }
360 else {
361 char *buf;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700362 W_TYPE(TYPE_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
364 'g', 17, 0, NULL);
365 if (!buf) {
366 p->error = WFERR_NOMEMORY;
367 return;
368 }
369 n = strlen(buf);
370 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200371 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 PyMem_Free(buf);
373 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
374 'g', 17, 0, NULL);
375 if (!buf) {
376 p->error = WFERR_NOMEMORY;
377 return;
378 }
379 n = strlen(buf);
380 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200381 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 PyMem_Free(buf);
383 }
384 }
385 else if (PyBytes_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700386 W_TYPE(TYPE_STRING, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 n = PyBytes_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200388 W_SIZE(n, p);
389 w_string(PyBytes_AS_STRING(v), n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 }
391 else if (PyUnicode_CheckExact(v)) {
392 PyObject *utf8;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200393 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 if (utf8 == NULL) {
395 p->depth--;
396 p->error = WFERR_UNMARSHALLABLE;
397 return;
398 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700399 if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v))
400 W_TYPE(TYPE_INTERNED, p);
401 else
402 W_TYPE(TYPE_UNICODE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 n = PyBytes_GET_SIZE(utf8);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200404 W_SIZE(n, p);
405 w_string(PyBytes_AS_STRING(utf8), n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 Py_DECREF(utf8);
407 }
408 else if (PyTuple_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700409 W_TYPE(TYPE_TUPLE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 n = PyTuple_Size(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200411 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 for (i = 0; i < n; i++) {
413 w_object(PyTuple_GET_ITEM(v, i), p);
414 }
415 }
416 else if (PyList_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700417 W_TYPE(TYPE_LIST, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 n = PyList_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200419 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000420 for (i = 0; i < n; i++) {
421 w_object(PyList_GET_ITEM(v, i), p);
422 }
423 }
424 else if (PyDict_CheckExact(v)) {
425 Py_ssize_t pos;
426 PyObject *key, *value;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700427 W_TYPE(TYPE_DICT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 /* This one is NULL object terminated! */
429 pos = 0;
430 while (PyDict_Next(v, &pos, &key, &value)) {
431 w_object(key, p);
432 w_object(value, p);
433 }
434 w_object((PyObject *)NULL, p);
435 }
436 else if (PyAnySet_CheckExact(v)) {
437 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 if (PyObject_TypeCheck(v, &PySet_Type))
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700440 W_TYPE(TYPE_SET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 else
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700442 W_TYPE(TYPE_FROZENSET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 n = PyObject_Size(v);
444 if (n == -1) {
445 p->depth--;
446 p->error = WFERR_UNMARSHALLABLE;
447 return;
448 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200449 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450 it = PyObject_GetIter(v);
451 if (it == NULL) {
452 p->depth--;
453 p->error = WFERR_UNMARSHALLABLE;
454 return;
455 }
456 while ((value = PyIter_Next(it)) != NULL) {
457 w_object(value, p);
458 Py_DECREF(value);
459 }
460 Py_DECREF(it);
461 if (PyErr_Occurred()) {
462 p->depth--;
463 p->error = WFERR_UNMARSHALLABLE;
464 return;
465 }
466 }
467 else if (PyCode_Check(v)) {
468 PyCodeObject *co = (PyCodeObject *)v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700469 W_TYPE(TYPE_CODE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 w_long(co->co_argcount, p);
471 w_long(co->co_kwonlyargcount, p);
472 w_long(co->co_nlocals, p);
473 w_long(co->co_stacksize, p);
474 w_long(co->co_flags, p);
475 w_object(co->co_code, p);
476 w_object(co->co_consts, p);
477 w_object(co->co_names, p);
478 w_object(co->co_varnames, p);
479 w_object(co->co_freevars, p);
480 w_object(co->co_cellvars, p);
481 w_object(co->co_filename, p);
482 w_object(co->co_name, p);
483 w_long(co->co_firstlineno, p);
484 w_object(co->co_lnotab, p);
485 }
486 else if (PyObject_CheckBuffer(v)) {
487 /* Write unknown buffer-style objects as a string */
488 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100490 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100492 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100494 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700496 W_TYPE(TYPE_STRING, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 n = view.len;
498 s = view.buf;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200499 W_SIZE(n, p);
500 w_string(s, n, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100501 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 }
503 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700504 W_TYPE(TYPE_UNKNOWN, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 p->error = WFERR_UNMARSHALLABLE;
506 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000507}
508
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000509/* version currently has no effect for writing longs. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000510void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000511PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000512{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 WFILE wf;
514 wf.fp = fp;
515 wf.error = WFERR_OK;
516 wf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700517 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 wf.version = version;
519 w_long(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000520}
521
522void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000523PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 WFILE wf;
526 wf.fp = fp;
527 wf.error = WFERR_OK;
528 wf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700529 if (version >= 3) {
530 if ((wf.refs = PyDict_New()) == NULL)
531 return; /* caller mush check PyErr_Occurred() */
532 } else
533 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 wf.version = version;
535 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700536 Py_XDECREF(wf.refs);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000537}
538
539typedef WFILE RFILE; /* Same struct with different invariants */
540
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000541#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum8d617a61995-03-09 12:12:11 +0000542
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200543static Py_ssize_t
544r_string(char *s, Py_ssize_t n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000545{
Éric Araujo6c0ba442011-07-26 17:23:57 +0200546 char *ptr;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200547 Py_ssize_t read, left;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100548
549 if (!p->readable) {
550 if (p->fp != NULL)
551 /* The result fits into int because it must be <=n. */
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200552 read = fread(s, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100553 else {
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200554 left = p->end - p->ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100555 read = (left < n) ? left : n;
556 memcpy(s, p->ptr, read);
557 p->ptr += read;
558 }
559 }
560 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200561 _Py_IDENTIFIER(read);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200562
Serhiy Storchaka5a1f1522013-02-13 12:11:03 +0200563 PyObject *data = _PyObject_CallMethodId(p->readable, &PyId_read, "n", n);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100564 read = 0;
565 if (data != NULL) {
566 if (!PyBytes_Check(data)) {
567 PyErr_Format(PyExc_TypeError,
568 "f.read() returned not bytes but %.100s",
569 data->ob_type->tp_name);
570 }
571 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700572 read = (int)PyBytes_GET_SIZE(data);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100573 if (read > 0) {
574 ptr = PyBytes_AS_STRING(data);
575 memcpy(s, ptr, read);
576 }
577 }
578 Py_DECREF(data);
579 }
580 }
581 if (!PyErr_Occurred() && (read < n)) {
582 PyErr_SetString(PyExc_EOFError, "EOF read where not expected");
583 }
584 return read;
585}
586
587
588static int
589r_byte(RFILE *p)
590{
591 int c = EOF;
592 unsigned char ch;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200593 Py_ssize_t n;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100594
595 if (!p->readable)
596 c = p->fp ? getc(p->fp) : rs_byte(p);
597 else {
598 n = r_string((char *) &ch, 1, p);
599 if (n > 0)
600 c = ch;
601 }
602 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000603}
604
605static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000606r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000607{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 register short x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100609 unsigned char buffer[2];
610
611 r_string((char *) buffer, 2, p);
612 x = buffer[0];
613 x |= buffer[1] << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 /* Sign-extension, in case short greater than 16 bits */
615 x |= -(x & 0x8000);
616 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000617}
618
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000619static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000620r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000621{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 register long x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100623 unsigned char buffer[4];
624
625 r_string((char *) buffer, 4, p);
626 x = buffer[0];
627 x |= (long)buffer[1] << 8;
628 x |= (long)buffer[2] << 16;
629 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000630#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 /* Sign extension for 64-bit machines */
632 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000633#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000635}
636
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000638r_PyLong(RFILE *p)
639{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200641 long n, size, i;
642 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100646 if (PyErr_Occurred())
647 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 if (n == 0)
649 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200650 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 PyErr_SetString(PyExc_ValueError,
652 "bad marshal data (long size out of range)");
653 return NULL;
654 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
657 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
658 ob = _PyLong_New(size);
659 if (ob == NULL)
660 return NULL;
661 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 for (i = 0; i < size-1; i++) {
664 d = 0;
665 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
666 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100667 if (PyErr_Occurred())
668 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 if (md < 0 || md > PyLong_MARSHAL_BASE)
670 goto bad_digit;
671 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
672 }
673 ob->ob_digit[i] = d;
674 }
675 d = 0;
676 for (j=0; j < shorts_in_top_digit; j++) {
677 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100678 if (PyErr_Occurred())
679 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 if (md < 0 || md > PyLong_MARSHAL_BASE)
681 goto bad_digit;
682 /* topmost marshal digit should be nonzero */
683 if (md == 0 && j == shorts_in_top_digit - 1) {
684 Py_DECREF(ob);
685 PyErr_SetString(PyExc_ValueError,
686 "bad marshal data (unnormalized long data)");
687 return NULL;
688 }
689 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
690 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100691 if (PyErr_Occurred()) {
692 Py_DECREF(ob);
693 return NULL;
694 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 /* top digit should be nonzero, else the resulting PyLong won't be
696 normalized */
697 ob->ob_digit[size-1] = d;
698 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000699 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 Py_DECREF(ob);
701 PyErr_SetString(PyExc_ValueError,
702 "bad marshal data (digit out of range in long)");
703 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000704}
705
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700706/* allocate the reflist index for a new object. Return -1 on failure */
707static Py_ssize_t
708r_ref_reserve(int flag, RFILE *p)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700709{
710 if (flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700711 Py_ssize_t idx = PyList_Size(p->refs);
712 if (idx < 0)
713 return -1;
714 if (idx >= 0x7ffffffe) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700715 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700716 return -1;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700717 }
718 if (PyList_Append(p->refs, Py_None) < 0)
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700719 return -1;
720 return idx;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700721 } else
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700722 return 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700723}
724
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700725/* insert the new object 'o' to the reflist at previously
726 * allocated index 'idx'.
727 * 'o' can be NULL, in which case nothing is done.
728 * if 'o' was non-NULL, and the function succeeds, 'o' is returned.
729 * if 'o' was non-NULL, and the function fails, 'o' is released and
730 * NULL returned. This simplifies error checking at the call site since
731 * a single test for NULL for the function result is enough.
732 */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700733static PyObject *
734r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
735{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700736 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700737 if (PyList_SetItem(p->refs, idx, o) < 0) {
738 Py_DECREF(o); /* release the new object */
739 return NULL;
740 } else {
741 Py_INCREF(o); /* a reference for the list */
742 }
743 }
744 return o;
745}
746
747/* combination of both above, used when an object can be
748 * created whenever it is seen in the file, as opposed to
749 * after having loaded its sub-objects.
750 */
751static PyObject *
752r_ref(PyObject *o, int flag, RFILE *p)
753{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700754 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700755 if (PyList_Append(p->refs, o) < 0) {
756 Py_DECREF(o); /* release the new object */
757 return NULL;
758 }
759 }
760 return o;
761}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000762
763static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000764r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 /* NULL is a valid return value, it does not necessarily means that
767 an exception is set. */
768 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500769 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700771 int type, code = r_byte(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700772 int flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 PyObject *retval;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000774
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700775 if (code == EOF) {
776 PyErr_SetString(PyExc_EOFError,
777 "EOF read where object expected");
778 return NULL;
779 }
780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
784 p->depth--;
785 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
786 return NULL;
787 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000788
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700789 flag = code & FLAG_REF;
790 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700791
792#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700793 if (flag) \
794 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700795} while (0)
796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 case TYPE_NULL:
800 retval = NULL;
801 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 case TYPE_NONE:
804 Py_INCREF(Py_None);
805 retval = Py_None;
806 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 case TYPE_STOPITER:
809 Py_INCREF(PyExc_StopIteration);
810 retval = PyExc_StopIteration;
811 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 case TYPE_ELLIPSIS:
814 Py_INCREF(Py_Ellipsis);
815 retval = Py_Ellipsis;
816 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 case TYPE_FALSE:
819 Py_INCREF(Py_False);
820 retval = Py_False;
821 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 case TYPE_TRUE:
824 Py_INCREF(Py_True);
825 retval = Py_True;
826 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100829 n = r_long(p);
830 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700831 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 case TYPE_LONG:
835 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700836 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 case TYPE_FLOAT:
840 {
841 char buf[256];
842 double dx;
843 retval = NULL;
844 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200845 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 PyErr_SetString(PyExc_EOFError,
847 "EOF read where object expected");
848 break;
849 }
850 buf[n] = '\0';
851 dx = PyOS_string_to_double(buf, NULL, NULL);
852 if (dx == -1.0 && PyErr_Occurred())
853 break;
854 retval = PyFloat_FromDouble(dx);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700855 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 break;
857 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 case TYPE_BINARY_FLOAT:
860 {
861 unsigned char buf[8];
862 double x;
863 if (r_string((char*)buf, 8, p) != 8) {
864 PyErr_SetString(PyExc_EOFError,
865 "EOF read where object expected");
866 retval = NULL;
867 break;
868 }
869 x = _PyFloat_Unpack8(buf, 1);
870 if (x == -1.0 && PyErr_Occurred()) {
871 retval = NULL;
872 break;
873 }
874 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700875 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 break;
877 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 case TYPE_COMPLEX:
880 {
881 char buf[256];
882 Py_complex c;
883 retval = NULL;
884 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200885 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 PyErr_SetString(PyExc_EOFError,
887 "EOF read where object expected");
888 break;
889 }
890 buf[n] = '\0';
891 c.real = PyOS_string_to_double(buf, NULL, NULL);
892 if (c.real == -1.0 && PyErr_Occurred())
893 break;
894 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200895 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 PyErr_SetString(PyExc_EOFError,
897 "EOF read where object expected");
898 break;
899 }
900 buf[n] = '\0';
901 c.imag = PyOS_string_to_double(buf, NULL, NULL);
902 if (c.imag == -1.0 && PyErr_Occurred())
903 break;
904 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700905 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 break;
907 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 case TYPE_BINARY_COMPLEX:
910 {
911 unsigned char buf[8];
912 Py_complex c;
913 if (r_string((char*)buf, 8, p) != 8) {
914 PyErr_SetString(PyExc_EOFError,
915 "EOF read where object expected");
916 retval = NULL;
917 break;
918 }
919 c.real = _PyFloat_Unpack8(buf, 1);
920 if (c.real == -1.0 && PyErr_Occurred()) {
921 retval = NULL;
922 break;
923 }
924 if (r_string((char*)buf, 8, p) != 8) {
925 PyErr_SetString(PyExc_EOFError,
926 "EOF read where object expected");
927 retval = NULL;
928 break;
929 }
930 c.imag = _PyFloat_Unpack8(buf, 1);
931 if (c.imag == -1.0 && PyErr_Occurred()) {
932 retval = NULL;
933 break;
934 }
935 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700936 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 break;
938 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 case TYPE_STRING:
941 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100942 if (PyErr_Occurred()) {
943 retval = NULL;
944 break;
945 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200946 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
948 retval = NULL;
949 break;
950 }
951 v = PyBytes_FromStringAndSize((char *)NULL, n);
952 if (v == NULL) {
953 retval = NULL;
954 break;
955 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200956 if (r_string(PyBytes_AS_STRING(v), n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 Py_DECREF(v);
958 PyErr_SetString(PyExc_EOFError,
959 "EOF read where object expected");
960 retval = NULL;
961 break;
962 }
963 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700964 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 case TYPE_UNICODE:
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700968 case TYPE_INTERNED:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 {
970 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +0000971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100973 if (PyErr_Occurred()) {
974 retval = NULL;
975 break;
976 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200977 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
979 retval = NULL;
980 break;
981 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +0200982 if (n != 0) {
983 buffer = PyMem_NEW(char, n);
984 if (buffer == NULL) {
985 retval = PyErr_NoMemory();
986 break;
987 }
988 if (r_string(buffer, n, p) != n) {
989 PyMem_DEL(buffer);
990 PyErr_SetString(PyExc_EOFError,
991 "EOF read where object expected");
992 retval = NULL;
993 break;
994 }
995 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 PyMem_DEL(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +0200998 else {
999 v = PyUnicode_New(0, 0);
1000 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001001 if (type == TYPE_INTERNED)
1002 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001004 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 break;
1006 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 case TYPE_TUPLE:
1009 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001010 if (PyErr_Occurred()) {
1011 retval = NULL;
1012 break;
1013 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001014 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
1016 retval = NULL;
1017 break;
1018 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001019 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001020 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 if (v == NULL) {
1022 retval = NULL;
1023 break;
1024 }
1025 for (i = 0; i < n; i++) {
1026 v2 = r_object(p);
1027 if ( v2 == NULL ) {
1028 if (!PyErr_Occurred())
1029 PyErr_SetString(PyExc_TypeError,
1030 "NULL object in marshal data for tuple");
1031 Py_DECREF(v);
1032 v = NULL;
1033 break;
1034 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001035 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 }
1037 retval = v;
1038 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 case TYPE_LIST:
1041 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001042 if (PyErr_Occurred()) {
1043 retval = NULL;
1044 break;
1045 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001046 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
1048 retval = NULL;
1049 break;
1050 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001051 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001052 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 if (v == NULL) {
1054 retval = NULL;
1055 break;
1056 }
1057 for (i = 0; i < n; i++) {
1058 v2 = r_object(p);
1059 if ( v2 == NULL ) {
1060 if (!PyErr_Occurred())
1061 PyErr_SetString(PyExc_TypeError,
1062 "NULL object in marshal data for list");
1063 Py_DECREF(v);
1064 v = NULL;
1065 break;
1066 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001067 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 }
1069 retval = v;
1070 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 case TYPE_DICT:
1073 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001074 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 if (v == NULL) {
1076 retval = NULL;
1077 break;
1078 }
1079 for (;;) {
1080 PyObject *key, *val;
1081 key = r_object(p);
1082 if (key == NULL)
1083 break;
1084 val = r_object(p);
1085 if (val != NULL)
1086 PyDict_SetItem(v, key, val);
1087 Py_DECREF(key);
1088 Py_XDECREF(val);
1089 }
1090 if (PyErr_Occurred()) {
1091 Py_DECREF(v);
1092 v = NULL;
1093 }
1094 retval = v;
1095 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 case TYPE_SET:
1098 case TYPE_FROZENSET:
1099 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001100 if (PyErr_Occurred()) {
1101 retval = NULL;
1102 break;
1103 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001104 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
1106 retval = NULL;
1107 break;
1108 }
1109 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001110 if (type == TYPE_SET) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001111 R_REF(v);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001112 } else {
1113 /* must use delayed registration of frozensets because they must
1114 * be init with a refcount of 1
1115 */
1116 idx = r_ref_reserve(flag, p);
1117 if (idx < 0)
1118 Py_CLEAR(v); /* signal error */
1119 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 if (v == NULL) {
1121 retval = NULL;
1122 break;
1123 }
1124 for (i = 0; i < n; i++) {
1125 v2 = r_object(p);
1126 if ( v2 == NULL ) {
1127 if (!PyErr_Occurred())
1128 PyErr_SetString(PyExc_TypeError,
1129 "NULL object in marshal data for set");
1130 Py_DECREF(v);
1131 v = NULL;
1132 break;
1133 }
1134 if (PySet_Add(v, v2) == -1) {
1135 Py_DECREF(v);
1136 Py_DECREF(v2);
1137 v = NULL;
1138 break;
1139 }
1140 Py_DECREF(v2);
1141 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001142 if (type != TYPE_SET)
1143 v = r_ref_insert(v, idx, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 retval = v;
1145 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 case TYPE_CODE:
1148 {
1149 int argcount;
1150 int kwonlyargcount;
1151 int nlocals;
1152 int stacksize;
1153 int flags;
1154 PyObject *code = NULL;
1155 PyObject *consts = NULL;
1156 PyObject *names = NULL;
1157 PyObject *varnames = NULL;
1158 PyObject *freevars = NULL;
1159 PyObject *cellvars = NULL;
1160 PyObject *filename = NULL;
1161 PyObject *name = NULL;
1162 int firstlineno;
1163 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001164
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001165 idx = r_ref_reserve(flag, p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001166 if (idx < 0) {
1167 retval = NULL;
1168 break;
1169 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 /* XXX ignore long->int overflows for now */
1174 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001175 if (PyErr_Occurred())
1176 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 kwonlyargcount = (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 nlocals = (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 stacksize = (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 flags = (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 code = r_object(p);
1190 if (code == NULL)
1191 goto code_error;
1192 consts = r_object(p);
1193 if (consts == NULL)
1194 goto code_error;
1195 names = r_object(p);
1196 if (names == NULL)
1197 goto code_error;
1198 varnames = r_object(p);
1199 if (varnames == NULL)
1200 goto code_error;
1201 freevars = r_object(p);
1202 if (freevars == NULL)
1203 goto code_error;
1204 cellvars = r_object(p);
1205 if (cellvars == NULL)
1206 goto code_error;
1207 filename = r_object(p);
1208 if (filename == NULL)
1209 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001210 if (PyUnicode_CheckExact(filename)) {
1211 if (p->current_filename != NULL) {
1212 if (!PyUnicode_Compare(filename, p->current_filename)) {
1213 Py_DECREF(filename);
1214 Py_INCREF(p->current_filename);
1215 filename = p->current_filename;
1216 }
1217 }
1218 else {
1219 p->current_filename = filename;
1220 }
1221 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 name = r_object(p);
1223 if (name == NULL)
1224 goto code_error;
1225 firstlineno = (int)r_long(p);
1226 lnotab = r_object(p);
1227 if (lnotab == NULL)
1228 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 v = (PyObject *) PyCode_New(
1231 argcount, kwonlyargcount,
1232 nlocals, stacksize, flags,
1233 code, consts, names, varnames,
1234 freevars, cellvars, filename, name,
1235 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001236 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 code_error:
1239 Py_XDECREF(code);
1240 Py_XDECREF(consts);
1241 Py_XDECREF(names);
1242 Py_XDECREF(varnames);
1243 Py_XDECREF(freevars);
1244 Py_XDECREF(cellvars);
1245 Py_XDECREF(filename);
1246 Py_XDECREF(name);
1247 Py_XDECREF(lnotab);
1248 }
1249 retval = v;
1250 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001251
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001252 case TYPE_REF:
1253 n = r_long(p);
1254 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
1255 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
1256 retval = NULL;
1257 break;
1258 }
1259 v = PyList_GET_ITEM(p->refs, n);
1260 if (v == Py_None) {
1261 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
1262 retval = NULL;
1263 break;
1264 }
1265 Py_INCREF(v);
1266 retval = v;
1267 break;
1268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 default:
1270 /* Bogus data got written, which isn't ideal.
1271 This will let you keep working and recover. */
1272 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1273 retval = NULL;
1274 break;
1275
1276 }
1277 p->depth--;
1278 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001279}
1280
Neal Norwitzd85c4522004-06-13 20:31:49 +00001281static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001282read_object(RFILE *p)
1283{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 PyObject *v;
1285 if (PyErr_Occurred()) {
1286 fprintf(stderr, "XXX readobject called with exception set\n");
1287 return NULL;
1288 }
1289 v = r_object(p);
1290 if (v == NULL && !PyErr_Occurred())
1291 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1292 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001293}
1294
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001295int
1296PyMarshal_ReadShortFromFile(FILE *fp)
1297{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 RFILE rf;
1299 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001300 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001302 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 rf.end = rf.ptr = NULL;
1304 return r_short(&rf);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001305}
1306
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001307long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001308PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 RFILE rf;
1311 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001312 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001313 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 rf.ptr = rf.end = NULL;
1315 return r_long(&rf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001316}
1317
Tim Peters691e0e92001-01-18 04:39:16 +00001318#ifdef HAVE_FSTAT
1319/* Return size of file in bytes; < 0 if unknown. */
1320static off_t
1321getfilesize(FILE *fp)
1322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 struct stat st;
1324 if (fstat(fileno(fp), &st) != 0)
1325 return -1;
1326 else
1327 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001328}
1329#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001330
Tim Peters691e0e92001-01-18 04:39:16 +00001331/* If we can get the size of the file up-front, and it's reasonably small,
1332 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1333 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001334 * CAUTION: since this may read the entire remainder of the file, don't
1335 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001336 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001337PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001338PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001339{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001340/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001341#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001342#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 off_t filesize;
1344 filesize = getfilesize(fp);
1345 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1346 char* pBuf = (char *)PyMem_MALLOC(filesize);
1347 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001348 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1349 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 PyMem_FREE(pBuf);
1351 return v;
1352 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 }
Tim Peters691e0e92001-01-18 04:39:16 +00001355#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 /* We don't have fstat, or we do but the file is larger than
1357 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1358 */
1359 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001360
Tim Peters691e0e92001-01-18 04:39:16 +00001361#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001362}
1363
Guido van Rossum79f25d91997-04-29 20:08:16 +00001364PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001365PyMarshal_ReadObjectFromFile(FILE *fp)
1366{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 RFILE rf;
1368 PyObject *result;
1369 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001370 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001371 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 rf.depth = 0;
1373 rf.ptr = rf.end = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001374 rf.refs = PyList_New(0);
1375 if (rf.refs == NULL)
1376 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001378 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001380}
1381
1382PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001383PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001384{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 RFILE rf;
1386 PyObject *result;
1387 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001388 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001389 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 rf.ptr = str;
1391 rf.end = str + len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001393 rf.refs = PyList_New(0);
1394 if (rf.refs == NULL)
1395 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001397 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001399}
1400
Guido van Rossum79f25d91997-04-29 20:08:16 +00001401PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001402PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 wf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001407 wf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1409 if (wf.str == NULL)
1410 return NULL;
1411 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1412 wf.end = wf.ptr + PyBytes_Size(wf.str);
1413 wf.error = WFERR_OK;
1414 wf.depth = 0;
1415 wf.version = version;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001416 if (version >= 3) {
1417 if ((wf.refs = PyDict_New()) == NULL)
1418 return NULL;
1419 } else
1420 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001422 Py_XDECREF(wf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 if (wf.str != NULL) {
1424 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1425 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1426 Py_DECREF(wf.str);
1427 PyErr_SetString(PyExc_OverflowError,
1428 "too much marshal data for a string");
1429 return NULL;
1430 }
1431 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1432 return NULL;
1433 }
1434 if (wf.error != WFERR_OK) {
1435 Py_XDECREF(wf.str);
1436 if (wf.error == WFERR_NOMEMORY)
1437 PyErr_NoMemory();
1438 else
1439 PyErr_SetString(PyExc_ValueError,
1440 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1441 :"object too deeply nested to marshal");
1442 return NULL;
1443 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001444 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001445}
1446
Guido van Rossum64b45521991-06-07 13:58:22 +00001447/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001448
Guido van Rossum79f25d91997-04-29 20:08:16 +00001449static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001450marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001451{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 /* XXX Quick hack -- need to do this differently */
1453 PyObject *x;
1454 PyObject *f;
1455 int version = Py_MARSHAL_VERSION;
1456 PyObject *s;
1457 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001458 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1461 return NULL;
1462 s = PyMarshal_WriteObjectToString(x, version);
1463 if (s == NULL)
1464 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001465 res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 Py_DECREF(s);
1467 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001468}
1469
R. David Murraydd226ea2009-05-13 12:27:21 +00001470PyDoc_STRVAR(dump_doc,
1471"dump(value, file[, version])\n\
1472\n\
1473Write the value on the open file. The value must be a supported type.\n\
1474The file must be an open file object such as sys.stdout or returned by\n\
1475open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1476\n\
1477If the value has (or contains an object that has) an unsupported type, a\n\
1478ValueError exception is raised but garbage data will also be written\n\
1479to the file. The object will not be properly read back by load()\n\
1480\n\
1481The version argument indicates the data format that dump should use.");
1482
Guido van Rossum79f25d91997-04-29 20:08:16 +00001483static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001484marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001485{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001487 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001489
1490 /*
1491 * Make a call to the read method, but read zero bytes.
1492 * This is to ensure that the object passed in at least
1493 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001494 * This can be removed if we guarantee good error handling
1495 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001496 */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001497 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 if (data == NULL)
1499 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001500 if (!PyBytes_Check(data)) {
1501 PyErr_Format(PyExc_TypeError,
1502 "f.read() returned not bytes but %.100s",
1503 data->ob_type->tp_name);
1504 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 }
1506 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001507 rf.depth = 0;
1508 rf.fp = NULL;
1509 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001510 rf.current_filename = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001511 if ((rf.refs = PyList_New(0)) != NULL) {
1512 result = read_object(&rf);
1513 Py_DECREF(rf.refs);
1514 } else
1515 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 Py_DECREF(data);
1518 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001519}
1520
R. David Murraydd226ea2009-05-13 12:27:21 +00001521PyDoc_STRVAR(load_doc,
1522"load(file)\n\
1523\n\
1524Read one value from the open file and return it. If no valid value is\n\
1525read (e.g. because the data has a different Python versions\n\
1526incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1527The file must be an open file object opened in binary mode ('rb' or\n\
1528'r+b').\n\
1529\n\
1530Note: If an object containing an unsupported type was marshalled with\n\
1531dump(), load() will substitute None for the unmarshallable type.");
1532
1533
Guido van Rossum79f25d91997-04-29 20:08:16 +00001534static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001535marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001536{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 PyObject *x;
1538 int version = Py_MARSHAL_VERSION;
1539 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1540 return NULL;
1541 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001542}
1543
R. David Murraydd226ea2009-05-13 12:27:21 +00001544PyDoc_STRVAR(dumps_doc,
1545"dumps(value[, version])\n\
1546\n\
1547Return the string that would be written to a file by dump(value, file).\n\
1548The value must be a supported type. Raise a ValueError exception if\n\
1549value has (or contains an object that has) an unsupported type.\n\
1550\n\
1551The version argument indicates the data format that dumps should use.");
1552
1553
Guido van Rossum79f25d91997-04-29 20:08:16 +00001554static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001555marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001556{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 RFILE rf;
1558 Py_buffer p;
1559 char *s;
1560 Py_ssize_t n;
1561 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001562 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 return NULL;
1564 s = p.buf;
1565 n = p.len;
1566 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001567 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001568 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 rf.ptr = s;
1570 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001572 if ((rf.refs = PyList_New(0)) == NULL)
1573 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 PyBuffer_Release(&p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001576 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001578}
1579
R. David Murraydd226ea2009-05-13 12:27:21 +00001580PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001581"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001582\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001583Convert the bytes object to a value. If no valid value is found, raise\n\
1584EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001585ignored.");
1586
Guido van Rossum79f25d91997-04-29 20:08:16 +00001587static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1589 {"load", marshal_load, METH_O, load_doc},
1590 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1591 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1592 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001593};
1594
R. David Murraydd226ea2009-05-13 12:27:21 +00001595
1596PyDoc_STRVAR(module_doc,
1597"This module contains functions that can read and write Python values in\n\
1598a binary format. The format is specific to Python, but independent of\n\
1599machine architecture issues.\n\
1600\n\
1601Not all Python object types are supported; in general, only objects\n\
1602whose value is independent from a particular invocation of Python can be\n\
1603written and read by this module. The following types are supported:\n\
1604None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1605tuples, lists, sets, dictionaries, and code objects, where it\n\
1606should be understood that tuples, lists and dictionaries are only\n\
1607supported as long as the values contained therein are themselves\n\
1608supported; and recursive lists and dictionaries should not be written\n\
1609(they will cause infinite loops).\n\
1610\n\
1611Variables:\n\
1612\n\
1613version -- indicates the format that the module uses. Version 0 is the\n\
1614 historical format, version 1 shares interned strings and version 2\n\
1615 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001616 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001617\n\
1618Functions:\n\
1619\n\
1620dump() -- write value to a file\n\
1621load() -- read value from a file\n\
1622dumps() -- write value to a string\n\
1623loads() -- read value from a string");
1624
1625
1626
Brett Cannon429ef652008-06-27 00:35:35 +00001627static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 PyModuleDef_HEAD_INIT,
1629 "marshal",
1630 module_doc,
1631 0,
1632 marshal_methods,
1633 NULL,
1634 NULL,
1635 NULL,
1636 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001637};
1638
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001639PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001640PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001641{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 PyObject *mod = PyModule_Create(&marshalmodule);
1643 if (mod == NULL)
1644 return NULL;
1645 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1646 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001647}