Blame SOURCES/libtar-1.2.11-fix-memleak.patch

1199b1
 lib/decode.c    |    2 +-
1199b1
 lib/extract.c   |   94 +++++++++++++++++++++++++++++++++++++++++++------------
1199b1
 lib/handle.c    |    1 +
1199b1
 lib/wrapper.c   |   12 ++++++-
1199b1
 libtar/libtar.c |   30 +++++++++++------
1199b1
 5 files changed, 106 insertions(+), 33 deletions(-)
1199b1
1199b1
diff --git a/lib/decode.c b/lib/decode.c
1199b1
index 794c868..c2c2baa 100644
1199b1
--- a/lib/decode.c
1199b1
+++ b/lib/decode.c
1199b1
@@ -29,7 +29,7 @@ th_get_pathname(TAR *t)
1199b1
 	char filename[MAXPATHLEN];
1199b1
 
1199b1
 	if (t->th_buf.gnu_longname)
1199b1
-		return t->th_buf.gnu_longname;
1199b1
+		return strdup(t->th_buf.gnu_longname);
1199b1
 
1199b1
 	if (t->th_buf.prefix[0] != '\0')
1199b1
 	{
1199b1
diff --git a/lib/extract.c b/lib/extract.c
1199b1
index cacfe58..8993b95 100644
1199b1
--- a/lib/extract.c
1199b1
+++ b/lib/extract.c
1199b1
@@ -44,9 +44,10 @@ tar_set_file_perms(TAR *t, char *realname)
1199b1
 	uid_t uid;
1199b1
 	gid_t gid;
1199b1
 	struct utimbuf ut;
1199b1
-	char *filename;
1199b1
+	char *filename,*pn;
1199b1
 
1199b1
-	filename = (realname ? realname : th_get_pathname(t));
1199b1
+	pn = th_get_pathname(t);
1199b1
+	filename = (realname ? realname : pn);
1199b1
 	mode = th_get_mode(t);
1199b1
 	uid = th_get_uid(t);
1199b1
 	gid = th_get_gid(t);
1199b1
@@ -69,6 +70,7 @@ tar_set_file_perms(TAR *t, char *realname)
1199b1
 				filename, uid, gid, strerror(errno));
1199b1
 # endif
1199b1
 #endif /* HAVE_LCHOWN */
1199b1
+			free (pn);
1199b1
 			return -1;
1199b1
 		}
1199b1
 
1199b1
@@ -78,6 +80,7 @@ tar_set_file_perms(TAR *t, char *realname)
1199b1
 #ifdef DEBUG
1199b1
 		perror("utime()");
1199b1
 #endif
1199b1
+		free (pn);
1199b1
 		return -1;
1199b1
 	}
1199b1
 
1199b1
@@ -87,9 +90,11 @@ tar_set_file_perms(TAR *t, char *realname)
1199b1
 #ifdef DEBUG
1199b1
 		perror("chmod()");
1199b1
 #endif
1199b1
+		free (pn);
1199b1
 		return -1;
1199b1
 	}
1199b1
 
1199b1
+	free (pn);
1199b1
 	return 0;
1199b1
 }
1199b1
 
1199b1
@@ -168,7 +173,7 @@ tar_extract_regfile(TAR *t, char *realname)
1199b1
 	int fdout;
1199b1
 	int i, k;
1199b1
 	char buf[T_BLOCKSIZE];
1199b1
-	char *filename;
1199b1
+	char *filename,*pn;
1199b1
 
1199b1
 #ifdef DEBUG
1199b1
 	printf("==> tar_extract_regfile(t=0x%lx, realname=\"%s\")\n", t,
1199b1
@@ -181,14 +186,18 @@ tar_extract_regfile(TAR *t, char *realname)
1199b1
 		return -1;
1199b1
 	}
1199b1
 
1199b1
-	filename = (realname ? realname : th_get_pathname(t));
1199b1
+	pn = th_get_pathname(t);
1199b1
+	filename = (realname ? realname : pn);
1199b1
 	mode = th_get_mode(t);
