Skip to content

Commit da76b27

Browse files
committed
fix: don't overwrite tp_alloc error with PyErr_NoMemory in vectorcall
tp_alloc already sets MemoryError (or another exception) on failure. Calling PyErr_NoMemory() in the shared error path would overwrite it. Now return NULL directly for tp_alloc failure and only call PyErr_NoMemory() for XXH*_createState failure (which sets no exception).
1 parent f49eaa4 commit da76b27

1 file changed

Lines changed: 20 additions & 32 deletions

File tree

src/_xxhash.c

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -511,12 +511,15 @@ PYXXH32_vectorcall(PyObject *type, PyObject *const *args,
511511

512512
PYXXH32Object *self = (PYXXH32Object *)
513513
((PyTypeObject *)type)->tp_alloc((PyTypeObject *)type, 0);
514-
if (self == NULL) goto error;
514+
if (self == NULL)
515+
return NULL;
515516

516517
self->xxhash_state = XXH32_createState();
517518
if (self->xxhash_state == NULL) {
518519
Py_DECREF(self);
519-
goto error;
520+
PyBuffer_Release(&buf);
521+
Py_XDECREF(buf_owner);
522+
return PyErr_NoMemory();
520523
}
521524
self->seed = seed;
522525
XXH32_reset(self->xxhash_state, seed);
@@ -529,12 +532,6 @@ PYXXH32_vectorcall(PyObject *type, PyObject *const *args,
529532
}
530533
Py_XDECREF(buf_owner);
531534
return (PyObject *)self;
532-
533-
error:
534-
if (buf.buf)
535-
PyBuffer_Release(&buf);
536-
Py_XDECREF(buf_owner);
537-
return PyErr_NoMemory();
538535
}
539536

540537
/* XXH32 methods */
@@ -874,12 +871,15 @@ PYXXH64_vectorcall(PyObject *type, PyObject *const *args,
874871

875872
PYXXH64Object *self = (PYXXH64Object *)
876873
((PyTypeObject *)type)->tp_alloc((PyTypeObject *)type, 0);
877-
if (self == NULL) goto error;
874+
if (self == NULL)
875+
return NULL;
878876

879877
self->xxhash_state = XXH64_createState();
880878
if (self->xxhash_state == NULL) {
881879
Py_DECREF(self);
882-
goto error;
880+
PyBuffer_Release(&buf);
881+
Py_XDECREF(buf_owner);
882+
return PyErr_NoMemory();
883883
}
884884
self->seed = seed;
885885
XXH64_reset(self->xxhash_state, seed);
@@ -892,12 +892,6 @@ PYXXH64_vectorcall(PyObject *type, PyObject *const *args,
892892
}
893893
Py_XDECREF(buf_owner);
894894
return (PyObject *)self;
895-
896-
error:
897-
if (buf.buf)
898-
PyBuffer_Release(&buf);
899-
Py_XDECREF(buf_owner);
900-
return PyErr_NoMemory();
901895
}
902896
static PyObject *PYXXH64_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
903897
{
@@ -1233,12 +1227,15 @@ PYXXH3_64_vectorcall(PyObject *type, PyObject *const *args,
12331227

12341228
PYXXH3_64Object *self = (PYXXH3_64Object *)
12351229
((PyTypeObject *)type)->tp_alloc((PyTypeObject *)type, 0);
1236-
if (self == NULL) goto error;
1230+
if (self == NULL)
1231+
return NULL;
12371232

12381233
self->xxhash_state = XXH3_createState();
12391234
if (self->xxhash_state == NULL) {
12401235
Py_DECREF(self);
1241-
goto error;
1236+
PyBuffer_Release(&buf);
1237+
Py_XDECREF(buf_owner);
1238+
return PyErr_NoMemory();
12421239
}
12431240
self->seed = seed;
12441241
XXH3_64bits_reset_withSeed(self->xxhash_state, seed);
@@ -1251,12 +1248,6 @@ PYXXH3_64_vectorcall(PyObject *type, PyObject *const *args,
12511248
}
12521249
Py_XDECREF(buf_owner);
12531250
return (PyObject *)self;
1254-
1255-
error:
1256-
if (buf.buf)
1257-
PyBuffer_Release(&buf);
1258-
Py_XDECREF(buf_owner);
1259-
return PyErr_NoMemory();
12601251
}
12611252
static PyObject *PYXXH3_64_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
12621253
{
@@ -1601,12 +1592,15 @@ PYXXH3_128_vectorcall(PyObject *type, PyObject *const *args,
16011592

16021593
PYXXH3_128Object *self = (PYXXH3_128Object *)
16031594
((PyTypeObject *)type)->tp_alloc((PyTypeObject *)type, 0);
1604-
if (self == NULL) goto error;
1595+
if (self == NULL)
1596+
return NULL;
16051597

16061598
self->xxhash_state = XXH3_createState();
16071599
if (self->xxhash_state == NULL) {
16081600
Py_DECREF(self);
1609-
goto error;
1601+
PyBuffer_Release(&buf);
1602+
Py_XDECREF(buf_owner);
1603+
return PyErr_NoMemory();
16101604
}
16111605
self->seed = seed;
16121606
XXH3_128bits_reset_withSeed(self->xxhash_state, seed);
@@ -1619,12 +1613,6 @@ PYXXH3_128_vectorcall(PyObject *type, PyObject *const *args,
16191613
}
16201614
Py_XDECREF(buf_owner);
16211615
return (PyObject *)self;
1622-
1623-
error:
1624-
if (buf.buf)
1625-
PyBuffer_Release(&buf);
1626-
Py_XDECREF(buf_owner);
1627-
return PyErr_NoMemory();
16281616
}
16291617
static PyObject *PYXXH3_128_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
16301618
{

0 commit comments

Comments
 (0)