]> granicus.if.org Git - vim/commitdiff
patch 8.2.4696: delete() with "rf" argument does not report a failure v8.2.4696
authorzeertzjq <zeertzjq@outlook.com>
Tue, 5 Apr 2022 14:31:01 +0000 (15:31 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 5 Apr 2022 14:31:01 +0000 (15:31 +0100)
Problem:    delete() with "rf" argument does not report a failure.
Solution:   Return -1 if the directory could not be removed. (closes #10078)

src/fileio.c
src/testdir/test_functions.vim
src/version.c

index 9ef2dbd3bc1963de0ef7a93c489e771018da1cb6..af915c665fea34fbb3d67f26de5132d890bbf1e2 100644 (file)
@@ -5017,13 +5017,16 @@ delete_recursive(char_u *name)
                vim_snprintf((char *)NameBuff, MAXPATHL, "%s/%s", exp,
                                            ((char_u **)ga.ga_data)[i]);
                if (delete_recursive(NameBuff) != 0)
+                   // Remember the failure but continue deleting any further
+                   // entries.
                    result = -1;
            }
            ga_clear_strings(&ga);
+           if (mch_rmdir(exp) != 0)
+               result = -1;
        }
        else
            result = -1;
-       (void)mch_rmdir(exp);
        vim_free(exp);
     }
     else
index a19dd52719a4785a13d89f4856ddf7ad5264d756..a87ca3b585abb243814499bcbfbd731ee5c4e38e 100644 (file)
@@ -2242,6 +2242,15 @@ func Test_delete_rf()
   call assert_equal(0, delete('Xdir', 'rf'))
   call assert_false(filereadable('Xdir/foo.txt'))
   call assert_false(filereadable('Xdir/[a-1]/foo.txt'))
+
+  if has('unix')
+    call mkdir('Xdir/Xdir2', 'p')
+    silent !chmod 555 Xdir
+    call assert_equal(-1, delete('Xdir/Xdir2', 'rf'))
+    call assert_equal(-1, delete('Xdir', 'rf'))
+    silent !chmod 755 Xdir
+    call assert_equal(0, delete('Xdir', 'rf'))
+  endif
 endfunc
 
 func Test_call()
index f4d300b39e0d0ea2161247700c95bfbda8bf5688..0e42966d9681506160b487cb17628bd6ee9cbc4d 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4696,
 /**/
     4695,
 /**/