tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

fix for PR 56138



Hello,

Here is a fix for PR 56138, in which it is observed that chpass(1) and friends should not allow breaking the passwd databases by editing the username.

The problem:
--
# grep 1005 /etc/passwd
testuser:*:1005:0:,,,:/home/testuser:/bin/sh

# chpass testuser

# grep 1005 /etc/passwd
testuser:*:1005:0:,,,:/home/testuser:/bin/sh
newuser:*:1005:0:,,,:/home/testuser:/bin/sh
--


A fix, which is also attached as "cvs.diff":
--
Index: field.c
===================================================================
RCS file: /cvsroot/src/usr.bin/chpass/field.c,v
retrieving revision 1.12
diff -u -r1.12 field.c
--- field.c    11 Apr 2009 12:10:02 -0000    1.12
+++ field.c    29 Jul 2024 13:32:56 -0000
@@ -33,7 +33,7 @@
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)field.c    8.4 (Berkeley) 4/2/94";
-#else
+#else
 __RCSID("$NetBSD: field.c,v 1.12 2009/04/11 12:10:02 lukem Exp $");
 #endif
 #endif /* not lint */
@@ -57,26 +57,11 @@
 int
 p_login(const char *p, struct passwd *pw, ENTRY *ep)
 {
-
-    if (!*p) {
-        warnx("empty login field");
-        return (1);
-    }
-    if (*p == '-') {
-        warnx("login names may not begin with a hyphen");
-        return (1);
-    }
-    if (!(pw->pw_name = strdup(p))) {
-        warnx("can't save entry");
+    if (strcmp(p, pw->pw_name) != 0) {
+        warnx("you may not change the %s field", ep->prompt);
         return (1);
     }
-    if (strchr(p, '.'))
-        warnx("\'.\' is dangerous in a login name");
-    for (; *p; ++p)
-        if (isupper((unsigned char)*p)) {
-            warnx("upper-case letters are dangerous in a login name");
-            break;
-        }
+
     return (0);
 }

@@ -89,7 +74,7 @@
         warnx("can't save password entry");
         return (1);
     }
-
+
     return (0);
 }

@@ -145,7 +130,7 @@
     errno = 0;
     id = strtoul(p, &np, 10);
     /*
-     * We don't need to check the return value of strtoul()
+     * We don't need to check the return value of strtoul()
      * since ULONG_MAX is greater than GID_MAX.
      */
     if (*np || id > GID_MAX) {
@@ -165,7 +150,7 @@
         warnx("can't save entry");
         return (1);
     }
-
+
     return (0);
 }

--

Some trailing spaces were caught in the crossfire.

Testing the fix:
--
# /usr/src/usr.bin/chpass/chpass testuser
chpass: you may not change the login field
re-edit the password file? [y]:
--

Thanks.
J
Index: field.c
===================================================================
RCS file: /cvsroot/src/usr.bin/chpass/field.c,v
retrieving revision 1.12
diff -u -r1.12 field.c
--- field.c	11 Apr 2009 12:10:02 -0000	1.12
+++ field.c	29 Jul 2024 13:32:56 -0000
@@ -33,7 +33,7 @@
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)field.c	8.4 (Berkeley) 4/2/94";
-#else 
+#else
 __RCSID("$NetBSD: field.c,v 1.12 2009/04/11 12:10:02 lukem Exp $");
 #endif
 #endif /* not lint */
@@ -57,26 +57,11 @@
 int
 p_login(const char *p, struct passwd *pw, ENTRY *ep)
 {
-
-	if (!*p) {
-		warnx("empty login field");
-		return (1);
-	}
-	if (*p == '-') {
-		warnx("login names may not begin with a hyphen");
-		return (1);
-	}
-	if (!(pw->pw_name = strdup(p))) {
-		warnx("can't save entry");
+	if (strcmp(p, pw->pw_name) != 0) {
+		warnx("you may not change the %s field", ep->prompt);
 		return (1);
 	}
-	if (strchr(p, '.'))
-		warnx("\'.\' is dangerous in a login name");
-	for (; *p; ++p)
-		if (isupper((unsigned char)*p)) {
-			warnx("upper-case letters are dangerous in a login name");
-			break;
-		}
+
 	return (0);
 }
 
@@ -89,7 +74,7 @@
 		warnx("can't save password entry");
 		return (1);
 	}
-	
+
 	return (0);
 }
 
@@ -145,7 +130,7 @@
 	errno = 0;
 	id = strtoul(p, &np, 10);
 	/*
-	 * We don't need to check the return value of strtoul() 
+	 * We don't need to check the return value of strtoul()
 	 * since ULONG_MAX is greater than GID_MAX.
 	 */
 	if (*np || id > GID_MAX) {
@@ -165,7 +150,7 @@
 		warnx("can't save entry");
 		return (1);
 	}
-	
+
 	return (0);
 }
 


Home | Main Index | Thread Index | Old Index