rpms/libtar/devel libtar-1.2.11-fix-memleak.patch, NONE, 1.1 libtar.spec, 1.19, 1.20

Huzaifa Sidhpurwala huzaifas at fedoraproject.org
Mon May 3 08:43:57 UTC 2010


Author: huzaifas

Update of /cvs/pkgs/rpms/libtar/devel
In directory cvs01.phx2.fedoraproject.org:/tmp/cvs-serv12000

Modified Files:
	libtar.spec 
Added Files:
	libtar-1.2.11-fix-memleak.patch 
Log Message:
fix lot of memleaks

libtar-1.2.11-fix-memleak.patch:
 lib/decode.c    |    2 -
 lib/extract.c   |   94 ++++++++++++++++++++++++++++++++++++++++++++------------
 lib/wrapper.c   |   13 ++++++-
 libtar/libtar.c |   10 ++---
 4 files changed, 90 insertions(+), 29 deletions(-)

--- NEW FILE libtar-1.2.11-fix-memleak.patch ---
diff -Naur libtar-1.2.11/lib/decode.c libtar-1.2.11.fixmem/lib/decode.c
--- libtar-1.2.11/lib/decode.c	2003-01-07 07:10:59.000000000 +0530
+++ libtar-1.2.11.fixmem/lib/decode.c	2010-04-30 16:05:31.000000000 +0530
@@ -29,7 +29,7 @@
 	char filename[MAXPATHLEN];
 
 	if (t->th_buf.gnu_longname)
-		return t->th_buf.gnu_longname;
+		return strdup(t->th_buf.gnu_longname);
 
 	if (t->th_buf.prefix[0] != '\0')
 	{
diff -Naur libtar-1.2.11/lib/extract.c libtar-1.2.11.fixmem/lib/extract.c
--- libtar-1.2.11/lib/extract.c	2010-04-30 16:04:27.000000000 +0530
+++ libtar-1.2.11.fixmem/lib/extract.c	2010-04-30 16:29:10.000000000 +0530
@@ -44,9 +44,10 @@
 	uid_t uid;
 	gid_t gid;
 	struct utimbuf ut;
-	char *filename;
+	char *filename,*pn;
 
-	filename = (realname ? realname : th_get_pathname(t));
+	pn = th_get_pathname(t);
+	filename = (realname ? realname : pn);
 	mode = th_get_mode(t);
 	uid = th_get_uid(t);
 	gid = th_get_gid(t);
@@ -69,6 +70,7 @@
 				filename, uid, gid, strerror(errno));
 # endif
 #endif /* HAVE_LCHOWN */
+			free (pn);
 			return -1;
 		}
 
@@ -78,6 +80,7 @@
 #ifdef DEBUG
 		perror("utime()");
 #endif
+		free (pn);
 		return -1;
 	}
 
@@ -87,9 +90,11 @@
 #ifdef DEBUG
 		perror("chmod()");
 #endif
+		free (pn);
 		return -1;
 	}
 
+	free (pn);
 	return 0;
 }
 
@@ -168,7 +173,7 @@
 	int fdout;
 	int i, k;
 	char buf[T_BLOCKSIZE];
-	char *filename;
+	char *filename,*pn;
 
 #ifdef DEBUG
 	printf("==> tar_extract_regfile(t=0x%lx, realname=\"%s\")\n", t,
@@ -181,14 +186,18 @@
 		return -1;
 	}
 
-	filename = (realname ? realname : th_get_pathname(t));
+	pn = th_get_pathname(t);
+	filename = (realname ? realname : pn);
 	mode = th_get_mode(t);
 	size = th_get_size(t);
 	uid = th_get_uid(t);
 	gid = th_get_gid(t);
 
 	if (mkdirhier(dirname(filename)) == -1)
+	{
+		free (pn);
 		return -1;
+	}
 
 #ifdef DEBUG
 	printf("  ==> extracting: %s (mode %04o, uid %d, gid %d, %d bytes)\n",
@@ -204,6 +213,7 @@
 #ifdef DEBUG
 		perror("open()");
 #endif
+		free (pn);
 		return -1;
 	}
 