1199b1
 	size = th_get_size(t);
1199b1
 	uid = th_get_uid(t);
1199b1
 	gid = th_get_gid(t);
1199b1
 
1199b1
 	if (mkdirhier(dirname(filename)) == -1)
1199b1
+	{
1199b1
+		free (pn);
1199b1
 		return -1;
1199b1
+	}
1199b1
 
1199b1
 #ifdef DEBUG
1199b1
 	printf("  ==> extracting: %s (mode %04o, uid %d, gid %d, %d bytes)\n",
1199b1
@@ -204,6 +213,7 @@ tar_extract_regfile(TAR *t, char *realname)
1199b1
 #ifdef DEBUG
1199b1
 		perror("open()");
1199b1
 #endif
1199b1
+		free (pn);
1199b1
 		return -1;
1199b1
 	}
1199b1
 
1199b1
@@ -235,23 +245,30 @@ tar_extract_regfile(TAR *t, char *realname)
1199b1
 		{
1199b1
 			if (k != -1)
1199b1
 				errno = EINVAL;
1199b1
+			free (pn);
1199b1
 			return -1;
1199b1
 		}
1199b1
 
1199b1
 		/* write block to output file */
1199b1
 		if (write(fdout, buf,
1199b1
 			  ((i > T_BLOCKSIZE) ? T_BLOCKSIZE : i)) == -1)
1199b1
+		{
1199b1
+			free (pn);
1199b1
 			return -1;
1199b1
+		}
1199b1
 	}
1199b1
 
1199b1
 	/* close output file */
1199b1
 	if (close(fdout) == -1)
1199b1
+	{
1199b1
+		free (pn);
1199b1
 		return -1;
1199b1
+	}
1199b1
 
1199b1
 #ifdef DEBUG
1199b1
 	printf("### done extracting %s\n", filename);
1199b1
 #endif
1199b1
-
1199b1
+	free (pn);
1199b1
 	return 0;
1199b1
 }
1199b1
 
1199b1
@@ -290,7 +307,7 @@ tar_skip_regfile(TAR *t)
1199b1
 int
1199b1
 tar_extract_hardlink(TAR * t, char *realname)
1199b1
 {
1199b1
-	char *filename;
1199b1
+	char *filename,*pn;
1199b1
 	char *linktgt = NULL;
1199b1
 	linkname_t *lnp;
1199b1
 	libtar_hashptr_t hp;
1199b1
@@ -301,9 +318,13 @@ tar_extract_hardlink(TAR * t, char *realname)
1199b1
 		return -1;
1199b1
 	}
1199b1
 
1199b1
-	filename = (realname ? realname : th_get_pathname(t));
1199b1
+	pn = th_get_pathname(t);
1199b1
+	filename = (realname ? realname : pn);
1199b1
 	if (mkdirhier(dirname(filename)) == -1)
1199b1
+	{
1199b1
+		free (pn);
1199b1
 		return -1;
1199b1
+	}
1199b1
 	libtar_hashptr_reset(&hp;;
1199b1
 	if (libtar_hash_getkey(t->h, &hp, th_get_linkname(t),
1199b1
 			       (libtar_matchfunc_t)libtar_str_match) != 0)
1199b1
@@ -322,9 +343,11 @@ tar_extract_hardlink(TAR * t, char *realname)
1199b1
 #ifdef DEBUG
1199b1
 		perror("link()");
1199b1
 #endif
1199b1
+		free (pn);
1199b1
 		return -1;
1199b1
 	}
1199b1
 
1199b1
+	free (pn);
1199b1
 	return 0;
1199b1
 }
1199b1
 
1199b1
@@ -333,7 +356,7 @@ tar_extract_hardlink(TAR * t, char *realname)
1199b1
 int
1199b1
 tar_extract_symlink(TAR *t, char *realname)
