diff --git a/usr.sbin/pw/pw_conf.c b/usr.sbin/pw/pw_conf.c index 21c4824ead9..7e8fdd37539 100644 --- a/usr.sbin/pw/pw_conf.c +++ b/usr.sbin/pw/pw_conf.c @@ -298,10 +298,16 @@ read_userconfig(char const * file) ? "/home" : newstr(q); break; case _UC_HOMEMODE: - modeset = setmode(q); - config.homemode = (q == NULL || !boolean_val(q, 1)) - ? _DEF_DIRMODE : getmode(modeset, _DEF_DIRMODE); - free(modeset); + if (q == NULL || !boolean_val(q, 1)) { + config.homemode = _DEF_DIRMODE; + } else { + modeset = setmode(q); + if (modeset == NULL) + errx(1, "Invalid mode: '%s'", q); + config.homemode = getmode(modeset, + _DEF_DIRMODE); + free(modeset); + } break; case _UC_SHELLPATH: config.shelldir = (q == NULL || !boolean_val(q, 1)) diff --git a/usr.sbin/pw/tests/pw_config_test.sh b/usr.sbin/pw/tests/pw_config_test.sh index e9209190dc5..4087653fd4b 100755 --- a/usr.sbin/pw/tests/pw_config_test.sh +++ b/usr.sbin/pw/tests/pw_config_test.sh @@ -19,7 +19,19 @@ modify_config_uid_gid_boundaries_body() { cat ${HOME}/foo.conf } +atf_test_case homemode_boolean_no_crash +homemode_boolean_no_crash_head() { + atf_set "descr" "Verify that homemode = yes in config gives a clean error" +} +homemode_boolean_no_crash_body() { + echo 'homemode = yes' > ${HOME}/bad.conf + populate_etc_skel + atf_check -s exit:1 -e inline:"pw: Invalid mode: 'yes'\n" \ + ${PW} useradd -D -C ${HOME}/bad.conf +} + atf_init_test_cases() { atf_add_test_case generate_config atf_add_test_case modify_config_uid_gid_boundaries + atf_add_test_case homemode_boolean_no_crash }