From aeac84f6bfdec3f1ba7968578ebfc38e2fef7132 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: May 09 2023 05:38:35 +0000 Subject: import libuser-0.63-12.el9 --- diff --git a/SOURCES/0001-man-typo.patch b/SOURCES/0001-man-typo.patch new file mode 100644 index 0000000..bacac10 --- /dev/null +++ b/SOURCES/0001-man-typo.patch @@ -0,0 +1,19 @@ +commit 9b9d41eeeb037cca047feb93805a08a3e47c3dea +Author: Andre Boscatto +Date: Fri Apr 1 15:35:01 2022 +0200 + + man: Fixing typo in password + +diff --git a/apps/lchage.1 b/apps/lchage.1 +index c3dbf40..73cf5e0 100644 +--- a/apps/lchage.1 ++++ b/apps/lchage.1 +@@ -72,7 +72,7 @@ Require at least \fIdays\fR days between password changes. + Set \fIdays\fR to 0 or -1 to disable this requirement. + + If this value is larger than the value set by \fB\-\-maxdays\fP, +-the user cannot change the pasword. ++the user cannot change the password. + + .TP + \fB\-M\fR, \fB\-\-maxdays\fR=\fIdays\fR diff --git a/SOURCES/0002-popt-memopy.patch b/SOURCES/0002-popt-memopy.patch new file mode 100644 index 0000000..3f8d0a0 --- /dev/null +++ b/SOURCES/0002-popt-memopy.patch @@ -0,0 +1,1509 @@ +commit 3e70bc230962b3539d742ea1b886c5d63b303cd6 +Author: Tomas Halman +Date: Fri Sep 23 14:08:21 2022 +0200 + + Correct popt memory handling + + In the code of libusers we use popt library but we release popt context + too early. In older versions, popt leaked memory, so it worked anyway. + + With this patch poptFeeContext() call is moved to the end of main() + function. + + The patch also unifies the way utilities terminate in case of an error. + + Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2125904 + +diff --git a/apps/lchage.c b/apps/lchage.c +index 1a4f048..3620e75 100644 +--- a/apps/lchage.c ++++ b/apps/lchage.c +@@ -71,13 +71,14 @@ main(int argc, const char **argv) + long shadowMin = INVALID_LONG, shadowMax = INVALID_LONG, + shadowLastChange = INVALID_LONG, shadowInactive = INVALID_LONG, + shadowExpire = INVALID_LONG, shadowWarning = INVALID_LONG; +- const char *user; +- struct lu_context *ctx; +- struct lu_ent *ent; ++ const char *user = NULL; ++ struct lu_context *ctx = NULL; ++ struct lu_ent *ent = NULL; + struct lu_error *error = NULL; + int interactive = FALSE; + int list_only = FALSE; + int c; ++ int result; + + poptContext popt; + struct poptOption options[] = { +@@ -118,7 +119,8 @@ main(int argc, const char **argv) + fprintf(stderr, _("Error parsing arguments: %s.\n"), + poptStrerror(c)); + poptPrintUsage(popt, stderr, 0); +- exit(1); ++ result = 1; ++ goto done; + } + user = poptGetArg(popt); + +@@ -126,11 +128,10 @@ main(int argc, const char **argv) + if (user == NULL) { + fprintf(stderr, _("No user name specified.\n")); + poptPrintUsage(popt, stderr, 0); +- return 1; ++ result = 1; ++ goto done; + } + +- poptFreeContext(popt); +- + /* Start up the library. */ + ctx = lu_start(user, lu_user, NULL, NULL, + interactive ? lu_prompt_console : +@@ -138,7 +139,8 @@ main(int argc, const char **argv) + if (ctx == NULL) { + fprintf(stderr, _("Error initializing %s: %s.\n"), PACKAGE, + lu_strerror(error)); +- return 1; ++ result = 1; ++ goto done; + } + + ent = lu_ent_new(); +@@ -146,7 +148,8 @@ main(int argc, const char **argv) + /* Look up information about the user. */ + if (lu_user_lookup_name(ctx, user, ent, &error) == FALSE) { + fprintf(stderr, _("User %s does not exist.\n"), user); +- return 2; ++ result = 2; ++ goto done; + } + + if (list_only) { +@@ -242,7 +245,8 @@ main(int argc, const char **argv) + "%s\n"), user, lu_strerror(error)); + lu_audit_logger(AUDIT_USER_MGMT, "change-age", user, + AUDIT_NO_ID, 0); +- return 3; ++ result = 3; ++ goto done; + } + lu_audit_logger(AUDIT_USER_MGMT, "change-age", user, + AUDIT_NO_ID, 1); +@@ -250,9 +254,14 @@ main(int argc, const char **argv) + lu_nscd_flush_cache(LU_NSCD_CACHE_PASSWD); + } + +- lu_ent_free(ent); ++ result = 0; ++ ++ done: ++ if (ent) lu_ent_free(ent); + +- lu_end(ctx); ++ if (ctx) lu_end(ctx); ++ ++ poptFreeContext(popt); + +- return 0; ++ return result; + } +diff --git a/apps/lchfn.c b/apps/lchfn.c +index 137f85f..dcc616f 100644 +--- a/apps/lchfn.c ++++ b/apps/lchfn.c +@@ -41,11 +41,12 @@ main(int argc, const char **argv) + { + const char *user, *gecos; + const char *name, *office, *officephone, *homephone; +- struct lu_context *ctx; ++ struct lu_context *ctx = NULL; + struct lu_error *error = NULL; +- struct lu_ent *ent; ++ struct lu_ent *ent = NULL; + int interactive = FALSE; + int c; ++ int result; + struct lu_prompt prompts[7]; + poptContext popt; + struct poptOption options[] = { +@@ -53,7 +54,8 @@ main(int argc, const char **argv) + N_("prompt for all information"), NULL}, + POPT_AUTOHELP POPT_TABLEEND + }; +- char **fields, *p; ++ char **fields = NULL; ++ char *p; + size_t fields_len; + size_t pcount, i; + +@@ -70,7 +72,8 @@ main(int argc, const char **argv) + fprintf(stderr, _("Error parsing arguments: %s.\n"), + poptStrerror(c)); + poptPrintUsage(popt, stderr, 0); +- exit(1); ++ result = 1; ++ goto done; + } + user = poptGetArg(popt); + +@@ -86,11 +89,11 @@ main(int argc, const char **argv) + fprintf(stderr, _("No user name specified, no name " + "for uid %d.\n"), getuid()); + poptPrintUsage(popt, stderr, 0); +- exit(1); ++ result = 1; ++ goto done; + } + } + +- poptFreeContext(popt); + + /* Give the user some idea of what's going on. */ + g_print(_("Changing finger information for %s.\n"), user); +@@ -102,7 +105,8 @@ main(int argc, const char **argv) + if (ctx == NULL) { + fprintf(stderr, _("Error initializing %s: %s.\n"), PACKAGE, + lu_strerror(error)); +- return 1; ++ result = 1; ++ goto done; + } + + /* Authenticate the user to the "chfn" service. */ +@@ -112,7 +116,8 @@ main(int argc, const char **argv) + ent = lu_ent_new(); + if (lu_user_lookup_name(ctx, user, ent, &error) == FALSE) { + fprintf(stderr, _("User %s does not exist.\n"), user); +- exit(1); ++ result = 1; ++ goto done; + } + + /* Read the user's GECOS information. */ +@@ -206,7 +211,8 @@ main(int argc, const char **argv) + if (lu_prompt_console(prompts, pcount, NULL, &error) == FALSE) { + fprintf(stderr, + _("Finger information not changed: input error.\n")); +- exit(1); ++ result = 1; ++ goto done; + } + + /* Now iterate over the answers and figure things out. */ +@@ -272,14 +278,20 @@ main(int argc, const char **argv) + } else { + fprintf(stderr, _("Finger information not changed: %s.\n"), + lu_strerror(error)); +- return 1; ++ result = 1; ++ goto done; + } + ++ result = 0; ++ ++ done: + g_strfreev(fields); + +- lu_ent_free(ent); ++ if (ent) lu_ent_free(ent); + +- lu_end(ctx); ++ if (ctx) lu_end(ctx); ++ ++ poptFreeContext(popt); + +- return 0; ++ return result; + } +diff --git a/apps/lchsh.c b/apps/lchsh.c +index 555ed2e..58b2a34 100644 +--- a/apps/lchsh.c ++++ b/apps/lchsh.c +@@ -33,12 +33,13 @@ int + main(int argc, const char **argv) + { + const char *user; +- struct lu_context *ctx; ++ struct lu_context *ctx = NULL; + struct lu_error *error = NULL; +- struct lu_ent *ent; ++ struct lu_ent *ent = NULL; + char *shell; + int interactive = FALSE; + int c; ++ int result; + poptContext popt; + struct poptOption options[] = { + {"interactive", 'i', POPT_ARG_NONE, &interactive, 0, +@@ -59,7 +60,8 @@ main(int argc, const char **argv) + fprintf(stderr, _("Error parsing arguments: %s.\n"), + poptStrerror(c)); + poptPrintUsage(popt, stderr, 0); +- exit(1); ++ result = 1; ++ goto done; + } + user = poptGetArg(popt); + +@@ -75,12 +77,11 @@ main(int argc, const char **argv) + fprintf(stderr, _("No user name specified, no name for " + "uid %d.\n"), getuid()); + poptPrintUsage(popt, stderr, 0); +- exit(1); ++ result = 1; ++ goto done; + } + } + +- poptFreeContext(popt); +- + /* Give the user some idea of what's going on. */ + g_print(_("Changing shell for %s.\n"), user); + +@@ -91,7 +92,8 @@ main(int argc, const char **argv) + if (ctx == NULL) { + fprintf(stderr, _("Error initializing %s: %s.\n"), PACKAGE, + lu_strerror(error)); +- return 1; ++ result = 1; ++ goto done; + } + + /* Authenticate the user if we need to. */ +@@ -101,7 +103,8 @@ main(int argc, const char **argv) + ent = lu_ent_new(); + if (lu_user_lookup_name(ctx, user, ent, &error) == FALSE) { + fprintf(stderr, _("User %s does not exist.\n"), user); +- exit(1); ++ result = 1; ++ goto done; + } + + /* Read the user's shell. */ +@@ -123,7 +126,8 @@ main(int argc, const char **argv) + lu_strerror(error)); + lu_audit_logger(AUDIT_USER_MGMT, "change-shell", user, + AUDIT_NO_ID, 0); +- return 1; ++ result = 1; ++ goto done; + } + /* Modify the in-memory structure's shell attribute. */ + lu_ent_set_string(ent, LU_LOGINSHELL, prompts[0].value); +@@ -142,13 +146,19 @@ main(int argc, const char **argv) + lu_strerror(error)); + lu_audit_logger(AUDIT_USER_MGMT, "change-shell", user, + AUDIT_NO_ID, 0); +- return 1; ++ result = 1; ++ goto done; + } + } + +- lu_ent_free(ent); ++ result = 0; ++ ++ done: ++ if (ent) lu_ent_free(ent); + +- lu_end(ctx); ++ if (ctx) lu_end(ctx); ++ ++ poptFreeContext(popt); + +- return 0; ++ return result; + } +diff --git a/apps/lgroupadd.c b/apps/lgroupadd.c +index 3fa2a1d..05bb1a5 100644 +--- a/apps/lgroupadd.c ++++ b/apps/lgroupadd.c +@@ -34,12 +34,13 @@ main(int argc, const char **argv) + { + const char *name, *gid_number_str = NULL; + gid_t gidNumber = LU_VALUE_INVALID_ID; +- struct lu_context *ctx; +- struct lu_ent *ent; ++ struct lu_context *ctx = NULL; ++ struct lu_ent *ent = NULL; + struct lu_error *error = NULL; + int interactive = FALSE; + int system_account = FALSE; + int c; ++ int result; + + poptContext popt; + struct poptOption options[] = { +@@ -65,7 +66,8 @@ main(int argc, const char **argv) + fprintf(stderr, _("Error parsing arguments: %s.\n"), + poptStrerror(c)); + poptPrintUsage(popt, stderr, 0); +- exit(1); ++ result = 1; ++ goto done; + } + name = poptGetArg(popt); + +@@ -73,7 +75,8 @@ main(int argc, const char **argv) + if (name == NULL) { + fprintf(stderr, _("No group name specified.\n")); + poptPrintUsage(popt, stderr, 0); +- return 1; ++ result = 1; ++ goto done; + } + + if (gid_number_str != NULL) { +@@ -87,13 +90,12 @@ main(int argc, const char **argv) + fprintf(stderr, _("Invalid group ID %s\n"), + gid_number_str); + poptPrintUsage(popt, stderr, 0); +- return 1; ++ result = 1; ++ goto done; + } + gidNumber = val; + } + +- poptFreeContext(popt); +- + /* Start up the library. */ + ctx = lu_start(NULL, 0, NULL, NULL, + interactive ? lu_prompt_console : +@@ -101,7 +103,8 @@ main(int argc, const char **argv) + if (ctx == NULL) { + fprintf(stderr, _("Error initializing %s: %s.\n"), PACKAGE, + lu_strerror(error)); +- return 1; ++ result = 1; ++ goto done; + } + + /* Create a group entity object holding sensible defaults for a +@@ -120,17 +123,22 @@ main(int argc, const char **argv) + lu_strerror(error)); + lu_audit_logger(AUDIT_ADD_GROUP, "add-group", name, + AUDIT_NO_ID, 0); +- return 2; ++ result = 2; ++ goto done; + } + + lu_nscd_flush_cache(LU_NSCD_CACHE_GROUP); + +- lu_ent_free(ent); +- +- lu_end(ctx); +- + lu_audit_logger(AUDIT_ADD_GROUP, "add-group", name, + AUDIT_NO_ID, 1); ++ result = 0; ++ ++ done: ++ if (ent) lu_ent_free(ent); ++ ++ if (ctx) lu_end(ctx); ++ ++ poptFreeContext(popt); + +- return 0; ++ return result; + } +diff --git a/apps/lgroupdel.c b/apps/lgroupdel.c +index c5ccbed..f427924 100644 +--- a/apps/lgroupdel.c ++++ b/apps/lgroupdel.c +@@ -30,12 +30,13 @@ + int + main(int argc, const char **argv) + { +- struct lu_context *ctx; +- struct lu_ent *ent; ++ struct lu_context *ctx = NULL; ++ struct lu_ent *ent = NULL; + struct lu_error *error = NULL; + const char *group; + int interactive = FALSE; + int c; ++ int result; + + poptContext popt; + struct poptOption options[] = { +@@ -57,7 +58,8 @@ main(int argc, const char **argv) + fprintf(stderr, _("Error parsing arguments: %s.\n"), + poptStrerror(c)); + poptPrintUsage(popt, stderr, 0); +- exit(1); ++ result = 1; ++ goto done; + } + group = poptGetArg(popt); + +@@ -65,11 +67,10 @@ main(int argc, const char **argv) + if (group == NULL) { + fprintf(stderr, _("No group name specified.\n")); + poptPrintUsage(popt, stderr, 0); +- return 1; ++ result = 1; ++ goto done; + } + +- poptFreeContext(popt); +- + /* Start up the library. */ + ctx = lu_start(NULL, 0, NULL, NULL, + interactive ? lu_prompt_console : +@@ -77,14 +78,16 @@ main(int argc, const char **argv) + if (ctx == NULL) { + fprintf(stderr, _("Error initializing %s: %s.\n"), PACKAGE, + lu_strerror(error)); +- return 1; ++ result = 1; ++ goto done; + } + + /* Look up the group structure. */ + ent = lu_ent_new(); + if (lu_group_lookup_name(ctx, group, ent, &error) == FALSE) { + fprintf(stderr, _("Group %s does not exist.\n"), group); +- return 2; ++ result = 2; ++ goto done; + } + + /* Delete the group. */ +@@ -93,17 +96,22 @@ main(int argc, const char **argv) + group, lu_strerror(error)); + lu_audit_logger(AUDIT_DEL_GROUP, "delete-group", group, + AUDIT_NO_ID, 0); +- return 3; ++ result = 3; ++ goto done; + } + + lu_nscd_flush_cache(LU_NSCD_CACHE_GROUP); + +- lu_ent_free(ent); +- +- lu_end(ctx); +- + lu_audit_logger(AUDIT_DEL_GROUP, "delete-group", group, + AUDIT_NO_ID, 1); ++ result = 0; ++ ++ done: ++ if (ent) lu_ent_free(ent); ++ ++ if (ctx) lu_end(ctx); ++ ++ poptFreeContext(popt); + +- return 0; ++ return result; + } +diff --git a/apps/lgroupmod.c b/apps/lgroupmod.c +index 20be85f..8ade0ab 100644 +--- a/apps/lgroupmod.c ++++ b/apps/lgroupmod.c +@@ -39,14 +39,16 @@ main(int argc, const char **argv) + char **admins, **members; + gid_t gidNumber = LU_VALUE_INVALID_ID; + gid_t oldGidNumber = LU_VALUE_INVALID_ID; +- struct lu_context *ctx; +- struct lu_ent *ent; ++ struct lu_context *ctx = NULL; ++ struct lu_ent *ent = NULL; ++ struct lu_ent *user_ent; + struct lu_error *error = NULL; + GPtrArray *users = NULL; + GValue val; + int change = FALSE, lock = FALSE, unlock = FALSE; + int interactive = FALSE; + int c; ++ int result; + + poptContext popt; + struct poptOption options[] = { +@@ -85,14 +87,16 @@ main(int argc, const char **argv) + fprintf(stderr, _("Error parsing arguments: %s.\n"), + poptStrerror(c)); + poptPrintUsage(popt, stderr, 0); +- exit(1); ++ result = 1; ++ goto done; + } + group = poptGetArg(popt); + + if (group == NULL) { + fprintf(stderr, _("No group name specified.\n")); + poptPrintUsage(popt, stderr, 0); +- return 1; ++ result = 1; ++ goto done; + } + if (gid_number_str != NULL) { + intmax_t val; +@@ -105,32 +109,34 @@ main(int argc, const char **argv) + fprintf(stderr, _("Invalid group ID %s\n"), + gid_number_str); + poptPrintUsage(popt, stderr, 0); +- return 1; ++ result = 1; ++ goto done; + } + gidNumber = val; + } + +- poptFreeContext(popt); +- + ctx = lu_start(NULL, 0, NULL, NULL, + interactive ? lu_prompt_console : + lu_prompt_console_quiet, NULL, &error); + if (ctx == NULL) { + fprintf(stderr, _("Error initializing %s: %s.\n"), PACKAGE, + lu_strerror(error)); +- return 1; ++ result = 1; ++ goto done; + } + + if (lock && unlock) { + fprintf(stderr, _("Both -L and -U specified.\n")); +- return 2; ++ result = 2; ++ goto done; + } + + ent = lu_ent_new(); + + if (lu_group_lookup_name(ctx, group, ent, &error) == FALSE) { + fprintf(stderr, _("Group %s does not exist.\n"), group); +- return 3; ++ result = 3; ++ goto done; + } + + if (userPassword) { +@@ -141,7 +147,8 @@ main(int argc, const char **argv) + lu_audit_logger(AUDIT_GRP_CHAUTHTOK, + "changing-group-passwd", group, + AUDIT_NO_ID, 0); +- return 4; ++ result = 4; ++ goto done; + } + lu_audit_logger(AUDIT_GRP_CHAUTHTOK, + "changing-group-passwd", group, +@@ -156,7 +163,8 @@ main(int argc, const char **argv) + lu_audit_logger(AUDIT_GRP_CHAUTHTOK, + "changing-group-passwd", group, + AUDIT_NO_ID, 0); +- return 5; ++ result = 5; ++ goto done; + } + lu_audit_logger(AUDIT_GRP_CHAUTHTOK, + "changing-group-passwd", group, +@@ -171,7 +179,8 @@ main(int argc, const char **argv) + lu_audit_logger(AUDIT_GRP_MGMT, + "changing-group-lock", group, + AUDIT_NO_ID, 0); +- return 6; ++ result = 6; ++ goto done; + } + lu_audit_logger(AUDIT_GRP_MGMT, + "changing-group-lock", group, +@@ -186,7 +195,8 @@ main(int argc, const char **argv) + lu_audit_logger(AUDIT_GRP_MGMT, + "changing-group-lock", group, + AUDIT_NO_ID, 0); +- return 7; ++ result = 7; ++ goto done; + } + lu_audit_logger(AUDIT_GRP_MGMT, + "changing-group-lock", group, +@@ -268,7 +278,8 @@ main(int argc, const char **argv) + lu_audit_logger(AUDIT_GRP_MGMT, + "changing-group-members", group, + AUDIT_NO_ID, 0); +- return 8; ++ result = 8; ++ goto done; + } + lu_audit_logger(AUDIT_GRP_MGMT, + "changing-group-members", group, +@@ -289,15 +300,14 @@ main(int argc, const char **argv) + lu_audit_logger(AUDIT_GRP_MGMT, + "changing-group-id", group, + AUDIT_NO_ID, 0); +- return 8; ++ result = 8; ++ goto done; + } + lu_audit_logger(AUDIT_GRP_MGMT, + "changing-group-id", group, + AUDIT_NO_ID, 1); + } + +- lu_ent_free(ent); +- + lu_nscd_flush_cache(LU_NSCD_CACHE_GROUP); + + if (oldGidNumber != LU_VALUE_INVALID_ID && +@@ -305,22 +315,29 @@ main(int argc, const char **argv) + size_t i; + + for (i = 0; i < users->len; i++) { +- ent = g_ptr_array_index(users, i); +- if (lu_ent_get_first_id(ent, LU_GIDNUMBER) ++ user_ent = g_ptr_array_index(users, i); ++ if (lu_ent_get_first_id(user_ent, LU_GIDNUMBER) + == oldGidNumber) { +- lu_ent_set_id(ent, LU_GIDNUMBER, gidNumber); +- lu_user_modify(ctx, ent, &error); ++ lu_ent_set_id(user_ent, LU_GIDNUMBER, gidNumber); ++ lu_user_modify(ctx, user_ent, &error); + if (error != NULL) + lu_error_free(&error); + } +- lu_ent_free(ent); ++ lu_ent_free(user_ent); + } + g_ptr_array_free(users, TRUE); + + lu_nscd_flush_cache(LU_NSCD_CACHE_PASSWD); + } + +- lu_end(ctx); ++ result = 0; ++ ++ done: ++ if (ent) lu_ent_free(ent); ++ ++ if (ctx) lu_end(ctx); ++ ++ poptFreeContext(popt); + +- return 0; ++ return result; + } +diff --git a/apps/lid.c b/apps/lid.c +index 4b8afd9..cdcc122 100644 +--- a/apps/lid.c ++++ b/apps/lid.c +@@ -103,12 +103,13 @@ int + main(int argc, const char **argv) + { + const char *name; +- struct lu_context *ctx; ++ struct lu_context *ctx = NULL; + struct lu_error *error = NULL; +- struct lu_ent *ent; ++ struct lu_ent *ent = NULL; + int interactive = FALSE; + int groupflag = FALSE, nameonly = FALSE; + int c; ++ int result; + poptContext popt; + struct poptOption options[] = { + {"interactive", 'i', POPT_ARG_NONE, &interactive, 0, +@@ -133,7 +134,8 @@ main(int argc, const char **argv) + fprintf(stderr, _("Error parsing arguments: %s.\n"), + poptStrerror(c)); + poptPrintUsage(popt, stderr, 0); +- exit(1); ++ result = 1; ++ goto done; + } + name = poptGetArg(popt); + +@@ -150,7 +152,8 @@ main(int argc, const char **argv) + fprintf(stderr, _("No group name specified, " + "no name for gid %d.\n"), getgid()); + poptPrintUsage(popt, stderr, 0); +- exit(1); ++ result = 1; ++ goto done; + } + } else { + struct passwd *pwd; +@@ -165,20 +168,20 @@ main(int argc, const char **argv) + "no name for uid %d.\n"), + getuid()); + poptPrintUsage(popt, stderr, 0); +- exit(1); ++ result = 1; ++ goto done; + } + } + } + +- poptFreeContext(popt); +- + ctx = lu_start(name, groupflag ? lu_user : lu_group, NULL, NULL, + interactive ? lu_prompt_console : + lu_prompt_console_quiet, NULL, &error); + if (ctx == NULL) { + fprintf(stderr, _("Error initializing %s: %s.\n"), PACKAGE, + lu_strerror(error)); +- return 1; ++ result = 1; ++ goto done; + } + + ent = lu_ent_new(); +@@ -190,9 +193,9 @@ main(int argc, const char **argv) + lu_error_free(&error); + } else + fprintf(stderr, _("%s does not exist\n"), name); +- return 1; ++ result = 1; ++ goto done; + } +- lu_ent_free(ent); + + if (nameonly) + do_nameonly(ctx, name, +@@ -207,7 +210,14 @@ main(int argc, const char **argv) + LU_GROUPNAME, LU_GIDNUMBER, "gid"); + } + +- lu_end(ctx); ++ result = 0; ++ ++ done: ++ if (ent) lu_ent_free(ent); ++ ++ if (ctx) lu_end(ctx); ++ ++ poptFreeContext(popt); + +- return 0; ++ return result; + } +diff --git a/apps/lnewusers.c b/apps/lnewusers.c +index 1a5a5cb..6f9760a 100644 +--- a/apps/lnewusers.c ++++ b/apps/lnewusers.c +@@ -31,11 +31,13 @@ + int + main(int argc, const char **argv) + { +- struct lu_context *ctx; ++ struct lu_context *ctx = NULL; + struct lu_error *error = NULL; +- struct lu_ent *ent, *groupEnt; ++ struct lu_ent *ent = NULL; ++ struct lu_ent *groupEnt = NULL; + int interactive = FALSE, nocreatehome = FALSE, nocreatemail = FALSE; + int c; ++ int result; + char *file = NULL; + FILE *fp = stdin; + char buf[LINE_MAX]; +@@ -66,11 +68,10 @@ main(int argc, const char **argv) + fprintf(stderr, _("Error parsing arguments: %s.\n"), + poptStrerror(c)); + poptPrintUsage(popt, stderr, 0); +- exit(1); ++ result = 1; ++ goto done; + } + +- poptFreeContext(popt); +- + /* Start up the library. */ + ctx = lu_start(NULL, lu_user, NULL, NULL, + interactive ? lu_prompt_console : +@@ -78,7 +79,8 @@ main(int argc, const char **argv) + if (ctx == NULL) { + fprintf(stderr, _("Error initializing %s: %s.\n"), PACKAGE, + lu_strerror(error)); +- return 1; ++ result = 1; ++ goto done; + } + + /* Open the file we're going to look at. */ +@@ -87,7 +89,8 @@ main(int argc, const char **argv) + if (fp == NULL) { + fprintf(stderr, _("Error opening `%s': %s.\n"), + file, strerror(errno)); +- return 2; ++ result = 2; ++ goto done; + } + } else { + fp = stdin; +@@ -305,10 +308,15 @@ main(int argc, const char **argv) + lu_ent_clear_all(groupEnt); + } + +- lu_ent_free(groupEnt); +- lu_ent_free(ent); ++ result = 0; ++ ++ done: ++ if (groupEnt) lu_ent_free(groupEnt); ++ if (ent) lu_ent_free(ent); + +- lu_end(ctx); ++ if (ctx) lu_end(ctx); ++ ++ poptFreeContext(popt); + +- return 0; ++ return result; + } +diff --git a/apps/lpasswd.c b/apps/lpasswd.c +index 64f0b87..6218cab 100644 +--- a/apps/lpasswd.c ++++ b/apps/lpasswd.c +@@ -32,12 +32,13 @@ + int + main(int argc, const char **argv) + { +- struct lu_context *ctx; +- struct lu_ent *ent; ++ struct lu_context *ctx = NULL; ++ struct lu_ent *ent = NULL; + struct lu_error *error = NULL; + char *password = NULL, *cryptedPassword = NULL; + const char *user; + int c; ++ int result; + int plain_fd = -1, crypted_fd = -1; + int interactive = 0, groupflag = 0; + poptContext popt; +@@ -71,7 +72,8 @@ main(int argc, const char **argv) + fprintf(stderr, _("Error parsing arguments: %s.\n"), + poptStrerror(c)); + poptPrintUsage(popt, stderr, 0); +- exit(1); ++ result = 1; ++ goto done; + } + user = poptGetArg(popt); + +@@ -84,19 +86,19 @@ main(int argc, const char **argv) + } else { + fprintf(stderr, _("No user name specified.\n")); + poptPrintUsage(popt, stderr, 0); +- return 1; ++ result = 1; ++ goto done; + } + } + +- poptFreeContext(popt); +- + ctx = lu_start(user, groupflag ? lu_group : lu_user, NULL, NULL, + interactive ? lu_prompt_console : + lu_prompt_console_quiet, NULL, &error); + if (ctx == NULL) { + fprintf(stderr, _("Error initializing %s: %s.\n"), PACKAGE, + lu_strerror(error)); +- return 1; ++ result = 1; ++ goto done; + } + + lu_authenticate_unprivileged(ctx, user, "passwd"); +@@ -132,7 +134,8 @@ main(int argc, const char **argv) + } else { + fprintf(stderr, _("Password change " + "canceled.\n")); +- return 1; ++ result = 1; ++ goto done; + } + } + if (error) { +@@ -146,12 +149,14 @@ main(int argc, const char **argv) + if (!groupflag) { + if (lu_user_lookup_name(ctx, user, ent, &error) == FALSE) { + fprintf(stderr, _("User %s does not exist.\n"), user); +- return 2; ++ result = 2; ++ goto done; + } + } else { + if (lu_group_lookup_name(ctx, user, ent, &error) == FALSE) { + fprintf(stderr, _("Group %s does not exist.\n"), user); +- return 2; ++ result = 2; ++ goto done; + } + } + +@@ -164,7 +169,8 @@ main(int argc, const char **argv) + fprintf(stderr, + _("Error reading from file descriptor %d.\n"), + plain_fd); +- return 1; ++ result = 1; ++ goto done; + } + while ((i > 0) && + ((buf[i - 1] == '\r') || (buf[i - 1] == '\n'))) +@@ -181,7 +187,8 @@ main(int argc, const char **argv) + fprintf(stderr, + _("Error reading from file descriptor %d.\n"), + crypted_fd); +- return 1; ++ result = 1; ++ goto done; + } + while ((i > 0) && + ((buf[i - 1] == '\r') || (buf[i - 1] == '\n'))) +@@ -203,7 +210,8 @@ main(int argc, const char **argv) + fprintf(stderr, _("Error setting password for user " + "%s: %s.\n"), user, + lu_strerror(error)); +- return 3; ++ result = 3; ++ goto done; + } + lu_nscd_flush_cache(LU_NSCD_CACHE_PASSWD); + } else { +@@ -212,16 +220,21 @@ main(int argc, const char **argv) + fprintf(stderr, _("Error setting password for group " + "%s: %s.\n"), user, + lu_strerror(error)); +- return 3; ++ result = 3; ++ goto done; + } + lu_nscd_flush_cache(LU_NSCD_CACHE_GROUP); + } + +- lu_ent_free(ent); ++ fprintf(stderr, _("Password changed.\n")); ++ result = 0; ++ ++ done: ++ if (ent) lu_ent_free(ent); + +- lu_end(ctx); ++ if (ctx) lu_end(ctx); + +- fprintf(stderr, _("Password changed.\n")); ++ poptFreeContext(popt); + +- return 0; ++ return result; + } +diff --git a/apps/luseradd.c b/apps/luseradd.c +index 9d7f4f1..96a5ade 100644 +--- a/apps/luseradd.c ++++ b/apps/luseradd.c +@@ -38,14 +38,16 @@ main(int argc, const char **argv) + *uid_number_str = NULL, *commonName = NULL, + *givenName = NULL, *surname = NULL, *roomNumber = NULL, + *telephoneNumber = NULL, *homePhone = NULL; +- struct lu_context *ctx; +- struct lu_ent *ent, *groupEnt; ++ struct lu_context *ctx = NULL; ++ struct lu_ent *ent = NULL; ++ struct lu_ent *groupEnt = NULL; + struct lu_error *error = NULL; + uid_t uidNumber = LU_VALUE_INVALID_ID; + gid_t gidNumber; + int dont_create_group = FALSE, dont_create_home = FALSE, + system_account = FALSE, interactive = FALSE, create_group; + int c; ++ int result; + intmax_t imax; + char *p; + +@@ -103,7 +105,8 @@ main(int argc, const char **argv) + fprintf(stderr, _("Error parsing arguments: %s.\n"), + poptStrerror(c)); + poptPrintUsage(popt, stderr, 0); +- exit(1); ++ result = 1; ++ goto done; + } + + /* Force certain flags one way or another. */ +@@ -117,7 +120,8 @@ main(int argc, const char **argv) + if (name == NULL) { + fprintf(stderr, _("No user name specified.\n")); + poptPrintUsage(popt, stderr, 0); +- return 1; ++ result = 1; ++ goto done; + } + if (uid_number_str != NULL) { + errno = 0; +@@ -128,13 +132,12 @@ main(int argc, const char **argv) + fprintf(stderr, _("Invalid user ID %s\n"), + uid_number_str); + poptPrintUsage(popt, stderr, 0); +- return 1; ++ result = 1; ++ goto done; + } + uidNumber = imax; + } + +- poptFreeContext(popt); +- + /* Initialize the library. */ + ctx = lu_start(NULL, 0, NULL, NULL, + interactive ? lu_prompt_console : +@@ -142,7 +145,8 @@ main(int argc, const char **argv) + if (ctx == NULL) { + fprintf(stderr, _("Error initializing %s: %s.\n"), PACKAGE, + lu_strerror(error)); +- return 1; ++ result = 1; ++ goto done; + } + + /* Select a group name for the user to be in. */ +@@ -163,7 +167,8 @@ main(int argc, const char **argv) + if (gidNumber == LU_VALUE_INVALID_ID) { + fprintf(stderr, _("Invalid group ID %s\n"), + gid); +- return 1; ++ result = 1; ++ goto done; + } + } else + /* It's not a number, so it's a group name. */ +@@ -188,7 +193,8 @@ main(int argc, const char **argv) + } else { + fprintf(stderr, _("Group %jd does not exist\n"), + (intmax_t)gidNumber); +- return 1; ++ result = 1; ++ goto done; + } + } + +@@ -209,10 +215,10 @@ main(int argc, const char **argv) + if (error) { + lu_error_free(&error); + } +- lu_end(ctx); + lu_audit_logger(AUDIT_ADD_GROUP, "add-group", name, + AUDIT_NO_ID, 0); +- return 1; ++ result = 1; ++ goto done; + } + lu_audit_logger(AUDIT_ADD_GROUP, "add-group", name, + AUDIT_NO_ID, 1); +@@ -226,8 +232,8 @@ main(int argc, const char **argv) + if (error) { + lu_error_free(&error); + } +- lu_end(ctx); +- return 1; ++ result = 1; ++ goto done; + } + g_assert(gidNumber != LU_VALUE_INVALID_ID); + +@@ -266,7 +272,8 @@ main(int argc, const char **argv) + lu_audit_logger(AUDIT_ADD_USER, "add-user", name, + AUDIT_NO_ID, 0); + +- return 3; ++ result = 3; ++ goto done; + } + lu_nscd_flush_cache(LU_NSCD_CACHE_PASSWD); + lu_audit_logger(AUDIT_ADD_USER, "add-user", name, AUDIT_NO_ID, 1); +@@ -292,7 +299,8 @@ main(int argc, const char **argv) + homeDirectory, lu_strerror(error)); + lu_audit_logger(AUDIT_USER_MGMT, "add-home-dir", name, + uidNumber, 0); +- return 7; ++ result = 7; ++ goto done; + } + lu_audit_logger(AUDIT_USER_MGMT, "add-home-dir", name, + uidNumber, 1); +@@ -301,7 +309,8 @@ main(int argc, const char **argv) + if (lu_mail_spool_create(ctx, ent, &error) != TRUE) { + fprintf(stderr, _("Error creating mail spool: %s\n"), + lu_strerror(error)); +- return 8; ++ result = 8; ++ goto done; + } + } + +@@ -314,7 +323,8 @@ main(int argc, const char **argv) + fprintf(stderr, _("Error setting password for user " + "%s: %s.\n"), name, + lu_strerror(error)); +- return 3; ++ result = 3; ++ goto done; + } + } + if (cryptedUserPassword != NULL) { +@@ -325,16 +335,22 @@ main(int argc, const char **argv) + lu_strerror(error)); + lu_audit_logger(AUDIT_USER_CHAUTHTOK, "updating-password", + name, uidNumber, 0); +- return 3; ++ result = 3; ++ goto done; + } + lu_audit_logger(AUDIT_USER_CHAUTHTOK, "updating-password", + name, uidNumber, 1); + } + lu_nscd_flush_cache(LU_NSCD_CACHE_PASSWD); + +- lu_ent_free(ent); ++ result = 0; ++ ++ done: ++ if (ent) lu_ent_free(ent); + +- lu_end(ctx); ++ if (ctx) lu_end(ctx); ++ ++ poptFreeContext(popt); + +- return 0; ++ return result; + } +diff --git a/apps/luserdel.c b/apps/luserdel.c +index 7e20fa7..aab9d35 100644 +--- a/apps/luserdel.c ++++ b/apps/luserdel.c +@@ -32,13 +32,14 @@ + int + main(int argc, const char **argv) + { +- struct lu_context *ctx; +- struct lu_ent *ent; ++ struct lu_context *ctx = NULL; ++ struct lu_ent *ent = NULL; + struct lu_error *error = NULL; + const char *user; + int interactive = FALSE; + int remove_home = 0, dont_remove_group = 0; + int c; ++ int result; + + poptContext popt; + struct poptOption options[] = { +@@ -63,32 +64,34 @@ main(int argc, const char **argv) + fprintf(stderr, _("Error parsing arguments: %s.\n"), + poptStrerror(c)); + poptPrintUsage(popt, stderr, 0); +- exit(1); ++ result = 1; ++ goto done; + } + user = poptGetArg(popt); + + if (user == NULL) { + fprintf(stderr, _("No user name specified.\n")); + poptPrintUsage(popt, stderr, 0); +- return 1; ++ result = 1; ++ goto done; + } + +- poptFreeContext(popt); +- + ctx = lu_start(NULL, 0, NULL, NULL, + interactive ? lu_prompt_console : + lu_prompt_console_quiet, NULL, &error); + if (ctx == NULL) { + fprintf(stderr, _("Error initializing %s: %s.\n"), PACKAGE, + lu_strerror(error)); +- return 1; ++ result = 1; ++ goto done; + } + + ent = lu_ent_new(); + + if (lu_user_lookup_name(ctx, user, ent, &error) == FALSE) { + fprintf(stderr, _("User %s does not exist.\n"), user); +- return 2; ++ result = 2; ++ goto done; + } + + if (lu_user_delete(ctx, ent, &error) == FALSE) { +@@ -96,7 +99,8 @@ main(int argc, const char **argv) + user, lu_strerror(error)); + lu_audit_logger(AUDIT_DEL_USER, "delete-user", user, + AUDIT_NO_ID, 0); +- return 3; ++ result = 3; ++ goto done; + } + lu_audit_logger(AUDIT_DEL_USER, "delete-user", user, + AUDIT_NO_ID, 1); +@@ -112,19 +116,22 @@ main(int argc, const char **argv) + if (gid == LU_VALUE_INVALID_ID) { + fprintf(stderr, _("%s did not have a gid number.\n"), + user); +- return 4; ++ result = 4; ++ goto done; + } + group_ent = lu_ent_new(); + if (lu_group_lookup_id(ctx, gid, group_ent, &error) == FALSE) { + fprintf(stderr, _("No group with GID %jd exists, not " + "removing.\n"), (intmax_t)gid); +- return 5; ++ result = 5; ++ goto done; + } + tmp = lu_ent_get_first_string(group_ent, LU_GROUPNAME); + if (tmp == NULL) { + fprintf(stderr, _("Group with GID %jd did not have a " + "group name.\n"), (intmax_t)gid); +- return 6; ++ result = 6; ++ goto done; + } + if (strcmp(tmp, user) == 0) { + if (lu_group_delete(ctx, group_ent, &error) == FALSE) { +@@ -134,7 +141,8 @@ main(int argc, const char **argv) + lu_audit_logger_with_group (AUDIT_DEL_GROUP, + "delete-group", user, AUDIT_NO_ID, + tmp, 0); +- return 7; ++ result = 7; ++ goto done; + } + } + lu_audit_logger_with_group (AUDIT_DEL_GROUP, +@@ -152,7 +160,8 @@ main(int argc, const char **argv) + lu_audit_logger(AUDIT_USER_MGMT, + "deleting-home-directory", user, + AUDIT_NO_ID, 0); +- return 9; ++ result = 9; ++ goto done; + } + lu_audit_logger(AUDIT_USER_MGMT, "deleting-home-directory", user, + AUDIT_NO_ID, 1); +@@ -161,13 +170,19 @@ main(int argc, const char **argv) + if (lu_mail_spool_remove(ctx, ent, &error) != TRUE) { + fprintf(stderr, _("Error removing mail spool: %s"), + lu_strerror(error)); +- return 1; ++ result = 1; ++ goto done; + } + } + +- lu_ent_free(ent); ++ result = 0; ++ ++ done: ++ if (ent) lu_ent_free(ent); + +- lu_end(ctx); ++ if (ctx) lu_end(ctx); ++ ++ poptFreeContext(popt); + +- return 0; ++ return result; + } +diff --git a/apps/lusermod.c b/apps/lusermod.c +index 95cff85..3828796 100644 +--- a/apps/lusermod.c ++++ b/apps/lusermod.c +@@ -41,14 +41,15 @@ main(int argc, const char **argv) + char *old_uid, *oldHomeDirectory; + uid_t uidNumber = LU_VALUE_INVALID_ID; + gid_t gidNumber = LU_VALUE_INVALID_ID; +- struct lu_context *ctx; +- struct lu_ent *ent; ++ struct lu_context *ctx = NULL; ++ struct lu_ent *ent = NULL; + struct lu_error *error = NULL; + GPtrArray *groups = NULL; + GValue *value; + int change, move_home = FALSE, lock = FALSE, unlock = FALSE; + int interactive = FALSE; + int c; ++ int result; + + poptContext popt; + struct poptOption options[] = { +@@ -104,7 +105,8 @@ main(int argc, const char **argv) + fprintf(stderr, _("Error parsing arguments: %s.\n"), + poptStrerror(c)); + poptPrintUsage(popt, stderr, 0); +- exit(1); ++ result = 1; ++ goto done; + } + + /* We need to have been passed a user name on the command-line. We +@@ -114,7 +116,8 @@ main(int argc, const char **argv) + if (user == NULL) { + fprintf(stderr, _("No user name specified.\n")); + poptPrintUsage(popt, stderr, 0); +- return 1; ++ result = 1; ++ goto done; + } + if (gid_number_str != NULL) { + intmax_t val; +@@ -127,7 +130,8 @@ main(int argc, const char **argv) + fprintf(stderr, _("Invalid group ID %s\n"), + gid_number_str); + poptPrintUsage(popt, stderr, 0); +- return 1; ++ result = 1; ++ goto done; + } + gidNumber = val; + } +@@ -142,13 +146,12 @@ main(int argc, const char **argv) + fprintf(stderr, _("Invalid user ID %s\n"), + uid_number_str); + poptPrintUsage(popt, stderr, 0); +- return 1; ++ result = 1; ++ goto done; + } + uidNumber = val; + } + +- poptFreeContext(popt); +- + /* Start up the library. */ + ctx = lu_start(NULL, 0, NULL, NULL, + interactive ? lu_prompt_console : +@@ -156,20 +159,23 @@ main(int argc, const char **argv) + if (ctx == NULL) { + fprintf(stderr, _("Error initializing %s: %s.\n"), PACKAGE, + lu_strerror(error)); +- return 1; ++ result = 1; ++ goto done; + } + + /* Sanity-check arguments. */ + if (lock && unlock) { + fprintf(stderr, _("Both -L and -U specified.\n")); +- return 2; ++ result = 2; ++ goto done; + } + + /* Look up the user's record. */ + ent = lu_ent_new(); + if (lu_user_lookup_name(ctx, user, ent, &error) == FALSE) { + fprintf(stderr, _("User %s does not exist.\n"), user); +- return 3; ++ result = 3; ++ goto done; + } + + /* If the user's password needs to be changed, try to change it. */ +@@ -182,7 +188,8 @@ main(int argc, const char **argv) + lu_audit_logger(AUDIT_USER_CHAUTHTOK, + "updating-password", user, + uidNumber, 0); +- return 5; ++ result = 5; ++ goto done; + } + lu_audit_logger(AUDIT_USER_CHAUTHTOK, "updating-password", + user, uidNumber, 0); +@@ -200,7 +207,8 @@ main(int argc, const char **argv) + lu_audit_logger(AUDIT_USER_CHAUTHTOK, + "updating-password", user, + uidNumber, 0); +- return 6; ++ result = 6; ++ goto done; + } + lu_audit_logger(AUDIT_USER_CHAUTHTOK, "updating-password", + user, uidNumber, 0); +@@ -215,7 +223,8 @@ main(int argc, const char **argv) + lu_audit_logger(AUDIT_USER_CHAUTHTOK, + "locking-account", user, + uidNumber, 0); +- return 7; ++ result = 7; ++ goto done; + } + lu_audit_logger(AUDIT_USER_CHAUTHTOK, "locking-account", + user, uidNumber, 0); +@@ -228,7 +237,8 @@ main(int argc, const char **argv) + lu_audit_logger(AUDIT_USER_CHAUTHTOK, + "unlocking-account", user, + uidNumber, 0); +- return 8; ++ result = 8; ++ goto done; + } + lu_audit_logger(AUDIT_USER_CHAUTHTOK, "unlocking-account", + user, uidNumber, 0); +@@ -297,7 +307,8 @@ main(int argc, const char **argv) + lu_audit_logger(AUDIT_USER_MGMT, + "modify-account", user, + uidNumber, 0); +- return 9; ++ result = 9; ++ goto done; + } + lu_audit_logger(AUDIT_USER_MGMT, "modify-account", + user, uidNumber, 1); +@@ -373,12 +384,14 @@ main(int argc, const char **argv) + if (oldHomeDirectory == NULL) { + fprintf(stderr, _("No old home directory for %s.\n"), + user); +- return 10; ++ result = 10; ++ goto done; + } + if (homeDirectory == NULL) { + fprintf(stderr, _("No new home directory for %s.\n"), + user); +- return 11; ++ result = 11; ++ goto done; + } + if (lu_homedir_move(oldHomeDirectory, homeDirectory, + &error) == FALSE) { +@@ -387,16 +400,22 @@ main(int argc, const char **argv) + lu_strerror(error)); + lu_audit_logger(AUDIT_USER_MGMT, "moving-home-dir", + user, uidNumber, 0); +- return 12; ++ result = 12; ++ goto done; + } + lu_audit_logger(AUDIT_USER_MGMT, "moving-home-dir", + user, uidNumber, 1); + } + g_free(oldHomeDirectory); + +- lu_ent_free(ent); ++ result = 0; ++ ++ done: ++ if (ent) lu_ent_free(ent); + +- lu_end(ctx); ++ if (ctx) lu_end(ctx); ++ ++ poptFreeContext(popt); + +- return 0; ++ return result; + } diff --git a/SPECS/libuser.spec b/SPECS/libuser.spec index 68995bb..f2a98ff 100644 --- a/SPECS/libuser.spec +++ b/SPECS/libuser.spec @@ -1,9 +1,12 @@ Name: libuser Version: 0.63 -Release: 11%{?dist} +Release: 12%{?dist} License: LGPLv2+ URL: https://pagure.io/libuser Source: http://releases.pagure.org/libuser/libuser-%{version}.tar.xz +Patch0001: 0001-man-typo.patch +Patch0002: 0002-popt-memopy.patch + BuildRequires: glib2-devel BuildRequires: linuxdoc-tools BuildRequires: pam-devel @@ -60,7 +63,7 @@ the libuser library, which provides a Python 3 API for manipulating and administering user and group accounts. %prep -%setup -qn libuser-%{version} +%autosetup -n libuser-%{version} -p1 %build ./autogen.sh @@ -117,6 +120,11 @@ make %{_datadir}/gtk-doc/html/* %changelog +* Thu Nov 10 2022 Tomas Halman - 0.63-12 +- correct popt memory handling +- Fix the manpage + Resolves: rhbz#2070943 + * Fri Jul 15 2022 Tomas Halman - 0.63-11 - remove build dependency for openldap-server Resolves: rhbz#2102876