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.
if (recurse->state.status == F_continue) continue;
} // for
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;