Mercurial > cpython-lru_cache-weakref
diff Python/marshal.c @ 86807:985f8762ee3e
Issue #19437: Fix r_PyLong() of marshal module, stop immediatly at first
failure, don't read any more data
| author | Victor Stinner <victor.stinner@gmail.com> |
|---|---|
| date | Thu, 31 Oct 2013 16:56:38 +0100 |
| parents | 3055e61f1e66 |
| children | 9e836a945ea9 |
line wrap: on
line diff
--- a/Python/marshal.c Thu Oct 31 16:35:38 2013 +0100 +++ b/Python/marshal.c Thu Oct 31 16:56:38 2013 +0100 @@ -612,6 +612,7 @@ } p->buf_size = n; } + if (!p->readable) { assert(p->fp != NULL); read = fread(p->buf, 1, n, p->fp); @@ -731,25 +732,31 @@ ob = _PyLong_New(size); if (ob == NULL) return NULL; + Py_SIZE(ob) = n > 0 ? size : -size; for (i = 0; i < size-1; i++) { d = 0; for (j=0; j < PyLong_MARSHAL_RATIO; j++) { md = r_short(p); - if (PyErr_Occurred()) - break; + if (PyErr_Occurred()) { + Py_DECREF(ob); + return NULL; + } if (md < 0 || md > PyLong_MARSHAL_BASE) goto bad_digit; d += (digit)md << j*PyLong_MARSHAL_SHIFT; } ob->ob_digit[i] = d; } + d = 0; for (j=0; j < shorts_in_top_digit; j++) { md = r_short(p); - if (PyErr_Occurred()) - break; + if (PyErr_Occurred()) { + Py_DECREF(ob); + return NULL; + } if (md < 0 || md > PyLong_MARSHAL_BASE) goto bad_digit; /* topmost marshal digit should be nonzero */
