* src/chmod.c: Deallocate the mode change array in dev mode. * src/chown.c: Make chopt_free() actually deallocate, but only call in dev mode. * src/chgrp.c: Likewise. --- src/chgrp.c | 4 ++-- src/chmod.c | 2 ++ src/chown-core.c | 7 +++++++ src/chown-core.h | 5 ++--- src/chown.c | 4 ++-- 5 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/src/chgrp.c b/src/chgrp.c index 130fa73..ec3bb13 100644 --- a/src/chgrp.c +++ b/src/chgrp.c @@ -295,7 +295,7 @@ main (int argc, char **argv) else { char *group_name = argv[optind++]; - chopt.group_name = (*group_name ? group_name : NULL); + chopt.group_name = (*group_name ? xstrdup (group_name) : NULL); gid = parse_group (group_name); } @@ -313,7 +313,7 @@ main (int argc, char **argv) (uid_t) -1, gid, (uid_t) -1, (gid_t) -1, &chopt); - chopt_free (&chopt); + IF_LINT (chopt_free (&chopt)); return ok ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/src/chmod.c b/src/chmod.c index 0e9436c..520d5e1 100644 --- a/src/chmod.c +++ b/src/chmod.c @@ -566,5 +566,7 @@ main (int argc, char **argv) ok = process_files (argv + optind, FTS_COMFOLLOW | FTS_PHYSICAL | FTS_DEFER_STAT); + IF_LINT (free (change)); + return ok ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/src/chown-core.c b/src/chown-core.c index c235ef3..c99d263 100644 --- a/src/chown-core.c +++ b/src/chown-core.c @@ -66,6 +66,13 @@ chopt_init (struct Chown_option *chopt) chopt->group_name = NULL; } +extern void +chopt_free (struct Chown_option *chopt) +{ + free (chopt->user_name); + free (chopt->group_name); +} + /* Convert the numeric group-id, GID, to a string stored in xmalloc'd memory, and return it. If there's no corresponding group name, use the decimal representation of the ID. */ diff --git a/src/chown-core.h b/src/chown-core.h index c410158..77a5feb 100644 --- a/src/chown-core.h +++ b/src/chown-core.h @@ -68,9 +68,8 @@ struct Chown_option void chopt_init (struct Chown_option *); -/* Deliberately do not free chopt->user_name or ->group_name. - They're not always allocated. */ -# define chopt_free(chopt) +void +chopt_free (struct Chown_option *); char * gid_to_name (gid_t) _GL_ATTRIBUTE_MALLOC; diff --git a/src/chown.c b/src/chown.c index da6ed4a..f44eab2 100644 --- a/src/chown.c +++ b/src/chown.c @@ -306,7 +306,7 @@ main (int argc, char **argv) empty string so that diagnostics say "ownership :GROUP" rather than "group GROUP". */ if (!chopt.user_name && chopt.group_name) - chopt.user_name = bad_cast (""); + chopt.user_name = xstrdup (""); optind++; } @@ -325,7 +325,7 @@ main (int argc, char **argv) uid, gid, required_uid, required_gid, &chopt); - chopt_free (&chopt); + IF_LINT (chopt_free (&chopt)); return ok ? EXIT_SUCCESS : EXIT_FAILURE; } -- 2.9.3