@@ -235,23 +245,30 @@
 		{
 			if (k != -1)
 				errno = EINVAL;
+			free (pn);
 			return -1;
 		}
 
 		/* write block to output file */
 		if (write(fdout, buf,
 			  ((i > T_BLOCKSIZE) ? T_BLOCKSIZE : i)) == -1)
+		{
+			free (pn);
 			return -1;
+		}
 	}
 
 	/* close output file */
 	if (close(fdout) == -1)
+	{
+		free (pn);
 		return -1;
+	}
 
 #ifdef DEBUG
 	printf("### done extracting %s\n", filename);
 #endif
-
+	free (pn);
 	return 0;
 }
 
@@ -290,7 +307,7 @@
 int
 tar_extract_hardlink(TAR * t, char *realname)
 {
-	char *filename;
+	char *filename,*pn;
 	char *linktgt = NULL;
 	linkname_t *lnp;
 	libtar_hashptr_t hp;
@@ -301,9 +318,13 @@
 		return -1;
 	}
 
-	filename = (realname ? realname : th_get_pathname(t));
+	pn = th_get_pathname(t);
+	filename = (realname ? realname : pn);
 	if (mkdirhier(dirname(filename)) == -1)
+	{
+		free (pn);
 		return -1;
+	}
 	libtar_hashptr_reset(&hp);
 	if (libtar_hash_getkey(t->h, &hp, th_get_linkname(t),
 			       (libtar_matchfunc_t)libtar_str_match) != 0)
@@ -322,9 +343,11 @@
 #ifdef DEBUG
 		perror("link()");
 #endif
+		free (pn);
 		return -1;
 	}
 
+	free (pn);
 	return 0;
 }
 
@@ -333,7 +356,7 @@
 int
 tar_extract_symlink(TAR *t, char *realname)
 {
-	char *filename;
+	char *filename,*pn;
 
 	if (!TH_ISSYM(t))
 	{
@@ -341,9 +364,13 @@
 		return -1;
 	}
 
-	filename = (realname ? realname : th_get_pathname(t));
+	pn = th_get_pathname(t);
+	filename = (realname ? realname : pn);
 	if (mkdirhier(dirname(filename)) == -1)
+	{
+		free (pn);
 		return -1;
+	}
 
 	if (unlink(filename) == -1 && errno != ENOENT)
 		return -1;
@@ -357,9 +384,11 @@
 #ifdef DEBUG
 		perror("symlink()");
 #endif
+		free (pn);
 		return -1;
 	}
 
+	free (pn);
 	return 0;
 }
 
@@ -370,7 +399,7 @@
 {
 	mode_t mode;
 	unsigned long devmaj, devmin;
-	char *filename;
+	char *filename,*pn;
 
 	if (!TH_ISCHR(t))
 	{
@@ -378,14 +407,18 @@
 		return -1;
 	}
 
-	filename = (realname ? realname : th_get_pathname(t));
+	pn = th_get_pathname(t);
+	filename = (realname ? realname : pn);
 	mode = th_get_mode(t);
 	devmaj = th_get_devmajor(t);
 	devmin = th_get_devminor(t);
 
 	if (mkdirhier(dirname(filename)) == -1)
+	{
+		free (pn);
 		return -1;
-
+	}
+	
 #ifdef DEBUG
 	printf("  ==> extracting: %s (character device %ld,%ld)\n",
 	       filename, devmaj, devmin);
@@ -396,9 +429,11 @@
 #ifdef DEBUG
 		perror("mknod()");
 #endif
+		free (pn);
 		return -1;
 	}
 
+	free (pn);
 	return 0;
 }
 
