From e68a1e2ca119085aad7a20b1657087b66d669c4c Mon Sep 17 00:00:00 2001 From: Aarni Koskela Date: Thu, 9 Jul 2026 12:16:33 +0300 Subject: [PATCH] geometry: clean up imOut if operation fails Co-authored-by: Andrew Murray <3112309+radarhere@users.noreply.github.com> --- src/_imaging.c | 58 +++++++++++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/src/_imaging.c b/src/_imaging.c index ecdaa51c429..25a4f085e96 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -2189,30 +2189,40 @@ _transpose(ImagingObject *self, PyObject *args) { return NULL; } - if (imOut) { - switch (op) { - case 0: - (void)ImagingFlipLeftRight(imOut, imIn); - break; - case 1: - (void)ImagingFlipTopBottom(imOut, imIn); - break; - case 2: - (void)ImagingRotate90(imOut, imIn); - break; - case 3: - (void)ImagingRotate180(imOut, imIn); - break; - case 4: - (void)ImagingRotate270(imOut, imIn); - break; - case 5: - (void)ImagingTranspose(imOut, imIn); - break; - case 6: - (void)ImagingTransverse(imOut, imIn); - break; - } + if (!imOut) { + return NULL; + } + + Imaging imTemp = NULL; // will be either NULL or imOut after the operation finishes + switch (op) { + case 0: + imTemp = ImagingFlipLeftRight(imOut, imIn); + break; + case 1: + imTemp = ImagingFlipTopBottom(imOut, imIn); + break; + case 2: + imTemp = ImagingRotate90(imOut, imIn); + break; + case 3: + imTemp = ImagingRotate180(imOut, imIn); + break; + case 4: + imTemp = ImagingRotate270(imOut, imIn); + break; + case 5: + imTemp = ImagingTranspose(imOut, imIn); + break; + case 6: + imTemp = ImagingTransverse(imOut, imIn); + break; + default: + PyErr_SetString(PyExc_ValueError, "No such transpose operation"); + return NULL; + } + if (!imTemp) { // operation failed and will have set an exception + ImagingDelete(imOut); + return NULL; } return PyImagingNew(imOut);