diff options
-rw-r--r-- | coreutils/Kbuild | 1 | ||||
-rw-r--r-- | libbb/die_if_bad_username.c | 12 | ||||
-rw-r--r-- | loginutils/adduser.c | 18 |
3 files changed, 25 insertions, 6 deletions
diff --git a/coreutils/Kbuild b/coreutils/Kbuild index 4d6bde7b9..460d62d3f 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 c1641d376..8b4deec29 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 da41fd7ac..f5dca929f 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; } |