summaryrefslogtreecommitdiff
path: root/usermod-unlock.patch
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-10-12 11:50:23 +0000
committerCoprDistGit <infra@openeuler.org>2023-10-12 11:50:23 +0000
commita39ad350cc564b3b46e6f75e2f9d1f26f646861e (patch)
tree2c862b9103baa1192a30703077647caeac8d638c /usermod-unlock.patch
parent9db7dc8abcf40be92578f61ae05c86ba78c65866 (diff)
automatic import of shadowopeneuler22.03_LTS
Diffstat (limited to 'usermod-unlock.patch')
-rw-r--r--usermod-unlock.patch65
1 files changed, 65 insertions, 0 deletions
diff --git a/usermod-unlock.patch b/usermod-unlock.patch
new file mode 100644
index 0000000..ff9602d
--- /dev/null
+++ b/usermod-unlock.patch
@@ -0,0 +1,65 @@
+Index: shadow-4.5/src/usermod.c
+===================================================================
+--- a/src/usermod.c
++++ b/src/usermod.c
+@@ -466,14 +466,17 @@ static char *new_pw_passwd (char *pw_pass)
+ strcat (buf, pw_pass);
+ pw_pass = buf;
+ } else if (Uflg && pw_pass[0] == '!') {
+- char *s;
++ char *s = pw_pass;
+
+- if (pw_pass[1] == '\0') {
++ while ('!' == *s)
++ ++s;
++
++ if (*s == '\0') {
+ fprintf (stderr,
+ _("%s: unlocking the user's password would result in a passwordless account.\n"
+ "You should set a password with usermod -p to unlock this user's password.\n"),
+ Prog);
+- return pw_pass;
++ return NULL;
+ }
+
+ #ifdef WITH_AUDIT
+@@ -482,12 +485,15 @@ static char *new_pw_passwd (char *pw_pass)
+ user_newname, (unsigned int) user_newid, 0);
+ #endif
+ SYSLOG ((LOG_INFO, "unlock user '%s' password", user_newname));
+- s = pw_pass;
+- while ('\0' != *s) {
+- *s = *(s + 1);
+- s++;
+- }
++ memmove (pw_pass, s, strlen (s) + 1);
+ } else if (pflg) {
++ if (strchr (user_pass, ':') != NULL) {
++ fprintf (stderr,
++ _("%s: The password field cannot contain a colon character.\n"),
++ Prog);
++ return NULL;
++
++ }
+ #ifdef WITH_AUDIT
+ audit_logger (AUDIT_USER_CHAUTHTOK, Prog,
+ "changing password",
+@@ -536,6 +542,8 @@ static void new_pwent (struct passwd *pwent)
+ if ( (!is_shadow_pwd)
+ || (strcmp (pwent->pw_passwd, SHADOW_PASSWD_STRING) != 0)) {
+ pwent->pw_passwd = new_pw_passwd (pwent->pw_passwd);
++ if (pwent->pw_passwd == NULL)
++ fail_exit (E_PW_UPDATE);
+ }
+
+ if (uflg) {
+@@ -650,6 +658,8 @@ static void new_spent (struct spwd *spent)
+ * + aging has been requested
+ */
+ spent->sp_pwdp = new_pw_passwd (spent->sp_pwdp);
++ if (spent->sp_pwdp == NULL)
++ fail_exit(E_PW_UPDATE);
+
+ if (pflg) {
+ spent->sp_lstchg = (long) gettime () / SCALE;
+