From f44b9422604504e6c3dfbbf4dcf7526f2a869d8a Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Wed, 2 Apr 2025 23:59:28 -0500 Subject: [PATCH] Bugfix: Directory recursion has incorrect status check resulting in early loop breakage. The loop is breaking out early due to the incorrect boolean logic when checking if an interrupt signal has been received via the state status. This bug was exposed by the (incomplete) kevux-tools program `remove`: ```shell clear ; md a/b/c ; touch a/b/file ; remove a/b/ -r +V ; t a ``` --- level_1/fl_directory/c/private-directory.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/level_1/fl_directory/c/private-directory.c b/level_1/fl_directory/c/private-directory.c index f7fd412..115a393 100644 --- a/level_1/fl_directory/c/private-directory.c +++ b/level_1/fl_directory/c/private-directory.c @@ -202,6 +202,7 @@ extern "C" { if (F_status_is_error(recurse->state.status)) break; } else { + recurse->action(recurse, recurse->listing.directory.array[i], f_directory_recurse_do_flag_directory_e); if (F_status_is_error(recurse->state.status)) { @@ -211,7 +212,7 @@ extern "C" { } // This loop is not considered a loop for breaking and continuing. - if (recurse->state.status == F_break || recurse->state.status == F_done || recurse->state.status == F_continue || F_status_set_fine(recurse->state.status) != F_interrupt) break; + if (recurse->state.status == F_break || recurse->state.status == F_done || recurse->state.status == F_continue || F_status_set_fine(recurse->state.status) == F_interrupt) break; } else { if (recurse->flag & flag_actions[j]) { @@ -224,7 +225,7 @@ extern "C" { } } - if (F_status_is_error(recurse->state.status) || recurse->state.status == F_break || recurse->state.status == F_done || F_status_set_fine(recurse->state.status) != F_interrupt) break; + if (F_status_is_error(recurse->state.status) || recurse->state.status == F_break || recurse->state.status == F_done || F_status_set_fine(recurse->state.status) == F_interrupt) break; if (recurse->state.status == F_continue) continue; } // for -- 1.8.3.1