adduser: copy /etc/skel to mew homes. +100 bytes
No binary (build failed)
—
(log yok)
| @@ -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 | |
| @@ -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; | |
| } | |
| @@ -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; |
| } | |