aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--loginutils/Config.src11
-rw-r--r--loginutils/addgroup.c13
-rw-r--r--loginutils/adduser.c24
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];