diff --git a/lib/handle.c b/lib/handle.c index 28a7dc2..ae829a9 100644 --- a/lib/handle.c +++ b/lib/handle.c @@ -124,6 +124,7 @@ tar_close(TAR *t) : (libtar_freefunc_t)tar_dev_free)); if (t->th_pathname != NULL) free(t->th_pathname); + free_longlink_longname(t->th_buf); free(t); return i; diff --git a/lib/util.c b/lib/util.c index 8a42e62..108ce23 100644 --- a/lib/util.c +++ b/lib/util.c @@ -164,7 +164,13 @@ int_to_oct_nonull(int num, char *oct, size_t octlen) void free_longlink_longname(struct tar_header th_buf) { if (th_buf.gnu_longname != NULL) + { free(th_buf.gnu_longname); + th_buf.gnu_longname = NULL; + } if (th_buf.gnu_longlink !=NULL) + { free(th_buf.gnu_longlink); + th_buf.gnu_longlink = NULL; + } } diff --git a/libtar/libtar.c b/libtar/libtar.c index 7e7354f..8c89211 100644 --- a/libtar/libtar.c +++ b/libtar/libtar.c @@ -196,7 +196,7 @@ list(char *tarfile) { fprintf(stderr, "tar_skip_regfile(): %s\n", strerror(errno)); - free_longlink_longname(t->th_buf); + tar_close(t); return -1; } } @@ -218,12 +218,10 @@ list(char *tarfile) if (tar_close(t) != 0) { - free_longlink_longname(t->th_buf); fprintf(stderr, "tar_close(): %s\n", strerror(errno)); return -1; } - free_longlink_longname(t->th_buf); return 0; }