In case of rename validate the length of the new name

Check early that the new name fits MAXLOGNAME and store it in pwconf
This commit is contained in:
Baptiste Daroussin 2015-06-07 19:33:25 +00:00
parent a923718979
commit bae068d22e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=284129
6 changed files with 49 additions and 12 deletions

View File

@ -234,6 +234,11 @@ main(int argc, char *argv[])
case 'N':
conf.dryrun = true;
break;
case 'l':
if (strlen(optarg) >= MAXLOGNAME)
errx(EX_USAGE, "new name too long: %s", optarg);
conf.newname = optarg;
break;
case 'P':
conf.pretty = true;
break;

View File

@ -51,7 +51,6 @@ int
pw_group(int mode, char *name, long id, struct cargs * args)
{
int rc;
struct carg *a_newname = getarg(args, 'l');
struct carg *arg;
struct group *grp = NULL;
int grmembers = 0;
@ -133,8 +132,8 @@ pw_group(int mode, char *name, long id, struct cargs * args)
if (id > 0)
grp->gr_gid = (gid_t) id;
if (a_newname != NULL)
grp->gr_name = pw_checkname(a_newname->val, 0);
if (conf.newname != NULL)
grp->gr_name = pw_checkname(conf.newname, 0);
} else {
if (name == NULL) /* Required */
errx(EX_DATAERR, "group name required");
@ -262,8 +261,8 @@ pw_group(int mode, char *name, long id, struct cargs * args)
err(EX_IOERR, "group update");
}
if (a_newname != NULL)
name = a_newname->val;
if (conf.newname != NULL)
name = conf.newname;
/* grp may have been invalidated */
if ((grp = GETGRNAM(name)) == NULL)
errx(EX_SOFTWARE, "group disappeared during update");

View File

@ -382,10 +382,10 @@ pw_user(int mode, char *name, long id, struct cargs * args)
/*
* The rest is edit code
*/
if ((arg = getarg(args, 'l')) != NULL) {
if (conf.newname != NULL) {
if (strcmp(pwd->pw_name, "root") == 0)
errx(EX_DATAERR, "can't rename `root' account");
pwd->pw_name = pw_checkname(arg->val, 0);
pwd->pw_name = pw_checkname(conf.newname, 0);
edited = 1;
}
@ -676,8 +676,8 @@ pw_user(int mode, char *name, long id, struct cargs * args)
pwd = GETPWNAM(name);
if (pwd == NULL) {
/* This will fail when we rename, so special case that */
if (mode == M_UPDATE && (arg = getarg(args, 'l')) != NULL) {
name = arg->val; /* update new name */
if (mode == M_UPDATE && conf.newname != NULL) {
name = conf.newname; /* update new name */
pwd = GETPWNAM(name); /* refetch renamed rec */
}
}

View File

@ -83,6 +83,7 @@ struct userconf {
struct pwconf {
char rootdir[MAXPATHLEN];
char etcpath[MAXPATHLEN];
char *newname;
bool dryrun;
bool pretty;
bool v7;

View File

@ -71,10 +71,21 @@ do_not_duplicate_group_on_gid_change_body() {
atf_check -o inline:"testgroup:*:12345:\n" -s exit:0 -x grep "^testgroup" ${HOME}/group
}
atf_test_case groupmod_rename
groupmod_rename_body() {
populate_etc_skel
atf_check -s exit:0 ${PW} groupadd foo
atf_check -s exit:0 ${PW} groupmod foo -l bar
atf_check -s exit:0 -o match:"^bar:.*" \
grep "^bar:.*" ${HOME}/group
}
atf_init_test_cases() {
atf_add_test_case groupmod_user
atf_add_test_case groupmod_invalid_user
atf_add_test_case groupmod_bug_193704
atf_add_test_case usermod_bug_185666
atf_add_test_case do_not_duplicate_group_on_gid_change
atf_add_test_case groupmod_rename
}

View File

@ -100,13 +100,34 @@ user_mod_name_noupdate_body() {
grep "^foo:.*" $HOME/master.passwd
}
atf_test_case user_mod_rename
user_mod_rename_body() {
populate_etc_skel
atf_check -s exit:0 ${PW} useradd foo
atf_check -s exit:0 ${PW} usermod foo -l bar
atf_check -s exit:0 -o match:"^bar:.*" \
grep "^bar:.*" ${HOME}/master.passwd
}
atf_test_case user_mod_rename_too_long
user_mod_rename_too_long_body() {
populate_etc_skel
atf_check -s exit:0 ${PW} useradd foo
atf_check -s exit:64 -e match:"too long" ${PW} usermod foo \
-l name_very_very_very_very_very_long
}
atf_init_test_cases() {
atf_add_test_case user_mod
atf_add_test_case user_mod_noupdate
atf_add_test_case user_mod_comments
atf_add_test_case user_mod_comments_noupdate
atf_add_test_case user_mod_comments_invalid
atf_add_test_case user_mod_comments_invalid_noupdate
atf_add_test_case user_mod_name
atf_add_test_case user_mod_comments_invalid
atf_add_test_case user_mod_comments_invalid_noupdate
atf_add_test_case user_mod_rename
atf_add_test_case user_mod_name_noupdate
atf_add_test_case user_mod_rename
atf_add_test_case user_mod_rename_too_long
}