]> granicus.if.org Git - shadow/commitdiff
* src/usermod.c: get_number() replaced by getlong().
authornekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Sun, 15 Mar 2009 21:34:20 +0000 (21:34 +0000)
committernekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Sun, 15 Mar 2009 21:34:20 +0000 (21:34 +0000)
* src/usermod.c: When the user is renamed, make sure we do not
override an user with the same name (in passwd or shadow).

ChangeLog
src/usermod.c

index 8a5139c0a778a6916a322d482947f82866180561..b92e039f4aee1d73fbb07f6113b5dfa45de5c254 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2009-03-15  Nicolas François  <nicolas.francois@centraliens.net>
+
+       * src/usermod.c: get_number() replaced by getlong().
+       * src/usermod.c: When the user is renamed, make sure we do not
+       override an user with the same name (in passwd or shadow).
+
 2009-03-15  Nicolas François  <nicolas.francois@centraliens.net>
 
        * src/gpasswd.c: log_gpasswd_success_gshadow is in the cleanup
index e8d329f4ce8f2561bde9ed8b03f231824d3adafe..0162a95e80ee6ac1ee767cc506808ed96e8a1112 100644 (file)
@@ -153,7 +153,6 @@ static void update_gshadow (void);
 #endif
 static void grp_update (void);
 
-static long get_number (const char *);
 static void process_flags (int, char **);
 static void close_files (void);
 static void open_files (void);
@@ -400,6 +399,12 @@ static char *new_pw_passwd (char *pw_pass)
 static void new_pwent (struct passwd *pwent)
 {
        if (lflg) {
+               if (pw_locate (user_newname) != NULL) {
+                       fprintf (stderr,
+                                _("%s: user '%s' already exists in %s\n"),
+                                Prog, user_newname, pw_dbname ());
+                       fail_exit (E_NAME_IN_USE);
+               }
 #ifdef WITH_AUDIT
                audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
                              "changing name",
@@ -410,8 +415,7 @@ static void new_pwent (struct passwd *pwent)
                pwent->pw_name = xstrdup (user_newname);
        }
        if (!is_shadow_pwd) {
-               pwent->pw_passwd =
-                   new_pw_passwd (pwent->pw_passwd);
+               pwent->pw_passwd = new_pw_passwd (pwent->pw_passwd);
        }
 
        if (uflg) {
@@ -477,6 +481,12 @@ static void new_pwent (struct passwd *pwent)
 static void new_spent (struct spwd *spent)
 {
        if (lflg) {
+               if (spw_locate (user_newname) != NULL) {
+                       fprintf (stderr,
+                                _("%s: user '%s' already exists in %s\n"),
+                                Prog, user_newname, spw_dbname ());
+                       fail_exit (E_NAME_IN_USE);
+               }
                spent->sp_namp = xstrdup (user_newname);
        }
 
@@ -784,20 +794,6 @@ static void grp_update (void)
 #endif
 }
 
-static long get_number (const char *numstr)
-{
-       long val;
-       char *endptr;
-
-       val = strtol (numstr, &endptr, 10);
-       if (('\0' != *endptr) || (ERANGE == errno)) {
-               fprintf (stderr, _("%s: invalid numeric argument '%s'\n"), Prog,
-                        numstr);
-               exit (E_BAD_ARG);
-       }
-       return val;
-}
-
 /*
  * process_flags - perform command line argument setting
  *
@@ -938,7 +934,12 @@ static void process_flags (int argc, char **argv)
                                eflg = true;
                                break;
                        case 'f':
-                               user_newinactive = get_number (optarg);
+                               if (getlong (optarg, &user_newinactive) == 0) {
+                                       fprintf (stderr,
+                                                _("%s: invalid numeric argument '%s'\n"),
+                                                Prog, optarg);
+                                       usage ();
+                               }
                                fflg = true;
                                break;
                        case 'g':