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