8000 BUG: Add missing error checking to exception string creation. · numpy/numpy@17bac32 · GitHub
[go: up one dir, main page]

Skip to content

Commit 17bac32

Browse files
committed
BUG: Add missing error checking to exception string creation.
If `repr` throws this would previously segfault
1 parent 2592c6a commit 17bac32

File tree

1 file changed

+31
-22
lines changed

1 file changed

+31
-22
lines changed

numpy/core/src/umath/ufunc_type_resolution.c

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -63,17 +63,21 @@ PyUFunc_ValidateCasting(PyUFuncObject *ufunc,
6363
if (i < nin) {
6464
if (!PyArray_CanCastArrayTo(operands[i], dtypes[i], casting)) {
6565
PyObject *errmsg;
66-
errmsg = PyUString_FromFormat("Cannot cast ufunc %s "
67-
"input from ", ufunc_name);
68-
PyUString_ConcatAndDel(&errmsg,
69-
PyObject_Repr((PyObject *)PyArray_DESCR(operands[i])));
70-
PyUString_ConcatAndDel(&errmsg,
71-
PyUString_FromString(" to "));
72-
PyUString_ConcatAndDel(&errmsg,
73-
PyObject_Repr((PyObject *)dtypes[i]));
74-
PyUString_ConcatAndDel(&errmsg,
75-
PyUString_FromFormat(" with casting rule %s",
76-
npy_casting_to_string(casting)));
66+
PyObject *fmt = PyUString_FromFormat(
67+
"Cannot cast ufunc %s input from {} to {} with casting "
68+
"rule %s",
69+
ufunc_name, npy_casting_to_string(casting)
70+
);
71+
if (fmt == NULL) {
72+
return -1;
73+
}
74+
errmsg = PyObject_CallMethod(fmt, "format", "OO",
75+
(PyObject *)PyArray_DESCR(operands[i]),
76+
(PyObject *)dtypes[i]);
77+
Py_DECREF(fmt);
78+
if (errmsg == NULL){
79+
return -1;
80+
}
7781
PyErr_SetObject(PyExc_TypeError, errmsg);
7882
Py_DECREF(errmsg);
7983
return -1;
@@ -82,17 +86,22 @@ PyUFunc_ValidateCasting(PyUFuncObject *ufunc,
8286
if (!PyArray_CanCastTypeTo(dtypes[i],
8387
PyArray_DESCR(operands[i]), casting)) {
8488
PyObject *errmsg;
85-
errmsg = PyUString_FromFormat("Cannot cast ufunc %s "
86-
"output from ", ufunc_name);
87-
PyUString_ConcatAndDel(&errmsg,
88-
PyObject_Repr((PyObject *)dtypes[i]));
89-
PyUString_ConcatAndDel(&errmsg,
90-
PyUString_FromString(" to "));
91-
PyUString_ConcatAndDel(&errmsg,
92-
PyObject_Repr((PyObject *)PyArray_DESCR(operands[i])));
93-
PyUString_ConcatAndDel(&errmsg,
94-
PyUString_FromFormat(" with casting rule %s",
95-
npy_casting_to_string(casting)));
89+
PyObject *fmt = PyUString_FromFormat(
90+
"Cannot cast ufunc %s output from {} to {} with casting "
91+
"rule %s",
92+
ufunc_name, npy_casting_to_string(casting)
93+
);
94+
if (fmt == NULL) {
95+
return -1;
96+
}
97+
errmsg = PyObject_CallMethod(fmt, "format", "OO",
98+
(PyObject *)dtypes[i],
99+
(PyObject *)PyArray_DESCR(operands[i])
100+
);
101+
Py_DECREF(fmt);
102+
if (errmsg == NULL){
103+
return -1;
104+
}
96105
PyErr_SetObject(PyExc_TypeError, errmsg);
97106
Py_DECREF(errmsg);
98107
return -1;

0 commit comments

Comments
 (0)
0