Re: [PATCH v3] selinux_restorecon: Do not exit on directory cycles

Stephen Smalley <[email protected]> Mon, 27 Jul 2026 09:35:19 -0400
Newsgroups org.kernel.vger.selinux
Message-ID <CAEjxPJ5GOSRAKiSi5Je0b_Us6tJrDZ8dfRhgpJLp5MjzJjYGtw@mail.gmail.com>
On Mon, Jul 27, 2026 at 8:53 AM Johannes Segitz <[email protected]> wrote:
>
> All other failures are handled gracefully. Directory cycles can e.g.
> happen on BTRFS filesystems with subvolumes. Skip them and continue
> instead of exiting
>
> Signed-off-by: Johannes Segitz <[email protected]>
> ---
>  libselinux/src/selinux_restorecon.c | 11 +++++------
>  1 file changed, 5 insertions(+), 6 deletions(-)
>
> diff --git a/libselinux/src/selinux_restorecon.c b/libselinux/src/selinux_restorecon.c
> index 30f1b836..fdefc92c 100644
> --- a/libselinux/src/selinux_restorecon.c
> +++ b/libselinux/src/selinux_restorecon.c
> @@ -1393,15 +1393,14 @@ static void *selinux_restorecon_thread(void *arg)
>                 if (is_dir) {
>                         if (descend && walk_is_cycle(state, ent_sb.st_dev,
>                                                      ent_sb.st_ino)) {
> -                               selinux_log(SELINUX_ERROR,
> +                               selinux_log(SELINUX_WARNING,
>                                             "Directory cycle on %s.\n",
>                                             ent_path);
>                                 close(ent_fd);
> -                               close(rd_fd);
> -                               errno = ELOOP;
> -                               state->error = -1;
> -                               state->abort = true;
> -                               goto finish;
> +                               if (rd_fd >= 0)
> +                                       close(rd_fd);

As before, you don't need the if (rd_fd >= 0) test here because this
is under an if (descend...)
so it is a tautology. And i thought you were going to explicitly note
the change in behavior via
e.g. a man page update or similar?

> +                               prune_pathbuf(state);
> +                               continue;
>                         }
>
>                         if (state->sfsb.f_type == SYSFS_MAGIC &&
> --
> 2.55.0
>
>