svn commit: r359232 - in head/usr.sbin/pw: . tests

Baptiste Daroussin bapt at FreeBSD.org
Mon Mar 23 08:23:23 UTC 2020


Author: bapt
Date: Mon Mar 23 08:23:22 2020
New Revision: 359232
URL: https://svnweb.freebsd.org/changeset/base/359232

Log:
  pw: do not removed home directories if not owned
  
  When deleting a user, if its home directory does not belong to it, it should
  not be removed. This is the promise that the manpage makes, the tool should
  ensure that it respects that promise.
  
  Add a regression test about it
  
  PR:		244967
  Submitted by:	Eric Hanneken <eric at erichanneken.com>
  MFC after:	3 days

Modified:
  head/usr.sbin/pw/rm_r.c
  head/usr.sbin/pw/tests/pw_userdel_test.sh

Modified: head/usr.sbin/pw/rm_r.c
==============================================================================
--- head/usr.sbin/pw/rm_r.c	Sun Mar 22 22:18:06 2020	(r359231)
+++ head/usr.sbin/pw/rm_r.c	Mon Mar 23 08:23:22 2020	(r359232)
@@ -71,5 +71,8 @@ rm_r(int rootfd, const char *path, uid_t uid)
 	closedir(d);
 	if (fstatat(rootfd, path, &st, AT_SYMLINK_NOFOLLOW) != 0)
 		return;
-	unlinkat(rootfd, path, S_ISDIR(st.st_mode) ? AT_REMOVEDIR : 0);
+	if (S_ISLNK(st.st_mode))
+		unlinkat(rootfd, path, 0);
+	else if (st.st_uid == uid)
+		unlinkat(rootfd, path, AT_REMOVEDIR);
 }

Modified: head/usr.sbin/pw/tests/pw_userdel_test.sh
==============================================================================
--- head/usr.sbin/pw/tests/pw_userdel_test.sh	Sun Mar 22 22:18:06 2020	(r359231)
+++ head/usr.sbin/pw/tests/pw_userdel_test.sh	Mon Mar 23 08:23:22 2020	(r359232)
@@ -67,10 +67,30 @@ home_not_a_dir_body() {
 	atf_check ${RPW} userdel foo -r
 }
 
+atf_test_case home_shared
+home_shared_body() {
+	populate_root_etc_skel
+	mkdir ${HOME}/shared
+	atf_check ${RPW} useradd -n testuser1 -d /shared
+	atf_check ${RPW} useradd -n testuser2 -d /shared
+	atf_check ${RPW} userdel -n testuser1 -r
+	test -d ${HOME}/shared || atf_fail "Shared home has been removed"
+}
+
+atf_test_case home_regular_dir
+home_regular_dir_body() {
+	populate_root_etc_skel
+	atf_check ${RPW} useradd -n foo -d /foo
+	atf_check ${RPW} userdel -n foo -r
+	[ ! -d ${HOME}/foo ] || atf_fail "Home has not been removed"
+}
+
 atf_init_test_cases() {
 	atf_add_test_case rmuser_seperate_group
 	atf_add_test_case user_do_not_try_to_delete_root_if_user_unknown
 	atf_add_test_case delete_files
 	atf_add_test_case delete_numeric_name
 	atf_add_test_case home_not_a_dir
+	atf_add_test_case home_shared
+	atf_add_test_case home_regular_dir
 }


More information about the svn-src-head mailing list