1199b1
 {
1199b1
-	char *filename;
1199b1
+	char *filename,*pn;
1199b1
 
1199b1
 	if (!TH_ISSYM(t))
1199b1
 	{
1199b1
@@ -341,9 +364,13 @@ tar_extract_symlink(TAR *t, char *realname)
1199b1
 		return -1;
1199b1
 	}
1199b1
 
1199b1
-	filename = (realname ? realname : th_get_pathname(t));
1199b1
+	pn = th_get_pathname(t);
1199b1
+	filename = (realname ? realname : pn);
1199b1
 	if (mkdirhier(dirname(filename)) == -1)
1199b1
+	{
1199b1
+		free (pn);
1199b1
 		return -1;
1199b1
+	}
1199b1
 
1199b1
 	if (unlink(filename) == -1 && errno != ENOENT)
1199b1
 		return -1;
1199b1
@@ -357,9 +384,11 @@ tar_extract_symlink(TAR *t, char *realname)
1199b1
 #ifdef DEBUG
1199b1
 		perror("symlink()");
1199b1
 #endif
1199b1
+		free (pn);
1199b1
 		return -1;
1199b1
 	}
1199b1
 
1199b1
+	free (pn);
1199b1
 	return 0;
1199b1
 }
1199b1
 
1199b1
@@ -370,7 +399,7 @@ tar_extract_chardev(TAR *t, char *realname)
1199b1
 {
1199b1
 	mode_t mode;
1199b1
 	unsigned long devmaj, devmin;
1199b1
-	char *filename;
1199b1
+	char *filename,*pn;
1199b1
 
1199b1
 	if (!TH_ISCHR(t))
1199b1
 	{
1199b1
@@ -378,14 +407,18 @@ tar_extract_chardev(TAR *t, char *realname)
1199b1
 		return -1;
1199b1
 	}
1199b1
 
1199b1
-	filename = (realname ? realname : th_get_pathname(t));
1199b1
+	pn = th_get_pathname(t);
1199b1
+	filename = (realname ? realname : pn);
1199b1
 	mode = th_get_mode(t);
1199b1
 	devmaj = th_get_devmajor(t);
1199b1
 	devmin = th_get_devminor(t);
1199b1
 
1199b1
 	if (mkdirhier(dirname(filename)) == -1)
1199b1
+	{
1199b1
+		free (pn);
1199b1
 		return -1;
1199b1
-
1199b1
+	}
1199b1
+	
1199b1
 #ifdef DEBUG
1199b1
 	printf("  ==> extracting: %s (character device %ld,%ld)\n",
1199b1
 	       filename, devmaj, devmin);
1199b1
@@ -396,9 +429,11 @@ tar_extract_chardev(TAR *t, char *realname)
1199b1
 #ifdef DEBUG
1199b1
 		perror("mknod()");
1199b1
 #endif
1199b1
+		free (pn);
1199b1
 		return -1;
1199b1
 	}
1199b1
 
1199b1
+	free (pn);
1199b1
 	return 0;
1199b1
 }
1199b1
 
1199b1
@@ -409,7 +444,7 @@ tar_extract_blockdev(TAR *t, char *realname)
1199b1
 {
1199b1
 	mode_t mode;
1199b1
 	unsigned long devmaj, devmin;
1199b1
-	char *filename;
1199b1
+	char *filename,*pn;
1199b1
 
1199b1
 	if (!TH_ISBLK(t))
1199b1
 	{
1199b1
@@ -417,13 +452,17 @@ tar_extract_blockdev(TAR *t, char *realname)
1199b1
 		return -1;
1199b1
 	}
1199b1
 
1199b1
-	filename = (realname ? realname : th_get_pathname(t));
1199b1
+	pn = th_get_pathname(t);
1199b1
+	filename = (realname ? realname : pn);
1199b1
 	mode = th_get_mode(t);
1199b1
 	devmaj = th_get_devmajor(t);
1199b1
 	devmin = th_get_devminor(t);
1199b1
 
1199b1
 	if (mkdirhier(dirname(filename)) == -1)
1199b1
+	{
1199b1
+		free (pn);
1199b1
 		return -1;
1199b1
+	}
1199b1
 
1199b1
 #ifdef DEBUG
1199b1
 	printf("  ==> extracting: %s (block device %ld,%ld)\n",
1199b1
@@ -435,9 +474,11 @@ tar_extract_blockdev(TAR *t, char *realname)
1199b1
 #ifdef DEBUG
1199b1
 		perror("mknod()");
1199b1
 #endif
1199b1
+		free (pn);
1199b1
 		return -1;
1199b1
 	}
1199b1
 
1199b1
+	free (pn);
1199b1
 	return 0;
1199b1
 }
