~ 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