Skip to content
This repository was archived by the owner on Jun 27, 2025. It is now read-only.

Commit d3d4b46

Browse files
committed
more careful handling of object created to be passed to PyErr_SetObject
1 parent fbd592f commit d3d4b46

1 file changed

Lines changed: 31 additions & 7 deletions

File tree

arraymap.c

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,7 +1239,12 @@ insert_int(
12391239
return -1;
12401240
}
12411241
if (self->table[table_pos].hash != -1) {
1242-
PyErr_SetObject(NonUniqueError, PyLong_FromSsize_t(key));
1242+
PyObject* er = PyLong_FromLongLong(key); // for error reporting
1243+
if (er == NULL) {
1244+
return -1;
1245+
}
1246+
PyErr_SetObject(NonUniqueError, er);
1247+
Py_DECREF(er);
12431248
return -1;
12441249
}
12451250
self->table[table_pos].keys_pos = keys_pos;
@@ -1264,7 +1269,12 @@ insert_uint(
12641269
return -1;
12651270
}
12661271
if (self->table[table_pos].hash != -1) {
1267-
PyErr_SetObject(NonUniqueError, PyLong_FromSsize_t(key));
1272+
PyObject* er = PyLong_FromUnsignedLongLong(key);
1273+
if (er == NULL) {
1274+
return -1;
1275+
}
1276+
PyErr_SetObject(NonUniqueError, er);
1277+
Py_DECREF(er);
12681278
return -1;
12691279
}
12701280
self->table[table_pos].keys_pos = keys_pos;
@@ -1290,7 +1300,12 @@ insert_double(
12901300
return -1;
12911301
}
12921302
if (self->table[table_pos].hash != -1) {
1293-
PyErr_SetObject(NonUniqueError, PyFloat_FromDouble(key));
1303+
PyObject* er = PyFloat_FromDouble(key);
1304+
if (er == NULL) {
1305+
return -1;
1306+
}
1307+
PyErr_SetObject(NonUniqueError, er);
1308+
Py_DECREF(er);
12941309
return -1;
12951310
}
12961311
self->table[table_pos].keys_pos = keys_pos;
@@ -1316,8 +1331,12 @@ insert_unicode(
13161331
return -1;
13171332
}
13181333
if (self->table[table_pos].hash != -1) {
1319-
PyErr_SetObject(NonUniqueError,
1320-
PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, key, key_size));
1334+
PyObject* er = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, key, key_size);
1335+
if (er == NULL) {
1336+
return -1;
1337+
}
1338+
PyErr_SetObject(NonUniqueError, er);
1339+
Py_DECREF(er);
13211340
return -1;
13221341
}
13231342
self->table[table_pos].keys_pos = keys_pos;
@@ -1343,8 +1362,12 @@ insert_string(
13431362
return -1;
13441363
}
13451364
if (self->table[table_pos].hash != -1) {
1346-
PyErr_SetObject(NonUniqueError,
1347-
PyBytes_FromStringAndSize(key, key_size));
1365+
PyObject* er = PyBytes_FromStringAndSize(key, key_size);
1366+
if (er == NULL) {
1367+
return -1;
1368+
}
1369+
PyErr_SetObject(NonUniqueError, er);
1370+
Py_DECREF(er);
13481371
return -1;
13491372
}
13501373
self->table[table_pos].keys_pos = keys_pos;
@@ -1947,6 +1970,7 @@ fam_init(PyObject *self, PyObject *args, PyObject *kwargs)
19471970
}
19481971
return 0;
19491972
error:
1973+
// assume all dynamic memory assigned to struct attrs that will be cleaned
19501974
return -1;
19511975
}
19521976

0 commit comments

Comments
 (0)