1199b1
 
1199b1
@@ -447,19 +488,22 @@ int
1199b1
 tar_extract_dir(TAR *t, char *realname)
1199b1
 {
1199b1
 	mode_t mode;
1199b1
-	char *filename;
1199b1
+	char *filename,*pn;
1199b1
 
1199b1
 	if (!TH_ISDIR(t))
1199b1
 	{
1199b1
 		errno = EINVAL;
1199b1
 		return -1;
1199b1
 	}
1199b1
-
1199b1
-	filename = (realname ? realname : th_get_pathname(t));
1199b1
+	pn = th_get_pathname(t);
1199b1
+	filename = (realname ? realname : pn);
1199b1
 	mode = th_get_mode(t);
1199b1
 
1199b1
 	if (mkdirhier(dirname(filename)) == -1)
1199b1
+	{
1199b1
+		free (pn);
1199b1
 		return -1;
1199b1
+	}
1199b1
 
1199b1
 #ifdef DEBUG
1199b1
 	printf("  ==> extracting: %s (mode %04o, directory)\n", filename,
1199b1
@@ -474,6 +518,7 @@ tar_extract_dir(TAR *t, char *realname)
1199b1
 #ifdef DEBUG
1199b1
 				perror("chmod()");
1199b1
 #endif
1199b1
+				free (pn);
1199b1
 				return -1;
1199b1
 			}
1199b1
 			else
1199b1
@@ -481,6 +526,7 @@ tar_extract_dir(TAR *t, char *realname)
1199b1
 #ifdef DEBUG
1199b1
 				puts("  *** using existing directory");
1199b1
 #endif
1199b1
+				free (pn);
1199b1
 				return 1;
1199b1
 			}
1199b1
 		}
1199b1
@@ -489,10 +535,12 @@ tar_extract_dir(TAR *t, char *realname)
1199b1
 #ifdef DEBUG
1199b1
 			perror("mkdir()");
1199b1
 #endif
1199b1
+			free (pn);
1199b1
 			return -1;
1199b1
 		}
1199b1
 	}
1199b1
-
1199b1
+	
1199b1
+	free (pn);
1199b1
 	return 0;
1199b1
 }
1199b1
 
1199b1
@@ -502,7 +550,7 @@ int
1199b1
 tar_extract_fifo(TAR *t, char *realname)
1199b1
 {
1199b1
 	mode_t mode;
1199b1
-	char *filename;
1199b1
+	char *filename,*pn;
1199b1
 
1199b1
 	if (!TH_ISFIFO(t))
1199b1
 	{
1199b1
@@ -510,11 +558,15 @@ tar_extract_fifo(TAR *t, char *realname)
1199b1
 		return -1;
1199b1
 	}
1199b1
 
1199b1
-	filename = (realname ? realname : th_get_pathname(t));
1199b1
+	pn = th_get_pathname(t);
1199b1
+	filename = (realname ? realname : pn);
1199b1
 	mode = th_get_mode(t);
1199b1
 
1199b1
 	if (mkdirhier(dirname(filename)) == -1)
1199b1
+	{
1199b1
+		free (pn);
1199b1
 		return -1;
1199b1
+	}
1199b1
 
1199b1
 #ifdef DEBUG
1199b1
 	printf("  ==> extracting: %s (fifo)\n", filename);
1199b1
@@ -524,9 +576,11 @@ tar_extract_fifo(TAR *t, char *realname)
1199b1
 #ifdef DEBUG
1199b1
 		perror("mkfifo()");
1199b1
 #endif
1199b1
+		free (pn);
1199b1
 		return -1;
1199b1
 	}