@@ -409,7 +444,7 @@
 {
 	mode_t mode;
 	unsigned long devmaj, devmin;
-	char *filename;
+	char *filename,*pn;
 
 	if (!TH_ISBLK(t))
 	{
@@ -417,13 +452,17 @@
 		return -1;
 	}
 
-	filename = (realname ? realname : th_get_pathname(t));
+	pn = th_get_pathname(t);
+	filename = (realname ? realname : pn);
 	mode = th_get_mode(t);
 	devmaj = th_get_devmajor(t);
 	devmin = th_get_devminor(t);
 
 	if (mkdirhier(dirname(filename)) == -1)
+	{
+		free (pn);
 		return -1;
+	}
 
 #ifdef DEBUG
 	printf("  ==> extracting: %s (block device %ld,%ld)\n",
@@ -435,9 +474,11 @@
 #ifdef DEBUG
 		perror("mknod()");
 #endif
+		free (pn);
 		return -1;
 	}
 
+	free (pn);
 	return 0;
 }
 
@@ -447,19 +488,22 @@
 tar_extract_dir(TAR *t, char *realname)
 {
 	mode_t mode;
-	char *filename;
+	char *filename,*pn;
 
 	if (!TH_ISDIR(t))
 	{
 		errno = EINVAL;
 		return -1;
 	}
-
-	filename = (realname ? realname : th_get_pathname(t));
+	pn = th_get_pathname(t);
+	filename = (realname ? realname : pn);
 	mode = th_get_mode(t);
 
 	if (mkdirhier(dirname(filename)) == -1)
+	{
+		free (pn);
 		return -1;
+	}
 
 #ifdef DEBUG
 	printf("  ==> extracting: %s (mode %04o, directory)\n", filename,
@@ -474,6 +518,7 @@
 #ifdef DEBUG
 				perror("chmod()");
 #endif
+				free (pn);
 				return -1;
 			}
 			else
@@ -481,6 +526,7 @@
 #ifdef DEBUG
 				puts("  *** using existing directory");
 #endif
+				free (pn);
 				return 1;
 			}
 		}
@@ -489,10 +535,12 @@
 #ifdef DEBUG
 			perror("mkdir()");
 #endif
+			free (pn);
 			return -1;
 		}
 	}
-
+	
+	free (pn);
 	return 0;
 }
 
@@ -502,7 +550,7 @@
 tar_extract_fifo(TAR *t, char *realname)
 {
 	mode_t mode;
-	char *filename;
+	char *filename,*pn;
 
 	if (!TH_ISFIFO(t))
 	{
@@ -510,11 +558,15 @@
 		return -1;
 	}
 
-	filename = (realname ? realname : th_get_pathname(t));
+	pn = th_get_pathname(t);
+	filename = (realname ? realname : pn);
 	mode = th_get_mode(t);
 
 	if (mkdirhier(dirname(filename)) == -1)
+	{
+		free (pn);
 		return -1;
+	}
 
 #ifdef DEBUG
 	printf("  ==> extracting: %s (fifo)\n", filename);
@@ -524,9 +576,11 @@
 #ifdef DEBUG
 		perror("mkfifo()");
 #endif
+		free (pn);
 		return -1;
 	}
 
+	free (pn);
 	return 0;
 }
 
diff -Naur libtar-1.2.11/lib/wrapper.c libtar-1.2.11.fixmem/lib/wrapper.c
--- libtar-1.2.11/lib/wrapper.c	2010-04-30 16:04:27.000000000 +0530
+++ libtar-1.2.11.fixmem/lib/wrapper.c	2010-05-03 13:52:57.000000000 +0530
@@ -13,7 +13,6 @@
 #include <internal.h>
 
 #include <stdio.h>
-#include <stdlib.h>
 #include <sys/param.h>
 #include <dirent.h>
 #include <errno.h>
@@ -36,7 +35,10 @@
 		if (fnmatch(globname, filename, FNM_PATHNAME | FNM_PERIOD))
 		{
 			if (TH_ISREG(t) && tar_skip_regfile(t))
+			{
+				free (filename);
 				return -1;
+			}
 			continue;
 		}
 		if (t->options & TAR_VERBOSE)
@@ -46,7 +48,11 @@
 		else
 			strlcpy(buf, filename, sizeof(buf));
 		if (tar_extract_file(t, filename) != 0)
