Blame SOURCES/libtar-1.2.20-fix-resource-leaks.patch

5a6651
From abd0274e6b2f708e9eaa29414b07b3f542cec694 Mon Sep 17 00:00:00 2001
5a6651
From: Kamil Dudka <kdudka@redhat.com>
5a6651
Date: Tue, 15 Oct 2013 19:48:41 -0400
5a6651
Subject: [PATCH 1/3] fix file descriptor leaks reported by cppcheck
5a6651
5a6651
Bug: https://bugzilla.redhat.com/785760
5a6651
---
5a6651
 lib/append.c    |   14 +++++++++-----
5a6651
 lib/extract.c   |    4 ++++
5a6651
 libtar/libtar.c |    3 +++
5a6651
 3 files changed, 16 insertions(+), 5 deletions(-)
5a6651
5a6651
diff --git a/lib/append.c b/lib/append.c
5a6651
index e8bd89d..ff58532 100644
5a6651
--- a/lib/append.c
5a6651
+++ b/lib/append.c
5a6651
@@ -216,6 +216,7 @@ tar_append_regfile(TAR *t, const char *realname)
5a6651
 	int filefd;
5a6651
 	int i, j;
5a6651
 	size_t size;
5a6651
+	int rv = -1;
5a6651
 
5a6651
 	filefd = open(realname, O_RDONLY);
5a6651
 	if (filefd == -1)
5a6651
@@ -234,25 +235,28 @@ tar_append_regfile(TAR *t, const char *realname)
5a6651
 		{
5a6651
 			if (j != -1)
5a6651
 				errno = EINVAL;
5a6651
-			return -1;
5a6651
+			goto fail;
5a6651
 		}
5a6651
 		if (tar_block_write(t, &block) == -1)
5a6651
-			return -1;
5a6651
+			goto fail;
5a6651
 	}
5a6651
 
5a6651
 	if (i > 0)
5a6651
 	{
5a6651
 		j = read(filefd, &block, i);
5a6651
 		if (j == -1)
5a6651
-			return -1;
5a6651
+			goto fail;
5a6651
 		memset(&(block[i]), 0, T_BLOCKSIZE - i);
5a6651
 		if (tar_block_write(t, &block) == -1)
5a6651
-			return -1;
5a6651
+			goto fail;
5a6651
 	}
5a6651
 
5a6651
+	/* success! */
5a6651
+	rv = 0;
5a6651
+fail:
5a6651
 	close(filefd);
5a6651
 
5a6651
-	return 0;
5a6651
+	return rv;
5a6651
 }
5a6651
 
5a6651
 
5a6651
diff --git a/lib/extract.c b/lib/extract.c
5a6651
index 36357e7..9fc6ad5 100644
5a6651
--- a/lib/extract.c
5a6651
+++ b/lib/extract.c
5a6651
@@ -228,13 +228,17 @@ tar_extract_regfile(TAR *t, char *realname)
5a6651
 		{
5a6651
 			if (k != -1)
5a6651
 				errno = EINVAL;
5a6651
+			close(fdout);
5a6651
 			return -1;
5a6651
 		}
5a6651
 
5a6651
 		/* write block to output file */
5a6651
 		if (write(fdout, buf,
5a6651
 			  ((i > T_BLOCKSIZE) ? T_BLOCKSIZE : i)) == -1)
5a6651
+		{
5a6651
+			close(fdout);
5a6651
 			return -1;
5a6651
+		}
5a6651
 	}
5a6651
 
5a6651
 	/* close output file */
5a6651
diff --git a/libtar/libtar.c b/libtar/libtar.c
5a6651
index 9fa92b2..bb5644c 100644
5a6651
--- a/libtar/libtar.c
5a6651
+++ b/libtar/libtar.c
5a6651
@@ -83,7 +83,10 @@ gzopen_frontend(char *pathname, int oflags, int mode)
5a6651
 		return -1;
5a6651
 
5a6651
 	if ((oflags & O_CREAT) && fchmod(fd, mode))
5a6651
+	{
5a6651
+		close(fd);
5a6651
 		return -1;
5a6651
+	}
5a6651
 
5a6651
 	gzf = gzdopen(fd, gzoflags);
5a6651
 	if (!gzf)
5a6651
-- 
5a6651
1.7.1
5a6651
5a6651
5a6651
From 36629a41208375f5105427e98078127551692028 Mon Sep 17 00:00:00 2001
5a6651
From: Huzaifa Sidhpurwala <huzaifas@fedoraproject.org>
5a6651
Date: Tue, 15 Oct 2013 20:02:58 -0400
5a6651
Subject: [PATCH 2/3] fix memleak on tar_open() failure
5a6651
5a6651
---
5a6651
 lib/handle.c |    1 +
5a6651
 1 files changed, 1 insertions(+), 0 deletions(-)
