https://github.com/python/cpython/commit/e575190abbd9409adad3e7fd95424f827236bed9
commit: e575190abbd9409adad3e7fd95424f827236bed9
branch: main
author: Petr Viktorin <[email protected]>
committer: encukou <[email protected]>
date: 2025-05-13T11:11:52+02:00
summary:
gh-132983: Call Py_XDECREF rather than PyObject_GC_Del in failed __new__
(GH-133962)
Call Py_XDECREF rather than PyObject_GC_Del in failed __new__
This will call tp_dealloc and clear all members.
files:
M Modules/_zstd/compressor.c
M Modules/_zstd/decompressor.c
M Modules/_zstd/zstddict.c
diff --git a/Modules/_zstd/compressor.c b/Modules/_zstd/compressor.c
index 97693fd043efb2..38baee2be1e95b 100644
--- a/Modules/_zstd/compressor.c
+++ b/Modules/_zstd/compressor.c
@@ -338,6 +338,7 @@ _zstd_ZstdCompressor_new_impl(PyTypeObject *type, PyObject
*level,
}
self->use_multithread = 0;
+ self->dict = NULL;
/* Compression context */
self->cctx = ZSTD_createCCtx();
@@ -372,7 +373,6 @@ _zstd_ZstdCompressor_new_impl(PyTypeObject *type, PyObject
*level,
}
/* Load Zstandard dictionary to compression context */
- self->dict = NULL;
if (zstd_dict != Py_None) {
if (_zstd_load_c_dict(self, zstd_dict) < 0) {
goto error;
@@ -387,9 +387,7 @@ _zstd_ZstdCompressor_new_impl(PyTypeObject *type, PyObject
*level,
return (PyObject*)self;
error:
- if (self != NULL) {
- PyObject_GC_Del(self);
- }
+ Py_XDECREF(self);
return NULL;
}
@@ -401,7 +399,9 @@ ZstdCompressor_dealloc(PyObject *ob)
PyObject_GC_UnTrack(self);
/* Free compression context */
- ZSTD_freeCCtx(self->cctx);
+ if (self->cctx) {
+ ZSTD_freeCCtx(self->cctx);
+ }
/* Py_XDECREF the dict after free the compression context */
Py_CLEAR(self->dict);
diff --git a/Modules/_zstd/decompressor.c b/Modules/_zstd/decompressor.c
index 852b796a872eef..58f9c9f804e549 100644
--- a/Modules/_zstd/decompressor.c
+++ b/Modules/_zstd/decompressor.c
@@ -554,6 +554,7 @@ _zstd_ZstdDecompressor_new_impl(PyTypeObject *type,
PyObject *zstd_dict,
self->in_end = -1;
self->unused_data = NULL;
self->eof = 0;
+ self->dict = NULL;
/* needs_input flag */
self->needs_input = 1;
@@ -570,7 +571,6 @@ _zstd_ZstdDecompressor_new_impl(PyTypeObject *type,
PyObject *zstd_dict,
}
/* Load Zstandard dictionary to decompression context */
- self->dict = NULL;
if (zstd_dict != Py_None) {
if (_zstd_load_d_dict(self, zstd_dict) < 0) {
goto error;
@@ -592,9 +592,7 @@ _zstd_ZstdDecompressor_new_impl(PyTypeObject *type,
PyObject *zstd_dict,
return (PyObject*)self;
error:
- if (self != NULL) {
- PyObject_GC_Del(self);
- }
+ Py_XDECREF(self);
return NULL;
}
@@ -606,7 +604,9 @@ ZstdDecompressor_dealloc(PyObject *ob)
PyObject_GC_UnTrack(self);
/* Free decompression context */
- ZSTD_freeDCtx(self->dctx);
+ if (self->dctx) {
+ ZSTD_freeDCtx(self->dctx);
+ }
/* Py_CLEAR the dict after free decompression context */
Py_CLEAR(self->dict);
diff --git a/Modules/_zstd/zstddict.c b/Modules/_zstd/zstddict.c
index 264946e8da2a99..7df187a6fa69d7 100644
--- a/Modules/_zstd/zstddict.c
+++ b/Modules/_zstd/zstddict.c
@@ -52,6 +52,7 @@ _zstd_ZstdDict_new_impl(PyTypeObject *type, PyObject
*dict_content,
self->dict_content = NULL;
self->d_dict = NULL;
+ self->dict_id = 0;
/* ZSTD_CDict dict */
self->c_dicts = PyDict_New();
@@ -92,9 +93,7 @@ _zstd_ZstdDict_new_impl(PyTypeObject *type, PyObject
*dict_content,
return (PyObject*)self;
error:
- if (self != NULL) {
- PyObject_GC_Del(self);
- }
+ Py_XDECREF(self);
return NULL;
}
@@ -106,7 +105,9 @@ ZstdDict_dealloc(PyObject *ob)
PyObject_GC_UnTrack(self);
/* Free ZSTD_DDict instance */
- ZSTD_freeDDict(self->d_dict);
+ if (self->d_dict) {
+ ZSTD_freeDDict(self->d_dict);
+ }
/* Release dict_content after Free ZSTD_CDict/ZSTD_DDict instances */
Py_CLEAR(self->dict_content);
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]