From ca2d30ce4acb4395649d34f4987dfb45b603b435 Mon Sep 17 00:00:00 2001 From: yao zhang Date: Sep 23 2025 03:44:35 +0000 Subject: Fix option parameter memory leak If the parameter type is POPT_ARG-STRING, we need to free up memory ourselves --- diff --git a/apps/lgroupadd.c b/apps/lgroupadd.c index 05bb1a5..6fe6cb3 100644 --- a/apps/lgroupadd.c +++ b/apps/lgroupadd.c @@ -134,6 +134,8 @@ main(int argc, const char **argv) result = 0; done: + free(gid_number_str); + if (ent) lu_ent_free(ent); if (ctx) lu_end(ctx); diff --git a/apps/lgroupmod.c b/apps/lgroupmod.c index 8ade0ab..e074b0c 100644 --- a/apps/lgroupmod.c +++ b/apps/lgroupmod.c @@ -333,6 +333,15 @@ main(int argc, const char **argv) result = 0; done: + free(gid_number_str); + free(gid); + free(userPassword); + free(cryptedUserPassword); + free(addAdmins); + free(remAdmins); + free(addMembers); + free(remMembers); + if (ent) lu_ent_free(ent); if (ctx) lu_end(ctx); diff --git a/apps/lnewusers.c b/apps/lnewusers.c index 6f9760a..edfebf9 100644 --- a/apps/lnewusers.c +++ b/apps/lnewusers.c @@ -311,6 +311,7 @@ main(int argc, const char **argv) result = 0; done: + free(file); if (groupEnt) lu_ent_free(groupEnt); if (ent) lu_ent_free(ent); diff --git a/apps/lpasswd.c b/apps/lpasswd.c index 6218cab..37a3622 100644 --- a/apps/lpasswd.c +++ b/apps/lpasswd.c @@ -35,8 +35,8 @@ main(int argc, const char **argv) struct lu_context *ctx = NULL; struct lu_ent *ent = NULL; struct lu_error *error = NULL; - char *password = NULL, *cryptedPassword = NULL; - const char *user; + char *password = NULL, *cryptedPassword = NULL, *passwd_old = NULL; + const char *user, *user_old = NULL; int c; int result; int plain_fd = -1, crypted_fd = -1; @@ -76,6 +76,8 @@ main(int argc, const char **argv) goto done; } user = poptGetArg(popt); + user_old = user; + passwd_old = password; if ((user == NULL) || (geteuid() != getuid())) { struct passwd *pwd; @@ -230,6 +232,14 @@ main(int argc, const char **argv) result = 0; done: + free(cryptedPassword); + if (password != passwd_old) + g_free(password); + free(passwd_old); + if (user != user_old) + g_free(user); + free(user_old); + if (ent) lu_ent_free(ent); if (ctx) lu_end(ctx); diff --git a/apps/luseradd.c b/apps/luseradd.c index 96a5ade..ec40c2e 100644 --- a/apps/luseradd.c +++ b/apps/luseradd.c @@ -346,6 +346,21 @@ main(int argc, const char **argv) result = 0; done: + free(gecos); + free(homeDirectory); + free(skeleton); + free(loginShell); + free(uid_number_str); + free(gid); + free(userPassword); + free(cryptedUserPassword); + free(commonName); + free(givenName); + free(surname); + free(roomNumber); + free(telephoneNumber); + free(homePhone); + if (ent) lu_ent_free(ent); if (ctx) lu_end(ctx); diff --git a/apps/lusermod.c b/apps/lusermod.c index 3828796..9be7d99 100644 --- a/apps/lusermod.c +++ b/apps/lusermod.c @@ -411,6 +411,21 @@ main(int argc, const char **argv) result = 0; done: + free(gecos); + free(homeDirectory); + free(loginShell); + free(uid_number_str); + free(gid_number_str); + free(uid); + free(userPassword); + free(cryptedUserPassword); + free(commonName); + free(givenName); + free(surname); + free(roomNumber); + free(telephoneNumber); + free(homePhone); + if (ent) lu_ent_free(ent); if (ctx) lu_end(ctx);