diff options
-rw-r--r-- | loginutils/Config.src | 11 | ||||
-rw-r--r-- | loginutils/addgroup.c | 13 | ||||
-rw-r--r-- | loginutils/adduser.c | 24 |
3 files changed, 27 insertions, 21 deletions
diff --git a/loginutils/Config.src b/loginutils/Config.src index 9bf79afee..b78d7c38e 100644 --- a/loginutils/Config.src +++ b/loginutils/Config.src @@ -118,10 +118,17 @@ config FEATURE_CHECK_NAMES For compatibility with Samba machine accounts "$" is also supported at the end of the user or group name. +config LAST_ID + int "Last valid uid or gid for adduser and addgroup" + depends on ADDUSER || ADDGROUP + default 60000 + help + Last valid uid or gid for adduser and addgroup + config FIRST_SYSTEM_ID int "First valid system uid or gid for adduser and addgroup" depends on ADDUSER || ADDGROUP - range 0 64900 + range 0 LAST_ID default 100 help First valid system uid or gid for adduser and addgroup @@ -129,7 +136,7 @@ config FIRST_SYSTEM_ID config LAST_SYSTEM_ID int "Last valid system uid or gid for adduser and addgroup" depends on ADDUSER || ADDGROUP - range 0 64900 + range FIRST_SYSTEM_ID LAST_ID default 999 help Last valid system uid or gid for adduser and addgroup diff --git a/loginutils/addgroup.c b/loginutils/addgroup.c index b37270ff0..22cd0e661 100644 --- a/loginutils/addgroup.c +++ b/loginutils/addgroup.c @@ -22,14 +22,16 @@ #if CONFIG_LAST_SYSTEM_ID < CONFIG_FIRST_SYSTEM_ID #error Bad LAST_SYSTEM_ID or FIRST_SYSTEM_ID in .config #endif +#if CONFIG_LAST_ID < CONFIG_LAST_SYSTEM_ID +#error Bad LAST_ID or LAST_SYSTEM_ID in .config +#endif #define OPT_GID (1 << 0) #define OPT_SYSTEM_ACCOUNT (1 << 1) -/* We assume GID_T_MAX == INT_MAX */ static void xgroup_study(struct group *g) { - unsigned max = INT_MAX; + unsigned max = CONFIG_LAST_ID; /* Make sure gr_name is unused */ if (getgrnam(g->gr_name)) { @@ -46,7 +48,6 @@ static void xgroup_study(struct group *g) max = CONFIG_LAST_SYSTEM_ID; } else { g->gr_gid = CONFIG_LAST_SYSTEM_ID + 1; - max = 64999; } } /* Check if the desired gid is free @@ -125,7 +126,7 @@ int addgroup_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int addgroup_main(int argc UNUSED_PARAM, char **argv) { unsigned opts; - unsigned gid = 0; + const char *gid = "0"; /* need to be root */ if (geteuid()) { @@ -139,7 +140,7 @@ int addgroup_main(int argc UNUSED_PARAM, char **argv) * addgroup -g num group * addgroup user group * Check for min, max and missing args */ - opt_complementary = "-1:?2:g+"; + opt_complementary = "-1:?2"; opts = getopt32(argv, "g:S", &gid); /* move past the commandline options */ argv += optind; @@ -175,7 +176,7 @@ int addgroup_main(int argc UNUSED_PARAM, char **argv) #endif /* ENABLE_FEATURE_ADDUSER_TO_GROUP */ { die_if_bad_username(argv[0]); - new_group(argv[0], gid); + new_group(argv[0], xatou_range(gid, 0, CONFIG_LAST_ID)); } /* Reached only on success */ return EXIT_SUCCESS; diff --git a/loginutils/adduser.c b/loginutils/adduser.c index ef390adf8..568a3018e 100644 --- a/loginutils/adduser.c +++ b/loginutils/adduser.c @@ -26,6 +26,10 @@ #if CONFIG_LAST_SYSTEM_ID < CONFIG_FIRST_SYSTEM_ID #error Bad LAST_SYSTEM_ID or FIRST_SYSTEM_ID in .config #endif +#if CONFIG_LAST_ID < CONFIG_LAST_SYSTEM_ID +#error Bad LAST_ID or LAST_SYSTEM_ID in .config +#endif + /* #define OPT_HOME (1 << 0) */ /* unused */ /* #define OPT_GECOS (1 << 1) */ /* unused */ @@ -36,12 +40,11 @@ #define OPT_DONT_MAKE_HOME (1 << 6) #define OPT_UID (1 << 7) -/* We assume UID_T_MAX == INT_MAX */ /* remix */ /* recoded such that the uid may be passed in *p */ static void passwd_study(struct passwd *p) { - int max = UINT_MAX; + int max = CONFIG_LAST_ID; if (getpwnam(p->pw_name)) { bb_error_msg_and_die("%s '%s' in use", "user", p->pw_name); @@ -54,7 +57,6 @@ static void passwd_study(struct passwd *p) max = CONFIG_LAST_SYSTEM_ID; } else { p->pw_uid = CONFIG_LAST_SYSTEM_ID + 1; - max = 64999; } } /* check for a free uid (and maybe gid) */ @@ -147,6 +149,7 @@ int adduser_main(int argc UNUSED_PARAM, char **argv) const char *usegroup = NULL; char *p; unsigned opts; + char *uid; #if ENABLE_FEATURE_ADDUSER_LONG_OPTIONS applet_long_options = adduser_longopts; @@ -164,16 +167,11 @@ int adduser_main(int argc UNUSED_PARAM, char **argv) /* at least one and at most two non-option args */ /* disable interactive passwd for system accounts */ - opt_complementary = "-1:?2:SD:u+"; - if (sizeof(pw.pw_uid) == sizeof(int)) { - opts = getopt32(argv, "h:g:s:G:DSHu:", &pw.pw_dir, &pw.pw_gecos, &pw.pw_shell, &usegroup, &pw.pw_uid); - } else { - unsigned uid; - opts = getopt32(argv, "h:g:s:G:DSHu:", &pw.pw_dir, &pw.pw_gecos, &pw.pw_shell, &usegroup, &uid); - if (opts & OPT_UID) { - pw.pw_uid = uid; - } - } + opt_complementary = "-1:?2:SD"; + opts = getopt32(argv, "h:g:s:G:DSHu:", &pw.pw_dir, &pw.pw_gecos, &pw.pw_shell, &usegroup, &uid); + if (opts & OPT_UID) + pw.pw_uid = xatou_range(uid, 0, CONFIG_LAST_ID); + argv += optind; pw.pw_name = argv[0]; |