Skip to content

Commit

Permalink
[3.12] gh-105375: Improve error handling in PyUnicode_BuildEncodingMa…
Browse files Browse the repository at this point in the history
…p() (GH-105491) (#105661)

Bail on first error to prevent exceptions from possibly being overwritten.
(cherry picked from commit 555be81)

Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>
  • Loading branch information
miss-islington and erlend-aasland committed Jun 11, 2023
1 parent db5022c commit ed03895
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 12 deletions.
@@ -0,0 +1,2 @@
Improve error handling in :c:func:`PyUnicode_BuildEncodingMap` where an
exception could end up being overwritten.
29 changes: 17 additions & 12 deletions Objects/unicodeobject.c
Expand Up @@ -7934,25 +7934,30 @@ PyUnicode_BuildEncodingMap(PyObject* string)

if (need_dict) {
PyObject *result = PyDict_New();
PyObject *key, *value;
if (!result)
return NULL;
for (i = 0; i < length; i++) {
key = PyLong_FromLong(PyUnicode_READ(kind, data, i));
value = PyLong_FromLong(i);
if (!key || !value)
goto failed1;
if (PyDict_SetItem(result, key, value) == -1)
goto failed1;
Py_UCS4 c = PyUnicode_READ(kind, data, i);
PyObject *key = PyLong_FromLong(c);
if (key == NULL) {
Py_DECREF(result);
return NULL;
}
PyObject *value = PyLong_FromLong(i);
if (value == NULL) {
Py_DECREF(key);
Py_DECREF(result);
return NULL;
}
int rc = PyDict_SetItem(result, key, value);
Py_DECREF(key);
Py_DECREF(value);
if (rc < 0) {
Py_DECREF(result);
return NULL;
}
}
return result;
failed1:
Py_XDECREF(key);
Py_XDECREF(value);
Py_DECREF(result);
return NULL;
}

/* Create a three-level trie */
Expand Down

0 comments on commit ed03895

Please sign in to comment.