+		{
+			free (filename);
 			return -1;
+		}
+		free (filename);
 	}
 
 	return (i == 1 ? 0 : -1);
@@ -77,13 +83,16 @@
 			snprintf(buf, sizeof(buf), "%s/%s", prefix, filename);
 		else
 			strlcpy(buf, filename, sizeof(buf));
-		free(filename);
 #ifdef DEBUG
 		printf("    tar_extract_all(): calling tar_extract_file(t, "
 		       "\"%s\")\n", buf);
 #endif
 		if (tar_extract_file(t, buf) != 0)
+		{
+			free (filename);
 			return -1;
+		}
+		free (filename);
 	}
 
 	return (i == 1 ? 0 : -1);
diff -Naur libtar-1.2.11/libtar/libtar.c libtar-1.2.11.fixmem/libtar/libtar.c
--- libtar-1.2.11/libtar/libtar.c	2010-04-30 16:04:27.000000000 +0530
+++ libtar-1.2.11.fixmem/libtar/libtar.c	2010-05-03 13:50:05.000000000 +0530
@@ -19,7 +19,6 @@
 #include <sys/param.h>
 
 #ifdef STDC_HEADERS
-# include <stdlib.h>
 # include <string.h>
 #endif
 
@@ -92,10 +91,6 @@
 		return -1;
 	}
 
-	/* This is a bad thing to do on big-endian lp64 systems, where the
-	   size and placement of integers is different than pointers.
-	   However, to fix the problem 4 wrapper functions would be needed and
-	   an extra bit of data associating GZF with the wrapper functions.  */
 	return (int)gzf;
 }
 
@@ -289,6 +284,7 @@
 	int c;
 	int mode = 0;
 	libtar_list_t *l;
+	int return_code = 0;
 
 	progname = basename(argv[0]);
 
@@ -354,7 +350,9 @@
 		l = libtar_list_new(LIST_QUEUE, NULL);
 		for (c = optind + 1; c < argc; c++)
 			libtar_list_add(l, argv[c]);
-		return create(tarfile, rootdir, l);
+		return_code =  create(tarfile, rootdir, l);
+		libtar_list_free (l, NULL);
+		return return_code;
 	case MODE_LIST:
 		return list(argv[optind]);
 	default:


Index: libtar.spec
===================================================================
RCS file: /cvs/pkgs/rpms/libtar/devel/libtar.spec,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -p -r1.19 -r1.20
--- libtar.spec	31 Dec 2009 03:50:36 -0000	1.19
+++ libtar.spec	3 May 2010 08:43:54 -0000	1.20
@@ -1,7 +1,7 @@
 Summary:        Tar file manipulation API
 Name:           libtar
 Version:        1.2.11
-Release:        16%{?dist}
+Release:        17%{?dist}
 License:        MIT
 Group:          System Environment/Libraries
 URL:            http://www.feep.net/libtar/
@@ -11,6 +11,7 @@ Patch1:         libtar-1.2.11-missing-pr
 Patch2:         libtar-macro.patch
 Patch3:		libtar-1.2.11-tar_header.patch
 Patch4:		libtar-1.2.11-mem-deref.patch
+Patch5:		libtar-1.2.11-fix-memleak.patch
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-buildroot
 BuildRequires:  zlib-devel libtool
 
@@ -37,6 +38,7 @@ developing applications that use %{name}
 %patch2 -p1
 %patch3 -p1 -b .tar_header
 %patch4 -p1 -b .deref
+%patch5 -p1 -b .fixmem
 
 # set correct version for .so build
 %define ltversion %(echo %{version} | tr '.' ':')
@@ -90,6 +92,9 @@ rm -rf $RPM_BUILD_ROOT
 
 
 %changelog
+* Mon May 3 2010 Huzaifa Sidhpurwala <huzaifas at redhat.com> - 1.2.11.17
+- Fix lot of memory leaks
+
 * Thu Dec 31 2009 Huzaifa Sidhpurwala <huzaifas at redhat.com> - 1.2.11-16
 - Fix invalid memory de-reference issue in BZ #380965
 



More information about the scm-commits mailing list