diff options
author | Pavel Raiskup <praiskup@redhat.com> | 2018-07-31 12:06:09 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-07-31 12:06:09 +0300 |
commit | 577dc345653947a31b2841167dc1a9be0e44e043 (patch) | |
tree | 3c0fa084fb38a7f34c501933fc10f573a8e6fe81 | |
parent | c7b3f0217fb9a02b43469404b36b357e38dff850 (diff) | |
download | tar-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.c | 1 | ||||
-rw-r--r-- | src/transform.c | 3 | ||||
-rw-r--r-- | src/utf8.c | 9 |
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; } @@ -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; } |