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