5a6651
5a6651
diff --git a/lib/handle.c b/lib/handle.c
5a6651
index 33a262c..002d23c 100644
5a6651
--- a/lib/handle.c
5a6651
+++ b/lib/handle.c
5a6651
@@ -82,6 +82,7 @@ tar_open(TAR **t, const char *pathname, tartype_t *type,
5a6651
 	(*t)->fd = (*((*t)->type->openfunc))(pathname, oflags, mode);
5a6651
 	if ((*t)->fd == -1)
5a6651
 	{
5a6651
+		libtar_hash_free((*t)->h, NULL);
5a6651
 		free(*t);
5a6651
 		return -1;
5a6651
 	}
5a6651
-- 
5a6651
1.7.1
5a6651
5a6651
5a6651
From f3c711cf3054ff366a1a3500cdc8c64ecc2d2da6 Mon Sep 17 00:00:00 2001
5a6651
From: Huzaifa Sidhpurwala <huzaifas@fedoraproject.org>
5a6651
Date: Tue, 15 Oct 2013 20:05:04 -0400
5a6651
Subject: [PATCH 3/3] fix memleaks in libtar sample program
5a6651
5a6651
---
5a6651
 libtar/libtar.c |   29 ++++++++++++++++++-----------
5a6651
 1 files changed, 18 insertions(+), 11 deletions(-)
5a6651
5a6651
diff --git a/libtar/libtar.c b/libtar/libtar.c
5a6651
index bb5644c..23f8741 100644
5a6651
--- a/libtar/libtar.c
5a6651
+++ b/libtar/libtar.c
5a6651
@@ -253,6 +253,7 @@ extract(char *tarfile, char *rootdir)
5a6651
 	if (tar_extract_all(t, rootdir) != 0)
5a6651
 	{
5a6651
 		fprintf(stderr, "tar_extract_all(): %s\n", strerror(errno));
5a6651
+		tar_close(t);
5a6651
 		return -1;
5a6651
 	}
5a6651
 
5a6651
@@ -270,12 +271,13 @@ extract(char *tarfile, char *rootdir)
5a6651
 
5a6651
 
5a6651
 void
5a6651
-usage()
5a6651
+usage(void *rootdir)
5a6651
 {
5a6651
 	printf("Usage: %s [-C rootdir] [-g] [-z] -x|-t filename.tar\n",
5a6651
 	       progname);
5a6651
 	printf("       %s [-C rootdir] [-g] [-z] -c filename.tar ...\n",
5a6651
 	       progname);
5a6651
+	free(rootdir);
5a6651
 	exit(-1);
5a6651
 }
5a6651
 
5a6651
@@ -292,6 +294,7 @@ main(int argc, char *argv[])
5a6651
 	int c;
5a6651
 	int mode = 0;
5a6651
 	libtar_list_t *l;
5a6651
+	int return_code = -2;
5a6651
 
5a6651
 	progname = basename(argv[0]);
5a6651
 
5a6651
@@ -313,17 +316,17 @@ main(int argc, char *argv[])
5a6651
 			break;
5a6651
 		case 'c':
5a6651
 			if (mode)
5a6651
-				usage();
5a6651
+				usage(rootdir);
5a6651
 			mode = MODE_CREATE;
5a6651
 			break;
5a6651
 		case 'x':
5a6651
 			if (mode)
5a6651
-				usage();
5a6651
+				usage(rootdir);
5a6651
 			mode = MODE_EXTRACT;
5a6651
 			break;
5a6651
 		case 't':
5a6651
 			if (mode)
5a6651
-				usage();
5a6651
+				usage(rootdir);
5a6651
 			mode = MODE_LIST;
5a6651
 			break;
5a6651
 #ifdef HAVE_LIBZ
5a6651
@@ -332,7 +335,7 @@ main(int argc, char *argv[])
5a6651
 			break;
5a6651
 #endif /* HAVE_LIBZ */
5a6651
 		default:
5a6651
-			usage();
5a6651
+			usage(rootdir);
5a6651
 		}
5a6651
 
5a6651
 	if (!mode || ((argc - optind) < (mode == MODE_CREATE ? 2 : 1)))
5a6651
@@ -341,7 +344,7 @@ main(int argc, char *argv[])
5a6651
 		printf("argc - optind == %d\tmode == %d\n", argc - optind,
5a6651
 		       mode);
5a6651
 #endif
5a6651
-		usage();
5a6651
+		usage(rootdir);
5a6651
 	}
5a6651
 
5a6651
 #ifdef DEBUG
5a6651
@@ -351,21 +354,25 @@ main(int argc, char *argv[])
5a6651
 	switch (mode)
5a6651
 	{
5a6651
 	case MODE_EXTRACT:
5a6651
-		return extract(argv[optind], rootdir);
5a6651
+		return_code = extract(argv[optind], rootdir);
5a6651
+		break;
5a6651
 	case MODE_CREATE:
5a6651
 		tarfile = argv[optind];
5a6651
 		l = libtar_list_new(LIST_QUEUE, NULL);
5a6651
 		for (c = optind + 1; c < argc; c++)
5a6651
 			libtar_list_add(l, argv[c]);
5a6651
-		return create(tarfile, rootdir, l);
5a6651
+		return_code = create(tarfile, rootdir, l);
5a6651
+		libtar_list_free(l, NULL);
5a6651
+		break;
5a6651
 	case MODE_LIST:
5a6651
-		return list(argv[optind]);
5a6651
+		return_code = list(argv[optind]);
5a6651
+		break;
5a6651
 	default:
5a6651
 		break;
5a6651
 	}
5a6651
 
5a6651
-	/* NOTREACHED */
5a6651
-	return -2;
5a6651
+	free(rootdir);
5a6651
+	return return_code;
5a6651
 }
5a6651
 
5a6651
 
5a6651
-- 
5a6651
1.7.1
5a6651