adduser/addgroup: check username for invalid chars
authorDenis Vlasenko <vda.linux@googlemail.com>
Wed, 19 Mar 2008 23:15:26 +0000 (23:15 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Wed, 19 Mar 2008 23:15:26 +0000 (23:15 -0000)
(by Tito <farmatito AT tiscali.it>). +129 bytes when enabled.

include/libbb.h
libbb/Kbuild
loginutils/Config.in
loginutils/addgroup.c
loginutils/adduser.c

index d059ac9de92ea7ec058a66c5327a29c50443804f..19b3bba5feba11f2ac6c748a0d5a6e18d7341218 100644 (file)
@@ -637,7 +637,11 @@ const char* get_cached_groupname(gid_t gid);
 void clear_username_cache(void);
 /* internally usernames are saved in fixed-sized char[] buffers */
 enum { USERNAME_MAX_SIZE = 16 - sizeof(int) };
-
+#if ENABLE_FEATURE_CHECK_NAMES
+void die_if_bad_username(const char* name);
+#else
+#define die_if_bad_username(name) ((void)(name))
+#endif
 
 int execable_file(const char *name);
 char *find_execable(const char *filename);
index 654722cd60a7eb8542a861f58e48c5d760db84c7..5740d9247595b15f1c12f0830bc9eaf4d27b849f 100644 (file)
@@ -122,6 +122,7 @@ lib-$(CONFIG_MKFS_MINIX) += find_mount_point.o
 lib-$(CONFIG_SELINUX) += selinux_common.o
 lib-$(CONFIG_HWCLOCK) += rtc.o
 lib-$(CONFIG_RTCWAKE) += rtc.o
+lib-$(CONFIG_FEATURE_CHECK_NAMES) += die_if_bad_username.o
 
 # We shouldn't build xregcomp.c if we don't need it - this ensures we don't
 # require regex.h to be in the include dir even if we don't need it thereby
index 81d05ef894066c3f23f0c66737079c5de38a5cee..c57d9976edcdcdda05ef7d3061a9858158e916ff 100644 (file)
@@ -82,6 +82,18 @@ config FEATURE_DEL_USER_FROM_GROUP
          If called with two non-option arguments, deluser
          or delgroup will remove an user from a specified group.
 
+config FEATURE_CHECK_NAMES
+       bool "Enable sanity check on user/group names in adduser and addgroup"
+       default n
+       depends on ADDUSER || ADDGROUP
+       help
+         Enable sanity check on user and group names in adduser and addgroup.
+         To avoid problems, the user or group name should consist only of
+         letters, digits, underscores, periods, at signs and dashes,
+         and not start with a dash (as defined by IEEE Std 1003.1-2001).
+         For compatibility with Samba machine accounts "$" is also supported
+         at the end of the user or group name.
+
 config ADDUSER
        bool "adduser"
        default n
index b25f8171df7416f2baacf03052b5aa7740b0644d..367c6b9f0412e4d966094c1b1ca4f476674ce4a6 100644 (file)
@@ -173,8 +173,11 @@ int addgroup_main(int argc ATTRIBUTE_UNUSED, char **argv)
 #endif
        } else
 #endif /* ENABLE_FEATURE_ADDUSER_TO_GROUP */
+       {
+               die_if_bad_username(argv[0]);
                new_group(argv[0], gid);
 
+       }
        /* Reached only on success */
        return EXIT_SUCCESS;
 }
index d409eabb9427f0d121e9dd6cec4bf3cc2b8a7820..cd68015d145c4330ac9f6f02368c8f92405f6294 100644 (file)
@@ -111,6 +111,7 @@ int adduser_main(int argc ATTRIBUTE_UNUSED, char **argv)
 
        /* fill in the passwd struct */
        pw.pw_name = argv[0];
+       die_if_bad_username(pw.pw_name);
        if (!pw.pw_dir) {
                /* create string for $HOME if not specified already */
                pw.pw_dir = xasprintf("/home/%s", argv[0]);