svn commit: r284129 - in head/usr.sbin/pw: . tests
Baptiste Daroussin
bapt at FreeBSD.org
Sun Jun 7 19:33:27 UTC 2015
Author: bapt
Date: Sun Jun 7 19:33:25 2015
New Revision: 284129
URL: https://svnweb.freebsd.org/changeset/base/284129
Log:
In case of rename validate the length of the new name
Check early that the new name fits MAXLOGNAME and store it in pwconf
Modified:
head/usr.sbin/pw/pw.c
head/usr.sbin/pw/pw_group.c
head/usr.sbin/pw/pw_user.c
head/usr.sbin/pw/pwupd.h
head/usr.sbin/pw/tests/pw_groupmod.sh
head/usr.sbin/pw/tests/pw_usermod.sh
Modified: head/usr.sbin/pw/pw.c
==============================================================================
--- head/usr.sbin/pw/pw.c Sun Jun 7 19:03:41 2015 (r284128)
+++ head/usr.sbin/pw/pw.c Sun Jun 7 19:33:25 2015 (r284129)
@@ -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;
Modified: head/usr.sbin/pw/pw_group.c
==============================================================================
--- head/usr.sbin/pw/pw_group.c Sun Jun 7 19:03:41 2015 (r284128)
+++ head/usr.sbin/pw/pw_group.c Sun Jun 7 19:33:25 2015 (r284129)
@@ -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,
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,
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");
Modified: head/usr.sbin/pw/pw_user.c
==============================================================================
--- head/usr.sbin/pw/pw_user.c Sun Jun 7 19:03:41 2015 (r284128)
+++ head/usr.sbin/pw/pw_user.c Sun Jun 7 19:33:25 2015 (r284129)
@@ -382,10 +382,10 @@ pw_user(int mode, char *name, long id, s
/*
* 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, s
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 */
}
}
Modified: head/usr.sbin/pw/pwupd.h
==============================================================================
--- head/usr.sbin/pw/pwupd.h Sun Jun 7 19:03:41 2015 (r284128)
+++ head/usr.sbin/pw/pwupd.h Sun Jun 7 19:33:25 2015 (r284129)
@@ -83,6 +83,7 @@ struct userconf {
struct pwconf {
char rootdir[MAXPATHLEN];
char etcpath[MAXPATHLEN];
+ char *newname;
bool dryrun;
bool pretty;
bool v7;
Modified: head/usr.sbin/pw/tests/pw_groupmod.sh
==============================================================================
--- head/usr.sbin/pw/tests/pw_groupmod.sh Sun Jun 7 19:03:41 2015 (r284128)
+++ head/usr.sbin/pw/tests/pw_groupmod.sh Sun Jun 7 19:33:25 2015 (r284129)
@@ -71,10 +71,21 @@ do_not_duplicate_group_on_gid_change_bod
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
}
Modified: head/usr.sbin/pw/tests/pw_usermod.sh
==============================================================================
--- head/usr.sbin/pw/tests/pw_usermod.sh Sun Jun 7 19:03:41 2015 (r284128)
+++ head/usr.sbin/pw/tests/pw_usermod.sh Sun Jun 7 19:33:25 2015 (r284129)
@@ -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
}
More information about the svn-src-all
mailing list