1199b1
 
1199b1
+	free (pn);
1199b1
 	return 0;
1199b1
 }
1199b1
 
1199b1
diff --git a/lib/handle.c b/lib/handle.c
1199b1
index ae974b9..e3a48cb 100644
1199b1
--- a/lib/handle.c
1199b1
+++ b/lib/handle.c
1199b1
@@ -82,6 +82,7 @@ tar_open(TAR **t, char *pathname, tartype_t *type,
1199b1
 	(*t)->fd = (*((*t)->type->openfunc))(pathname, oflags, mode);
1199b1
 	if ((*t)->fd == -1)
1199b1
 	{
1199b1
+		libtar_hash_free((*t)->h, NULL);
1199b1
 		free(*t);
1199b1
 		return -1;
1199b1
 	}
1199b1
diff --git a/lib/wrapper.c b/lib/wrapper.c
1199b1
index 51d5086..e60a530 100644
1199b1
--- a/lib/wrapper.c
1199b1
+++ b/lib/wrapper.c
1199b1
@@ -36,7 +36,10 @@ tar_extract_glob(TAR *t, char *globname, char *prefix)
1199b1
 		if (fnmatch(globname, filename, FNM_PATHNAME | FNM_PERIOD))
1199b1
 		{
1199b1
 			if (TH_ISREG(t) && tar_skip_regfile(t))
1199b1
+			{
1199b1
+				free (filename);
1199b1
 				return -1;
1199b1
+			}
1199b1
 			continue;
1199b1
 		}
1199b1
 		if (t->options & TAR_VERBOSE)
1199b1
@@ -46,7 +49,11 @@ tar_extract_glob(TAR *t, char *globname, char *prefix)
1199b1
 		else
1199b1
 			strlcpy(buf, filename, sizeof(buf));
1199b1
 		if (tar_extract_file(t, filename) != 0)
1199b1
+		{
1199b1
+			free (filename);
1199b1
 			return -1;
1199b1
+		}
1199b1
+		free (filename);
1199b1
 	}
1199b1
 
1199b1
 	return (i == 1 ? 0 : -1);
1199b1
@@ -77,13 +84,16 @@ tar_extract_all(TAR *t, char *prefix)
1199b1
 			snprintf(buf, sizeof(buf), "%s/%s", prefix, filename);
1199b1
 		else
1199b1
 			strlcpy(buf, filename, sizeof(buf));
1199b1
-		free(filename);
1199b1
 #ifdef DEBUG
1199b1
 		printf("    tar_extract_all(): calling tar_extract_file(t, "
1199b1
 		       "\"%s\")\n", buf);
1199b1
 #endif
1199b1
 		if (tar_extract_file(t, buf) != 0)
1199b1
+		{
1199b1
+			free (filename);
1199b1
 			return -1;
1199b1
+		}
1199b1
+		free (filename);
1199b1
 	}
1199b1
 
1199b1
 	return (i == 1 ? 0 : -1);
1199b1
diff --git a/libtar/libtar.c b/libtar/libtar.c
1199b1
index a6cef72..f06c5b8 100644
1199b1
--- a/libtar/libtar.c
1199b1
+++ b/libtar/libtar.c
1199b1
@@ -249,7 +249,9 @@ extract(char *tarfile, char *rootdir)
1199b1
 #endif
1199b1
 	if (tar_extract_all(t, rootdir) != 0)
1199b1
 	{
1199b1
+		
1199b1
 		fprintf(stderr, "tar_extract_all(): %s\n", strerror(errno));
1199b1
+		tar_close(t);
1199b1
 		return -1;
1199b1
 	}
