diff --git a/ChangeLog b/ChangeLog index 748c4230..68a25ba2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2009-04-11 Peter Vrabec + + * libmisc/find_new_gid.c, libmisc/find_new_uid.c: For system + accounts, return the first unused ID, starting from the max value. + This could be useful later to increase the static IDs range. + 2009-04-11 Peter Vrabec * NEWS, src/useradd.c, man/useradd.8.xml: add -Z option to map diff --git a/NEWS b/NEWS index 71ccdf56..9351f563 100644 --- a/NEWS +++ b/NEWS @@ -56,6 +56,8 @@ shadow-4.1.2.2 -> shadow-4.1.3 UNRELEASED * error handling improvement (see above). * Speedup (see "addition of users or groups" above). * do not create groups with GID set to (gid_t)-1. + * Allocate system group GIDs in reverse order. This could be useful + later to increase the static IDs range. - groupdel * audit logging improvements. * error handling improvement (see above). @@ -82,6 +84,8 @@ shadow-4.1.2.2 -> shadow-4.1.3 UNRELEASED * Speedup (see "addition of users or groups" above). * do not create users with UID set to (gid_t)-1. * do not create groups with GID set to (gid_t)-1. + * Allocate system account UIDs/GIDs in reverse order. This could be useful + later to increase the static IDs range. - passwd * For compatibility with other passwd version, the --lock an --unlock options do not lock or unlock the user account anymore. They only @@ -98,6 +102,8 @@ shadow-4.1.2.2 -> shadow-4.1.3 UNRELEASED * New -M/--no-create-home option to disable CREATE_HOME. * do not create users with UID set to (gid_t)-1. * Added -Z option to map SELinux user for user's login. + * Allocate system user UIDs in reverse order. This could be useful + later to increase the static IDs range. - userdel * audit logging improvements. * Do not fail if the removed user is not in the shadow database. diff --git a/libmisc/find_new_gid.c b/libmisc/find_new_gid.c index e7a072b0..d429c018 100644 --- a/libmisc/find_new_gid.c +++ b/libmisc/find_new_gid.c @@ -110,6 +110,23 @@ int find_new_gid (bool sys_group, gid_t *gid, gid_t const *preferred_gid) } } + /* find free system account in reverse order */ + if (sys_group) { + for (group_id = gid_max; group_id >= gid_min; group_id--) { + if (0 == used_gids[group_id]) { + break; + } + } + if ( group_id < gid_min ) { + fprintf (stderr, + _("%s: Can't get unique GID (no more available GIDs)\n"), + Prog); + SYSLOG ((LOG_WARN, + "no more available GID on the system")); + return -1; + } + } + /* * If a group with GID equal to GID_MAX exists, the above algorithm * will give us GID_MAX+1 even if not unique. Search for the first diff --git a/libmisc/find_new_uid.c b/libmisc/find_new_uid.c index f00b3e12..784b1bb0 100644 --- a/libmisc/find_new_uid.c +++ b/libmisc/find_new_uid.c @@ -111,6 +111,23 @@ int find_new_uid (bool sys_user, uid_t *uid, uid_t const *preferred_uid) } } + /* find free system account in reverse order */ + if (sys_user) { + for (user_id = uid_max; user_id >= uid_min; user_id--) { + if (0 == used_uids[user_id]) { + break; + } + } + if (user_id < uid_min ) { + fprintf (stderr, + _("%s: Can't get unique system UID (no more available UIDs)\n"), + Prog); + SYSLOG ((LOG_WARN, + "no more available UID on the system")); + return -1; + } + } + /* * If a user with UID equal to UID_MAX exists, the above algorithm * will give us UID_MAX+1 even if not unique. Search for the first