]> git.cameronkatri.com Git - pw-darwin.git/blobdiff - pw/rm_r.c
PREFIX stuff
[pw-darwin.git] / pw / rm_r.c
index 172c7b02e1db0d2bd1477ca33c1bc6d1b338d95b..66ec3f21423f2cd72ce92098034f256c794a6cc1 100644 (file)
--- a/pw/rm_r.c
+++ b/pw/rm_r.c
@@ -1,4 +1,6 @@
 /*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
  * Copyright (C) 1996
  *     David L. Nugent.  All rights reserved.
  *
@@ -50,8 +52,15 @@ rm_r(int rootfd, const char *path, uid_t uid)
                path++;
 
        dirfd = openat(rootfd, path, O_DIRECTORY);
+       if (dirfd == -1) {
+               return;
+       }
 
        d = fdopendir(dirfd);
+       if (d == NULL) {
+               (void)close(dirfd);
+               return;
+       }
        while ((e = readdir(d)) != NULL) {
                if (strcmp(e->d_name, ".") == 0 || strcmp(e->d_name, "..") == 0)
                        continue;
@@ -66,5 +75,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);
 }