]> Kevux Git Server - fll/commitdiff
Bugfix: IKI Read is not handling parameter errors properly.
authorKevin Day <Kevin@kevux.org>
Sun, 8 Dec 2024 19:21:10 +0000 (13:21 -0600)
committerKevin Day <Kevin@kevux.org>
Sun, 8 Dec 2024 19:21:10 +0000 (13:21 -0600)
The `status` variable is being re-assigned after the error bit is set.
Add additional checks to prevent this from happening.

level_3/iki_read/c/iki_read.c

index ac0a14c839e6af3e1a72dee511439f3f892485b0..bb7bcaba9cf23898cdc8a845b7426c2aef9dad4e 100644 (file)
@@ -285,36 +285,38 @@ extern "C" {
         }
       }
 
-      if (main->parameters.array[iki_read_parameter_line_e].result == f_console_result_found_e) {
-        if (main->error.verbosity != f_console_verbosity_quiet_e) {
-          flockfile(main->error.to.stream);
+      if (F_status_is_error_not(status)) {
+        if (main->parameters.array[iki_read_parameter_line_e].result == f_console_result_found_e) {
+          if (main->error.verbosity != f_console_verbosity_quiet_e) {
+            flockfile(main->error.to.stream);
 
-          fl_print_format("%r%[%QThe parameter '%]", main->error.to.stream, f_string_eol_s, main->error.context, main->error.prefix, main->error.context);
-          fl_print_format("%[%r%r%]", main->error.to.stream, main->error.notable, f_console_symbol_long_enable_s, iki_read_long_line_s, main->error.notable);
-          fl_print_format("%[' requires a positive number.%]%r", main->error.to.stream, main->error.context, main->error.context, f_string_eol_s);
+            fl_print_format("%r%[%QThe parameter '%]", main->error.to.stream, f_string_eol_s, main->error.context, main->error.prefix, main->error.context);
+            fl_print_format("%[%r%r%]", main->error.to.stream, main->error.notable, f_console_symbol_long_enable_s, iki_read_long_line_s, main->error.notable);
+            fl_print_format("%[' requires a positive number.%]%r", main->error.to.stream, main->error.context, main->error.context, f_string_eol_s);
 
-          funlockfile(main->error.to.stream);
+            funlockfile(main->error.to.stream);
+          }
+
+          status = F_status_set_error(F_parameter);
         }
+        else if (main->parameters.array[iki_read_parameter_line_e].result == f_console_result_additional_e) {
+          const f_array_length_t index = main->parameters.array[iki_read_parameter_line_e].values.array[main->parameters.array[iki_read_parameter_line_e].values.used - 1];
 
-        status = F_status_set_error(F_parameter);
-      }
-      else if (main->parameters.array[iki_read_parameter_line_e].result == f_console_result_additional_e) {
-        const f_array_length_t index = main->parameters.array[iki_read_parameter_line_e].values.array[main->parameters.array[iki_read_parameter_line_e].values.used - 1];
+          f_number_unsigned_t number = 0;
 
-        f_number_unsigned_t number = 0;
+          status = fl_conversion_dynamic_to_unsigned_detect(fl_conversion_data_base_10_c, data.argv[index], &number);
 
-        status = fl_conversion_dynamic_to_unsigned_detect(fl_conversion_data_base_10_c, data.argv[index], &number);
+          if (F_status_is_error(status)) {
+            fll_error_parameter_integer_print(main->error, F_status_set_fine(status), "fl_conversion_dynamic_to_unsigned_detect", F_true, iki_read_long_line_s, data.argv[index]);
 
-        if (F_status_is_error(status)) {
-          fll_error_parameter_integer_print(main->error, F_status_set_fine(status), "fl_conversion_dynamic_to_unsigned_detect", F_true, iki_read_long_line_s, data.argv[index]);
+            status = F_status_set_error(F_parameter);
+          }
 
-          status = F_status_set_error(F_parameter);
+          data.line = number;
         }
-
-        data.line = number;
       }
 
-      if (main->parameters.array[iki_read_parameter_name_e].result == f_console_result_found_e) {
+      if (F_status_is_error_not(status) && main->parameters.array[iki_read_parameter_name_e].result == f_console_result_found_e) {
         if (main->error.verbosity != f_console_verbosity_quiet_e) {
           flockfile(main->error.to.stream);
 
@@ -328,7 +330,7 @@ extern "C" {
         status = F_status_set_error(F_parameter);
       }
 
-      if (main->parameters.array[iki_read_parameter_replace_e].result != f_console_result_none_e) {
+      if (F_status_is_error_not(status) && main->parameters.array[iki_read_parameter_replace_e].result != f_console_result_none_e) {
         if (main->parameters.array[iki_read_parameter_replace_e].result == f_console_result_found_e || main->parameters.array[iki_read_parameter_replace_e].values.used % 2 != 0) {
           if (main->error.verbosity != f_console_verbosity_quiet_e) {
             flockfile(main->error.to.stream);
@@ -352,7 +354,7 @@ extern "C" {
         }
       }
 
-      if (main->parameters.array[iki_read_parameter_reassign_e].result != f_console_result_none_e) {
+      if (F_status_is_error_not(status) && main->parameters.array[iki_read_parameter_reassign_e].result != f_console_result_none_e) {
         if (main->parameters.array[iki_read_parameter_reassign_e].result == f_console_result_found_e || main->parameters.array[iki_read_parameter_reassign_e].values.used % 3 != 0) {
           if (main->error.verbosity != f_console_verbosity_quiet_e) {
             flockfile(main->error.to.stream);
@@ -376,7 +378,7 @@ extern "C" {
         }
       }
 
-      if (main->parameters.array[iki_read_parameter_substitute_e].result != f_console_result_none_e) {
+      if (F_status_is_error_not(status) && main->parameters.array[iki_read_parameter_substitute_e].result != f_console_result_none_e) {
         if (main->parameters.array[iki_read_parameter_substitute_e].result == f_console_result_found_e || main->parameters.array[iki_read_parameter_substitute_e].values.used % 3 != 0) {
           if (main->error.verbosity != f_console_verbosity_quiet_e) {
             flockfile(main->error.to.stream);
@@ -400,48 +402,50 @@ extern "C" {
         }
       }
 
-      if (main->parameters.array[iki_read_parameter_literal_e].result == f_console_result_found_e) {
-        if (main->parameters.array[iki_read_parameter_object_e].result == f_console_result_found_e) {
-          if (main->error.verbosity != f_console_verbosity_quiet_e) {
-            fll_program_parameter_long_print_cannot_use_with(main->error, iki_read_long_literal_s, iki_read_long_object_s);
+      if (F_status_is_error_not(status)) {
+        if (main->parameters.array[iki_read_parameter_literal_e].result == f_console_result_found_e) {
+          if (main->parameters.array[iki_read_parameter_object_e].result == f_console_result_found_e) {
+            if (main->error.verbosity != f_console_verbosity_quiet_e) {
+              fll_program_parameter_long_print_cannot_use_with(main->error, iki_read_long_literal_s, iki_read_long_object_s);
+            }
+
+            status = F_status_set_error(F_parameter);
           }
 
-          status = F_status_set_error(F_parameter);
-        }
+          if (main->parameters.array[iki_read_parameter_content_e].result == f_console_result_found_e) {
+            if (main->error.verbosity != f_console_verbosity_quiet_e) {
+              fll_program_parameter_long_print_cannot_use_with(main->error, iki_read_long_literal_s, iki_read_long_content_s);
+            }
 
-        if (main->parameters.array[iki_read_parameter_content_e].result == f_console_result_found_e) {
-          if (main->error.verbosity != f_console_verbosity_quiet_e) {
-            fll_program_parameter_long_print_cannot_use_with(main->error, iki_read_long_literal_s, iki_read_long_content_s);
+            status = F_status_set_error(F_parameter);
           }
 
-          status = F_status_set_error(F_parameter);
-        }
+          if (main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e) {
+            if (main->error.verbosity != f_console_verbosity_quiet_e) {
+              fll_program_parameter_long_print_cannot_use_with(main->error, iki_read_long_literal_s, iki_read_long_total_s);
+            }
 
-        if (main->parameters.array[iki_read_parameter_total_e].result == f_console_result_found_e) {
-          if (main->error.verbosity != f_console_verbosity_quiet_e) {
-            fll_program_parameter_long_print_cannot_use_with(main->error, iki_read_long_literal_s, iki_read_long_total_s);
+            status = F_status_set_error(F_parameter);
           }
 
-          status = F_status_set_error(F_parameter);
+          data.mode = iki_read_mode_literal_e;
         }
+        else if (main->parameters.array[iki_read_parameter_object_e].result == f_console_result_found_e) {
+          if (main->parameters.array[iki_read_parameter_content_e].result == f_console_result_found_e) {
+            if (main->error.verbosity != f_console_verbosity_quiet_e) {
+              fll_program_parameter_long_print_cannot_use_with(main->error, iki_read_long_object_s, iki_read_long_content_s);
+            }
 
-        data.mode = iki_read_mode_literal_e;
-      }
-      else if (main->parameters.array[iki_read_parameter_object_e].result == f_console_result_found_e) {
-        if (main->parameters.array[iki_read_parameter_content_e].result == f_console_result_found_e) {
-          if (main->error.verbosity != f_console_verbosity_quiet_e) {
-            fll_program_parameter_long_print_cannot_use_with(main->error, iki_read_long_object_s, iki_read_long_content_s);
+            status = F_status_set_error(F_parameter);
           }
 
-          status = F_status_set_error(F_parameter);
+          data.mode = iki_read_mode_object_e;
         }
+        else {
 
-        data.mode = iki_read_mode_object_e;
-      }
-      else {
-
-        // This is the default behavior, so there is no reason to check for the -c/--content parameter.
-        data.mode = iki_read_mode_content_e;
+          // This is the default behavior, so there is no reason to check for the -c/--content parameter.
+          data.mode = iki_read_mode_content_e;
+        }
       }
 
       if (F_status_is_error(status)) {