~ chicken-core (master) 47158a51b2d9c3d7dda97d3b88ade8fcddde220b


commit 47158a51b2d9c3d7dda97d3b88ade8fcddde220b
Author:     Mario Domenech Goulart <mario@parenteses.org>
AuthorDate: Fri Jul 31 22:07:54 2026 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Sat Aug 1 10:25:17 2026 +0200

    Make delete-file* race-free and avoid segv on #f
    
    delete-file* would cause a segmentation violation when given #f as
    argument:
    
      csi -e '(begin (import (chicken file)) (delete-file* #f))'
    
      Error: segmentation violation
    
    While at it, avoid TOCTOU issues by applying delete-file without
    checking for file existence before.  Handle exceptions in case they
    occur, and ignore errno/enoent.
    
    Signed-off-by: felix <felix@call-with-current-continuation.org>

diff --git a/file.scm b/file.scm
index f45f0964..1eae1b7b 100644
--- a/file.scm
+++ b/file.scm
@@ -134,6 +134,7 @@ EOF
 (import scheme
 	chicken.base
 	chicken.condition
+	chicken.errno
 	chicken.fixnum
 	chicken.foreign
 	chicken.io
@@ -273,8 +274,11 @@ EOF
   filename)
 
 (define (delete-file* file)
-  (and (*lstat file 'delete-file*)
-       (delete-file file)))
+  (handle-exceptions exn
+    (if (eq? errno/noent (get-condition-property exn 'exn 'errno #f))
+        #f
+        (signal exn))
+    (delete-file file)))
 
 (define (rename-file oldfile newfile #!optional (clobber #f))
   (##sys#check-string oldfile 'rename-file)
diff --git a/rules.make b/rules.make
index 5979b628..e626be5a 100644
--- a/rules.make
+++ b/rules.make
@@ -757,6 +757,7 @@ repl.c: repl.scm \
 		chicken.eval.import.scm
 file.c: file.scm \
 		chicken.condition.import.scm \
+		chicken.errno.import.scm \
 		chicken.fixnum.import.scm \
 		chicken.io.import.scm \
 		chicken.irregex.import.scm \
Trap