From owner-svn-src-stable@freebsd.org Fri Apr 3 05:15:47 2020 Return-Path: Delivered-To: svn-src-stable@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 381642749C3; Fri, 3 Apr 2020 05:15:47 +0000 (UTC) (envelope-from bapt@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 48tp6m0Q9Kz3Nmr; Fri, 3 Apr 2020 05:15:43 +0000 (UTC) (envelope-from bapt@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 8070A26585; Fri, 3 Apr 2020 05:08:07 +0000 (UTC) (envelope-from bapt@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 033587WV076959; Fri, 3 Apr 2020 05:08:07 GMT (envelope-from bapt@FreeBSD.org) Received: (from bapt@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 033587Sl076958; Fri, 3 Apr 2020 05:08:07 GMT (envelope-from bapt@FreeBSD.org) Message-Id: <202004030508.033587Sl076958@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: bapt set sender to bapt@FreeBSD.org using -f From: Baptiste Daroussin Date: Fri, 3 Apr 2020 05:08:07 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r359589 - in stable/12/usr.sbin/pw: . tests X-SVN-Group: stable-12 X-SVN-Commit-Author: bapt X-SVN-Commit-Paths: in stable/12/usr.sbin/pw: . tests X-SVN-Commit-Revision: 359589 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Apr 2020 05:15:47 -0000 Author: bapt Date: Fri Apr 3 05:08:06 2020 New Revision: 359589 URL: https://svnweb.freebsd.org/changeset/base/359589 Log: MFC r359232: 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 Modified: stable/12/usr.sbin/pw/rm_r.c stable/12/usr.sbin/pw/tests/pw_userdel_test.sh Directory Properties: stable/12/ (props changed) Modified: stable/12/usr.sbin/pw/rm_r.c ============================================================================== --- stable/12/usr.sbin/pw/rm_r.c Fri Apr 3 05:06:08 2020 (r359588) +++ stable/12/usr.sbin/pw/rm_r.c Fri Apr 3 05:08:06 2020 (r359589) @@ -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: stable/12/usr.sbin/pw/tests/pw_userdel_test.sh ============================================================================== --- stable/12/usr.sbin/pw/tests/pw_userdel_test.sh Fri Apr 3 05:06:08 2020 (r359588) +++ stable/12/usr.sbin/pw/tests/pw_userdel_test.sh Fri Apr 3 05:08:06 2020 (r359589) @@ -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 }