Sophie

Sophie

distrib > Mandriva > 2007.0 > x86_64 > media > main-release-src > by-pkgid > f01202932fbd367fcf86f895d058ab36 > files > 6

shadow-utils-4.0.12-3mdv2007.0.src.rpm

--- shadow-4.0.12/libmisc/chkname.c.orig	2005-06-14 17:27:35.000000000 -0300
+++ shadow-4.0.12/libmisc/chkname.c	2006-06-08 17:24:54.000000000 -0300
@@ -18,16 +18,24 @@
 static int good_name (const char *name)
 {
 	/*
-	 * User/group names must match [a-z_][a-z0-9_-]*
+	 * User/group names must match gnu e-regex:
+	 * [a-zA-Z0-9_.][a-zA-Z0-9_.-]{0,30}[a-zA-Z0-9_.$-]?
+	 *
+	 * as a non-POSIX, extension, allow "$" as the last char for
+	 * sake of Samba 3.x "add machine script"
 	 */
-	if (!*name || !((*name >= 'a' && *name <= 'z') || *name == '_'))
+        if (!*name || !((*name >= 'a' && *name <= 'z')
+                     || (*name >= 'A' && *name <= 'Z')
+                     || (*name >= '0' && *name <= '9')
+                     ||  *name == '_' || *name == '.'))
 		return 0;
 
 	while (*++name) {
-		if (!((*name >= 'a' && *name <= 'z') ||
-		      (*name >= '0' && *name <= '9') ||
-		      *name == '_' || *name == '-' ||
-		      (*name == '$' && *(name + 1) == '\0')))
+                if (!(  (*name >= 'a' && *name <= 'z')
+                     || (*name >= 'A' && *name <= 'Z')
+                     || (*name >= '0' && *name <= '9')
+                     ||  *name == '_' || *name == '.' || *name == '-'
+                     || (*name == '$' && *(name + 1) == '\0')))
 			return 0;
 	}
 
@@ -43,10 +51,9 @@
 #endif
 
 	/*
-	 * User names are limited by whatever utmp can
-	 * handle (usually max 8 characters).
+	 * User names are limited by whatever utmp can handle.
 	 */
-	if (strlen (name) > sizeof (ut.ut_user))
+	if (strlen(name) + 1 > sizeof(ut.ut_user))
 		return 0;
 
 	return good_name (name);
@@ -54,11 +61,13 @@
 
 int check_group_name (const char *name)
 {
-	/*
-	 * Arbitrary limit for group names - max 16
-	 * characters (same as on HP-UX 10).
-	 */
-	if (strlen (name) > 16)
+#if HAVE_UTMPX_H
+	struct utmpx ut;
+#else
+	struct utmp ut;
+#endif
+
+	if (strlen(name) + 1 > sizeof(ut.ut_user))
 		return 0;
 
 	return good_name (name);