]> Kevux Git Server - fll/commitdiff
Bugfix: Directory recursion is losing the error state. development
authorKevin Day <Kevin@kevux.org>
Tue, 3 Jun 2025 03:49:25 +0000 (22:49 -0500)
committerKevin Day <Kevin@kevux.org>
Tue, 3 Jun 2025 03:49:25 +0000 (22:49 -0500)
The stream is being closed at the end of the directory recursion regardless of the error state.
This ends up overwriting the status code.

Preserve the status code before closing the stream.
Process the stream close.
Then restore the original status if the original status has an error or if the stream close worked.

level_1/fl_directory/c/private-directory.c

index 7d2385fbb8fe7036e9f3368bbab5edcd7d80c8b1..b9097c7a893c3f559e40729334c9ef17eafbfa38 100644 (file)
@@ -169,14 +169,22 @@ extern "C" {
       if (recurse->state.status == F_continue) continue;
     } // for
 
-    recurse->state.status = f_directory_stream_close(stream);
+    {
+      const f_status_t status_original = recurse->state.status;
 
-    if (F_status_is_error(recurse->state.status)) {
-      private_inline_fl_directory_do_handle(recurse, recurse->path, f_directory_recurse_do_flag_clean_list_d);
-      if (F_status_is_error(recurse->state.status)) return;
+      recurse->state.status = f_directory_stream_close(stream);
 
-      if (recurse->state.status != F_done) {
-        recurse->state.status = F_okay;
+      if (F_status_is_error(recurse->state.status)) {
+        private_inline_fl_directory_do_handle(recurse, recurse->path, f_directory_recurse_do_flag_clean_list_d);
+        if (F_status_is_error(recurse->state.status)) return;
+
+        if (recurse->state.status != F_done) {
+          recurse->state.status = F_okay;
+        }
+      }
+
+      if (F_status_is_error(status_original) || F_status_is_error_not(recurse->state.status)) {
+        recurse->state.status = status_original;
       }
     }