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