summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavel Raiskup <praiskup@redhat.com>2018-07-31 12:06:09 +0300
committerSergey Poznyakoff <gray@gnu.org>2018-07-31 12:06:09 +0300
commit577dc345653947a31b2841167dc1a9be0e44e043 (patch)
tree3c0fa084fb38a7f34c501933fc10f573a8e6fe81
parentc7b3f0217fb9a02b43469404b36b357e38dff850 (diff)
downloadtar-577dc345653947a31b2841167dc1a9be0e44e043.tar.gz
tar-577dc345653947a31b2841167dc1a9be0e44e043.tar.bz2
Avoid some resource leaks
* src/incremen.c (store_rename): Free temp_name, leaked before for each renamed directory with --listed-incremental. * src/transform.c (add_literal_segment): Tighten arguments by const. (parse_transform_expr): Free 'str', leaked storage for each --transform option before. * src/utf8.c (utf8_convert): Deallocate buffer for failed iconv() call so callers don't have to.
-rw-r--r--src/incremen.c1
-rw-r--r--src/transform.c3
-rw-r--r--src/utf8.c9
3 files changed, 9 insertions, 4 deletions
diff --git a/src/incremen.c b/src/incremen.c
index ca611f65..7c26eb80 100644
--- a/src/incremen.c
+++ b/src/incremen.c
@@ -915,6 +915,7 @@ store_rename (struct directory *dir, struct obstack *stk)
obstack_code_rename (stk, p->orig->name, p->name);
obstack_code_rename (stk, "", prev->name);
+ free (temp_name);
}
}
}
diff --git a/src/transform.c b/src/transform.c
index 3fae3c0d..6ef0da6d 100644
--- a/src/transform.c
+++ b/src/transform.c
@@ -101,7 +101,7 @@ add_segment (struct transform *tf)
}
static void
-add_literal_segment (struct transform *tf, char *str, char *end)
+add_literal_segment (struct transform *tf, const char *str, const char *end)
{
size_t len = end - str;
if (len)
@@ -403,6 +403,7 @@ parse_transform_expr (const char *expr)
cur++;
}
add_literal_segment (tf, beg, cur);
+ free(str);
return p;
}
diff --git a/src/utf8.c b/src/utf8.c
index a018ce0a..168d636c 100644
--- a/src/utf8.c
+++ b/src/utf8.c
@@ -68,7 +68,6 @@ utf8_convert (bool to_utf, char const *input, char **output)
char *ob;
size_t inlen;
size_t outlen;
- size_t rc;
iconv_t cd = utf8_init (to_utf);
if (cd == 0)
@@ -83,9 +82,13 @@ utf8_convert (bool to_utf, char const *input, char **output)
outlen = inlen * MB_LEN_MAX + 1;
ob = *output = xmalloc (outlen);
ib = (char ICONV_CONST *) input;
- rc = iconv (cd, &ib, &inlen, &ob, &outlen);
+ if (iconv (cd, &ib, &inlen, &ob, &outlen) == -1)
+ {
+ free (*output);
+ return false;
+ }
*ob = 0;
- return rc != -1;
+ return true;
}

Return to:

Send suggestions and report system problems to the System administrator.