From: Kevin Day Date: Thu, 3 Apr 2025 04:59:28 +0000 (-0500) Subject: Bugfix: Directory recursion has incorrect status check resulting in early loop breakage. X-Git-Url: https://git.kevux.org/?a=commitdiff_plain;h=f44b9422604504e6c3dfbbf4dcf7526f2a869d8a;p=fll 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 ``` --- 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