Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.7k
gh-101006: Improve error handling when read marshal data#101007
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Changes from2 commits
18c020c0ae2bdbbaa83b3a55545aFile filter
Filter by extension
Conversations
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| Improve error handling when read :mod:`marshal` data. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -747,23 +747,28 @@ r_string(Py_ssize_t n, RFILE *p) | ||
| static int | ||
| r_byte(RFILE *p) | ||
| { | ||
| if (p->ptr != NULL) { | ||
| if (p->ptr < p->end) { | ||
| return (unsigned char) *p->ptr++; | ||
| } | ||
| } | ||
| elseif (!p->readable) { | ||
| assert(p->fp); | ||
| int c = getc(p->fp); | ||
| if (c != EOF) { | ||
| return c; | ||
| } | ||
| } | ||
| else { | ||
| const char *ptr = r_string(1, p); | ||
| if (ptr != NULL) { | ||
| return *(const unsigned char *) ptr; | ||
| } | ||
| return EOF; | ||
| } | ||
| PyErr_SetString(PyExc_EOFError, | ||
| "EOF read where not expected"); | ||
| return EOF; | ||
| } | ||
| static int | ||
| @@ -824,10 +829,10 @@ r_PyLong(RFILE *p) | ||
| digit d; | ||
| n = r_long(p); | ||
| if (n == 0) | ||
| return (PyObject *)_PyLong_New(0); | ||
| if (n == -1 && PyErr_Occurred()) | ||
| return NULL; | ||
serhiy-storchaka marked this conversation as resolved. OutdatedShow resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
| if (n < -SIZE32_MAX || n > SIZE32_MAX) { | ||
| PyErr_SetString(PyExc_ValueError, | ||
| "bad marshal data (long size out of range)"); | ||
| @@ -846,10 +851,6 @@ r_PyLong(RFILE *p) | ||
| d = 0; | ||
| for (j=0; j < PyLong_MARSHAL_RATIO; j++) { | ||
| md = r_short(p); | ||
| if (md < 0 || md > PyLong_MARSHAL_BASE) | ||
| goto bad_digit; | ||
| d += (digit)md << j*PyLong_MARSHAL_SHIFT; | ||
| @@ -860,10 +861,6 @@ r_PyLong(RFILE *p) | ||
| d = 0; | ||
| for (j=0; j < shorts_in_top_digit; j++) { | ||
| md = r_short(p); | ||
| if (md < 0 || md > PyLong_MARSHAL_BASE) | ||
| goto bad_digit; | ||
| /* topmost marshal digit should be nonzero */ | ||
| @@ -875,18 +872,16 @@ r_PyLong(RFILE *p) | ||
| } | ||
| d += (digit)md << j*PyLong_MARSHAL_SHIFT; | ||
| } | ||
arhadthedev marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
| /* top digit should be nonzero, else the resulting PyLong won't be | ||
| normalized */ | ||
| ob->long_value.ob_digit[size-1] = d; | ||
| return (PyObject *)ob; | ||
| bad_digit: | ||
| Py_DECREF(ob); | ||
| if (!PyErr_Occurred()) { | ||
| PyErr_SetString(PyExc_ValueError, | ||
| "bad marshal data (digit out of range in long)"); | ||
| } | ||
| return NULL; | ||
| } | ||
| @@ -909,8 +904,6 @@ r_float_str(RFILE *p) | ||
| const char *ptr; | ||
| n = r_byte(p); | ||
| if (n == EOF) { | ||
| return -1; | ||
| } | ||
| ptr = r_string(n, p); | ||
| @@ -988,8 +981,10 @@ r_object(RFILE *p) | ||
| PyObject *retval = NULL; | ||
| if (code == EOF) { | ||
| if (PyErr_ExceptionMatches(PyExc_EOFError)) { | ||
| PyErr_SetString(PyExc_EOFError, | ||
| "EOF read where object expected"); | ||
| } | ||
| return NULL; | ||
| } | ||
| @@ -1036,7 +1031,9 @@ r_object(RFILE *p) | ||
| case TYPE_INT: | ||
| n = r_long(p); | ||
| if (n == -1 && PyErr_Occurred()) | ||
| break; | ||
serhiy-storchaka marked this conversation as resolved. OutdatedShow resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
| retval = PyLong_FromLong(n); | ||
| R_REF(retval); | ||
| break; | ||
| @@ -1102,10 +1099,10 @@ r_object(RFILE *p) | ||
| { | ||
| const char *ptr; | ||
| n = r_long(p); | ||
| if (n < 0 || n > SIZE32_MAX) { | ||
| if (!PyErr_Occurred()) { | ||
| PyErr_SetString(PyExc_ValueError, "bad marshal data (bytes object size out of range)"); | ||
serhiy-storchaka marked this conversation as resolved. OutdatedShow resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
| } | ||
| break; | ||
| } | ||
| v = PyBytes_FromStringAndSize((char *)NULL, n); | ||
| @@ -1127,10 +1124,10 @@ r_object(RFILE *p) | ||
| /* fall through */ | ||
| case TYPE_ASCII: | ||
| n = r_long(p); | ||
| if (n < 0 || n > SIZE32_MAX) { | ||
| if (!PyErr_Occurred()) { | ||
| PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)"); | ||
serhiy-storchaka marked this conversation as resolved. OutdatedShow resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
| } | ||
| break; | ||
| } | ||
| goto _read_ascii; | ||
| @@ -1141,8 +1138,6 @@ r_object(RFILE *p) | ||
| case TYPE_SHORT_ASCII: | ||
| n = r_byte(p); | ||
| if (n == EOF) { | ||
| break; | ||
| } | ||
| _read_ascii: | ||
| @@ -1169,10 +1164,10 @@ r_object(RFILE *p) | ||
| const char *buffer; | ||
| n = r_long(p); | ||
| if (n < 0 || n > SIZE32_MAX) { | ||
| if (!PyErr_Occurred()) { | ||
| PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)"); | ||
serhiy-storchaka marked this conversation as resolved. OutdatedShow resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
| } | ||
| break; | ||
| } | ||
| if (n != 0) { | ||
| @@ -1194,16 +1189,17 @@ r_object(RFILE *p) | ||
| } | ||
| case TYPE_SMALL_TUPLE: | ||
| n = r_byte(p); | ||
| if (n == EOF) { | ||
| break; | ||
| } | ||
| goto _read_tuple; | ||
| case TYPE_TUPLE: | ||
| n = r_long(p); | ||
| if (n < 0 || n > SIZE32_MAX) { | ||
| if (!PyErr_Occurred()) { | ||
| PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)"); | ||
serhiy-storchaka marked this conversation as resolved. OutdatedShow resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
| } | ||
| break; | ||
| } | ||
| _read_tuple: | ||
| @@ -1228,10 +1224,10 @@ r_object(RFILE *p) | ||
| case TYPE_LIST: | ||
| n = r_long(p); | ||
| if (n < 0 || n > SIZE32_MAX) { | ||
| if (!PyErr_Occurred()) { | ||
| PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)"); | ||
serhiy-storchaka marked this conversation as resolved. OutdatedShow resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
| } | ||
| break; | ||
| } | ||
| v = PyList_New(n); | ||
| @@ -1284,10 +1280,10 @@ r_object(RFILE *p) | ||
| case TYPE_SET: | ||
| case TYPE_FROZENSET: | ||
| n = r_long(p); | ||
| if (n < 0 || n > SIZE32_MAX) { | ||
| if (!PyErr_Occurred()) { | ||
| PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)"); | ||
serhiy-storchaka marked this conversation as resolved. OutdatedShow resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
| } | ||
| break; | ||
| } | ||
| @@ -1364,20 +1360,20 @@ r_object(RFILE *p) | ||
| /* XXX ignore long->int overflows for now */ | ||
| argcount = (int)r_long(p); | ||
| if (argcount == -1 &&PyErr_Occurred()) | ||
| goto code_error; | ||
| posonlyargcount = (int)r_long(p); | ||
| if (posonlyargcount == -1 &&PyErr_Occurred()) { | ||
| goto code_error; | ||
| } | ||
| kwonlyargcount = (int)r_long(p); | ||
| if (kwonlyargcount == -1 &&PyErr_Occurred()) | ||
| goto code_error; | ||
| stacksize = (int)r_long(p); | ||
| if (stacksize == -1 &&PyErr_Occurred()) | ||
| goto code_error; | ||
| flags = (int)r_long(p); | ||
| if (flags == -1 &&PyErr_Occurred()) | ||
| goto code_error; | ||
| code = r_object(p); | ||
| if (code == NULL) | ||
| @@ -1450,6 +1446,10 @@ r_object(RFILE *p) | ||
| v = r_ref_insert(v, idx, flag, p); | ||
| code_error: | ||
| if (v == NULL && !PyErr_Occurred()) { | ||
| PyErr_SetString(PyExc_TypeError, | ||
| "NULL object in marshal data for code object"); | ||
| } | ||
| Py_XDECREF(code); | ||
| Py_XDECREF(consts); | ||
| Py_XDECREF(names); | ||
| @@ -1467,9 +1467,9 @@ r_object(RFILE *p) | ||
| case TYPE_REF: | ||
| n = r_long(p); | ||
| if (n < 0 || n >= PyList_GET_SIZE(p->refs)) { | ||
| if (!PyErr_Occurred()) { | ||
| PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)"); | ||
serhiy-storchaka marked this conversation as resolved. OutdatedShow resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
| } | ||
| break; | ||
| } | ||
| v = PyList_GET_ITEM(p->refs, n); | ||