[git commit master] adduser: copy /etc/skel to mew homes. +100 bytes

Denys Vlasenko vda.linux at googlemail.com
Sat Feb 6 20:50:59 UTC 2010


commit: http://git.busybox.net/busybox/commit/?id=cb7edc26611f8df6b81ef4337206d5833ea98771
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 coreutils/Kbuild            |    1 +
 libbb/die_if_bad_username.c |   12 ++++++++----
 loginutils/adduser.c        |   18 ++++++++++++++++--
 3 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/coreutils/Kbuild b/coreutils/Kbuild
index 4d6bde7..460d62d 100644
--- a/coreutils/Kbuild
+++ b/coreutils/Kbuild
@@ -17,6 +17,7 @@ lib-$(CONFIG_CATV)      += catv.o
 lib-$(CONFIG_CHGRP)     += chgrp.o chown.o
 lib-$(CONFIG_CHMOD)     += chmod.o
 lib-$(CONFIG_CHOWN)     += chown.o
+lib-$(CONFIG_ADDGROUP)  += chown.o # used by adduser
 lib-$(CONFIG_CHROOT)    += chroot.o
 lib-$(CONFIG_CKSUM)     += cksum.o
 lib-$(CONFIG_COMM)      += comm.o
diff --git a/libbb/die_if_bad_username.c b/libbb/die_if_bad_username.c
index c1641d3..8b4deec 100644
--- a/libbb/die_if_bad_username.c
+++ b/libbb/die_if_bad_username.c
@@ -18,16 +18,20 @@
 
 void FAST_FUNC die_if_bad_username(const char *name)
 {
-	goto skip; /* 1st char being dash isn't valid */
+	/* 1st char being dash or dot isn't valid: */
+	goto skip;
+	/* For example, name like ".." can make adduser
+	 * chown "/home/.." recursively - NOT GOOD
+	 */
+
 	do {
-		if (*name == '-')
+		if (*name == '-' || *name == '.')
 			continue;
  skip:
 		if (isalnum(*name)
 		 || *name == '_'
-		 || *name == '.'
 		 || *name == '@'
-		 || (*name == '$' && !*(name + 1))
+		 || (*name == '$' && !name[1])
 		) {
 			continue;
 		}
diff --git a/loginutils/adduser.c b/loginutils/adduser.c
index da41fd7..f5dca92 100644
--- a/loginutils/adduser.c
+++ b/loginutils/adduser.c
@@ -199,7 +199,21 @@ int adduser_main(int argc UNUSED_PARAM, char **argv)
 		/* set the owner and group so it is owned by the new user,
 		 * then fix up the permissions to 2755. Can't do it before
 		 * since chown will clear the setgid bit */
-		if ((mkdir(pw.pw_dir, 0755) != 0 && errno != EEXIST)
+		int mkdir_err = mkdir(pw.pw_dir, 0755);
+		if (mkdir_err == 0) {
+			/* New home. Copy /etc/skel to it */
+			const char *args[] = {
+				"chown", "-R",
+				xasprintf("%u:%u", (int)pw.pw_uid, (int)pw.pw_gid),
+				pw.pw_dir, NULL
+			};
+			/* Be silent on any errors (like: no /etc/skel) */
+			logmode = LOGMODE_NONE;
+			copy_file("/etc/skel", pw.pw_dir, FILEUTILS_RECUR);
+			logmode = LOGMODE_STDIO;
+			chown_main(4, (char**)args);
+		}
+		if ((mkdir_err != 0 && errno != EEXIST)
 		 || chown(pw.pw_dir, pw.pw_uid, pw.pw_gid) != 0
 		 || chmod(pw.pw_dir, 02755) != 0 /* set setgid bit on homedir */
 		) {
@@ -212,5 +226,5 @@ int adduser_main(int argc UNUSED_PARAM, char **argv)
 		passwd_wrapper(pw.pw_name);
 	}
 
-	return 0;
+	return EXIT_SUCCESS;
 }
-- 
1.6.3.3



More information about the busybox-cvs mailing list