Subject: [bug#54180] [PATCH 05/12] home: symlink-manager: Remove 'empty-directory?' and avoid TOCTTOU race.

From: Maxime Devos <[email-masked]>
Date: Sun, 27 Feb 2022 16:54:56 +0100

Ludovic Courtès schreef op zo 27-02-2022 om 14:53 [+0100]:
> +                 (let ((directory (get-target-path directory)))
> +                   (catch 'system-error
> +                     (lambda ()
> +                       (rmdir directory)
> +                       (format #t (G_ "Removed ~a.\n") directory))
> +                     (lambda args
> +                       (let ((errno (system-error-errno args)))
> +                         (cond ((= ENOTEMPTY errno)
> +                                (format
> +                                 #t
> +                                 (G_ "Skipping ~a (not an empty directory)...\n")
> +                                 directory))
> +                               ((= ENOTDIR errno)
> +                                #t)
> +                               (else
> +                                (apply throw args))))))))

Like with my comment on ‘Avoid extra 'lstat call.’, I would move the
(format #t (G_ "Removed ~a.\n") directory) outside the catch.

If 'format' somehow throws a ENOTEMPTY/ENOTDIR system-error, something
is very wrong.

Greetings,
Maxime.