From 821665055fbdf15c94021601a2ba94a08bc7afb3 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Tue, 13 May 2025 11:11:52 +0200 Subject: [PATCH] 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. (cherry picked from commit e575190abbd9409adad3e7fd95424f827236bed9) Co-authored-by: Petr Viktorin --- Modules/_zstd/compressor.c | 10 +++++----- Modules/_zstd/decompressor.c | 10 +++++----- Modules/_zstd/zstddict.c | 9 +++++---- 3 files changed, 15 insertions(+), 14 deletions(-) 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); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy