shadow-utils/shadow-4.0.18.1-findNewUidOnce.patch

114 lines
3.2 KiB
Diff

--- shadow-4.0.18.1/src/useradd.c.findNewUidOnce 2007-05-16 13:16:51.000000000 +0200
+++ shadow-4.0.18.1/src/useradd.c 2007-05-16 14:12:52.000000000 +0200
@@ -847,8 +847,9 @@
* find_new_uid - find the next available UID
*
* find_new_uid() locates the next highest unused UID in the password
- * file, or checks the given user ID against the existing ones for
- * uniqueness.
+ * file.
+ * It doesn't make sense to use find_new_uid(), if UID is specified
+ * via "-u" option.
*/
static void find_new_uid (void)
{
@@ -867,12 +868,7 @@
memset (index, 0, sizeof (char) * uid_max + 1);
}
- /*
- * Start with some UID value if the user didn't provide us with
- * one already.
- */
- if (!uflg)
- user_id = uid_min;
+ user_id = uid_min;
/*
* Search the entire password file, either looking for this
@@ -886,42 +882,24 @@
setpwent ();
while ((pwd = getpwent ())) {
#endif
- if (strcmp (user_name, pwd->pw_name) == 0) {
- fprintf (stderr, _("%s: name %s is not unique\n"),
- Prog, user_name);
-#ifdef WITH_AUDIT
- audit_logger (AUDIT_USER_CHAUTHTOK, Prog, "adding user",
- user_name, user_id, 0);
-#endif
- exit (E_NAME_IN_USE);
- }
- if (!oflg && uflg && user_id == pwd->pw_uid) {
- fprintf (stderr, _("%s: UID %u is not unique\n"),
- Prog, (unsigned int) user_id);
-#ifdef WITH_AUDIT
- audit_logger (AUDIT_USER_CHAUTHTOK, Prog, "adding user",
- user_name, user_id, 0);
-#endif
- exit (E_UID_IN_USE);
- }
- if (!uflg && !rflg && pwd->pw_uid >= user_id) {
+ if (!rflg && pwd->pw_uid >= user_id) {
if (pwd->pw_uid > uid_max)
continue;
user_id = pwd->pw_uid + 1;
}
/* create index of occupied system accounts UIDs */
- if (!uflg && rflg && (pwd->pw_uid <= uid_max))
+ if (rflg && (pwd->pw_uid <= uid_max))
index[pwd->pw_uid] = 1;
}
/* find free system account */
- if(!uflg && rflg) {
+ if(rflg) {
for( user_id = uid_max; (user_id >= uid_min) && index[user_id]; user_id--);
if ( user_id < uid_min ) {
fprintf (stderr, _("%s: can't get unique UID\n"), Prog);
fail_exit (E_UID_IN_USE);
- }
+ }
}
/*
@@ -930,7 +908,7 @@
* free UID starting with UID_MIN (it's O(n*n) but can be avoided
* by not having users with UID equal to UID_MAX). --marekm
*/
- if (!uflg && user_id == uid_max + 1) {
+ if (user_id == uid_max + 1) {
for (user_id = uid_min; user_id < uid_max; user_id++) {
#ifdef NO_GETPWENT
pw_rewind ();
@@ -1590,9 +1568,6 @@
struct passwd pwent;
struct spwd spent;
- if (!oflg)
- find_new_uid ();
-
/*
* Fill in the password structure with any new fields, making
* copies of strings.
@@ -1911,7 +1886,17 @@
/* first, seek for a valid uid to use for this user.
* We do this because later we can use the uid we found as
* gid too ... --gafton */
- find_new_uid ();
+ if (!uflg)
+ find_new_uid ();
+ else {
+ if (getpwuid (user_id)) {
+ fprintf (stderr, _("%s: UID %u is not unique\n"), Prog, (unsigned int) user_id);
+#ifdef WITH_AUDIT
+ audit_logger (AUDIT_USER_CHAUTHTOK, Prog, "adding user", user_name, user_id, 0);
+#endif
+ exit (E_UID_IN_USE);
+ }
+ }
}
/* do we have to add a group for that user? This is why we need to