dcavalca / rpms / rpm

Forked from rpms/rpm a year ago
Clone
James Antill ee2eaf
From ed6c5573c09611ff9522ed290ef9d1ba717d8019 Mon Sep 17 00:00:00 2001
James Antill ee2eaf
Message-Id: <ed6c5573c09611ff9522ed290ef9d1ba717d8019.1574331915.git.pmatilai@redhat.com>
James Antill ee2eaf
From: Panu Matilainen <pmatilai@redhat.com>
James Antill ee2eaf
Date: Thu, 21 Nov 2019 12:22:45 +0200
James Antill ee2eaf
Subject: [PATCH] Fix resource leaks on zstd open error paths
James Antill ee2eaf
James Antill ee2eaf
If zstd stream initialization fails, the opened fd and the stream
James Antill ee2eaf
itself are leaked. Handle error exit in a central label.
James Antill ee2eaf
---
James Antill ee2eaf
 rpmio/rpmio.c | 12 ++++++++++--
James Antill ee2eaf
 1 file changed, 10 insertions(+), 2 deletions(-)
James Antill ee2eaf
James Antill ee2eaf
diff --git a/rpmio/rpmio.c b/rpmio/rpmio.c
James Antill ee2eaf
index 243942411..10ba20cd6 100644
James Antill ee2eaf
--- a/rpmio/rpmio.c
James Antill ee2eaf
+++ b/rpmio/rpmio.c
James Antill ee2eaf
@@ -1128,13 +1128,13 @@ static rpmzstd rpmzstdNew(int fdno, const char *fmode)
James Antill ee2eaf
     if ((flags & O_ACCMODE) == O_RDONLY) {	/* decompressing */
James Antill ee2eaf
 	if ((_stream = (void *) ZSTD_createDStream()) == NULL
James Antill ee2eaf
 	 || ZSTD_isError(ZSTD_initDStream(_stream))) {
James Antill ee2eaf
-	    return NULL;
James Antill ee2eaf
+	    goto err;
James Antill ee2eaf
 	}
James Antill ee2eaf
 	nb = ZSTD_DStreamInSize();
James Antill ee2eaf
     } else {					/* compressing */
James Antill ee2eaf
 	if ((_stream = (void *) ZSTD_createCStream()) == NULL
James Antill ee2eaf
 	 || ZSTD_isError(ZSTD_initCStream(_stream, level))) {
James Antill ee2eaf
-	    return NULL;
James Antill ee2eaf
+	    goto err;
James Antill ee2eaf
 	}
James Antill ee2eaf
 	nb = ZSTD_CStreamOutSize();
James Antill ee2eaf
     }
James Antill ee2eaf
@@ -1149,6 +1149,14 @@ static rpmzstd rpmzstdNew(int fdno, const char *fmode)
James Antill ee2eaf
     zstd->b = xmalloc(nb);
James Antill ee2eaf
 
James Antill ee2eaf
     return zstd;
James Antill ee2eaf
+
James Antill ee2eaf
+err:
James Antill ee2eaf
+    fclose(fp);
James Antill ee2eaf
+    if ((flags & O_ACCMODE) == O_RDONLY)
James Antill ee2eaf
+	ZSTD_freeDStream(_stream);
James Antill ee2eaf
+    else
James Antill ee2eaf
+	ZSTD_freeCStream(_stream);
James Antill ee2eaf
+    return NULL;
James Antill ee2eaf
 }
James Antill ee2eaf
 
James Antill ee2eaf
 static FD_t zstdFdopen(FD_t fd, int fdno, const char * fmode)
James Antill ee2eaf
-- 
James Antill ee2eaf
2.23.0
James Antill ee2eaf