1199b1
 
1199b1
@@ -267,12 +269,13 @@ extract(char *tarfile, char *rootdir)
1199b1
 
1199b1
 
1199b1
 void
1199b1
-usage()
1199b1
+usage(void *rootdir)
1199b1
 {
1199b1
 	printf("Usage: %s [-C rootdir] [-g] [-z] -x|-t filename.tar\n",
1199b1
 	       progname);
1199b1
 	printf("       %s [-C rootdir] [-g] [-z] -c filename.tar ...\n",
1199b1
 	       progname);
1199b1
+	free(rootdir);
1199b1
 	exit(-1);
1199b1
 }
1199b1
 
1199b1
@@ -289,6 +292,7 @@ main(int argc, char *argv[])
1199b1
 	int c;
1199b1
 	int mode = 0;
1199b1
 	libtar_list_t *l;
1199b1
+	int return_code = -2;
1199b1
 
1199b1
 	progname = basename(argv[0]);
1199b1
 
1199b1
@@ -310,17 +314,17 @@ main(int argc, char *argv[])
1199b1
 			break;
1199b1
 		case 'c':
1199b1
 			if (mode)
1199b1
-				usage();
1199b1
+				usage(rootdir);
1199b1
 			mode = MODE_CREATE;
1199b1
 			break;
1199b1
 		case 'x':
1199b1
 			if (mode)
1199b1
-				usage();
1199b1
+				usage(rootdir);
1199b1
 			mode = MODE_EXTRACT;
1199b1
 			break;
1199b1
 		case 't':
1199b1
 			if (mode)
1199b1
-				usage();
1199b1
+				usage(rootdir);
1199b1
 			mode = MODE_LIST;
1199b1
 			break;
1199b1
 #ifdef HAVE_LIBZ
1199b1
@@ -329,7 +333,7 @@ main(int argc, char *argv[])
1199b1
 			break;
1199b1
 #endif /* HAVE_LIBZ */
1199b1
 		default:
1199b1
-			usage();
1199b1
+			usage(rootdir);
1199b1
 		}
1199b1
 
1199b1
 	if (!mode || ((argc - optind) < (mode == MODE_CREATE ? 2 : 1)))
1199b1
@@ -338,7 +342,7 @@ main(int argc, char *argv[])
1199b1
 		printf("argc - optind == %d\tmode == %d\n", argc - optind,
1199b1
 		       mode);
1199b1
 #endif
1199b1
-		usage();
1199b1
+		usage(rootdir);
1199b1
 	}
1199b1
 
1199b1
 #ifdef DEBUG
1199b1
@@ -348,21 +352,25 @@ main(int argc, char *argv[])
1199b1
 	switch (mode)
1199b1
 	{
1199b1
 	case MODE_EXTRACT:
1199b1
-		return extract(argv[optind], rootdir);
1199b1
+		return_code = extract(argv[optind], rootdir);
1199b1
+		break;
1199b1
 	case MODE_CREATE:
1199b1
 		tarfile = argv[optind];
1199b1
 		l = libtar_list_new(LIST_QUEUE, NULL);
1199b1
 		for (c = optind + 1; c < argc; c++)
1199b1
 			libtar_list_add(l, argv[c]);
1199b1
-		return create(tarfile, rootdir, l);
1199b1
+		return_code =  create(tarfile, rootdir, l);
1199b1
+		libtar_list_free (l, NULL);
1199b1
+		break;
1199b1
 	case MODE_LIST:
1199b1
-		return list(argv[optind]);
1199b1
+		return_code = list(argv[optind]);
1199b1
+		break;
1199b1
 	default:
1199b1
 		break;
1199b1
 	}
1199b1
 
1199b1
-	/* NOTREACHED */
1199b1
-	return -2;
1199b1
+	free(rootdir);
1199b1
+	return return_code;
1199b1
 }
1199b1
 
1199b1