]> Kevux Git Server - kevux-tools/commitdiff
Update: Use the set to manage dynamic varriables associated with the receive abstruses.
authorKevin Day <Kevin@kevux.org>
Wed, 26 Nov 2025 04:00:57 +0000 (22:00 -0600)
committerKevin Day <Kevin@kevux.org>
Wed, 26 Nov 2025 04:23:19 +0000 (22:23 -0600)
Avod de-allocation issues when an abstruse type gets swapped around by only using dynamic strings already managed by another structure, like the set struccture.
Ensure these never get auto de-allocation by setting size to 0.

Handle each receive abstruse headers and ensure they get printed.

Provide a separate status variable to allow for detecting all header problems without failing until the very end of the function.

sources/c/program/kevux/tools/tacocat/main/packet.c
sources/c/program/kevux/tools/tacocat/main/process.c
sources/c/program/kevux/tools/tacocat/main/process.h

index 5b06d6169bba7930eaa3d824413f87b694c28036..3dd8ba342af9949895ed96766b4fd880b1b79b53 100644 (file)
@@ -108,6 +108,20 @@ extern "C" {
 
     f_number_unsigned_t i = 0;
 
+    f_range_t ranges[] = {
+      f_range_t_initialize,
+      f_range_t_initialize,
+      f_range_t_initialize,
+      f_range_t_initialize,
+      f_range_t_initialize,
+      f_range_t_initialize,
+      f_range_t_initialize,
+      f_range_t_initialize,
+      f_range_t_initialize,
+    };
+
+    f_status_t status = set->status = F_okay;
+
     {
       uint8_t j = 0;
 
@@ -131,28 +145,13 @@ extern "C" {
 
             // Require Content to exist.
             if (!set->contents_header.array[i].used) {
-              if (set->abstruses.array[j].value.type == f_abstruse_dynamic_e) {
-              }
-
               set->abstruses.array[j].value.type = f_abstruse_none_e;
+              set->abstruses.array[j].value.is.a_unsigned = 0;
 
               continue;
             }
 
-            // @todo All of these need to be stored in another location so that re-assignments doesn't cause problems with dynamic allocation. Allocate these and make them available.
-            /*set->abstruses.array[i].value.type = f_abstruse_dynamic_e;
-            set->abstruses.array[i].value.is.a_dynamic.used = 0;
-
-            set->status = f_string_dynamic_partial_append(set->buffer, range, &set->abstruses.array[i].value.is.a_dynamic);
-
-            if (F_status_is_error(set->status)) {
-              kt_tacocat_print_error_on(&main->program.error, F_status_debug_source_d, direction, set->network, set->status, set->name);
-
-              return;
-            }*/
-
-            set->abstruses.array[j].value.type = f_abstruse_range_e;
-            set->abstruses.array[j].value.is.a_range = set->contents_header.array[i].array[0];
+            ranges[j] = set->contents_header.array[i].array[0];
           }
         } // for
       } // for
@@ -160,89 +159,200 @@ extern "C" {
 
     // Convert the status code.
     if (set->abstruses.array[0].value.type) {
-      const f_number_unsigned_t length = set->abstruses.array[0].value.is.a_range.stop - set->abstruses.array[0].value.is.a_range.start + 1;
-      char buffer[length];
-      f_status_t status = F_false;
+      if (ranges[0].start > ranges[0].stop) {
+        kt_tacocat_print_error_on_packet_header_value_invalid(&main->program.error, direction, set->network, F_found_not, set->name, set->buffer, set->objects.array[at], ranges[0]);
 
-      memcpy(buffer, set->buffer.string + set->abstruses.array[0].value.is.a_range.start, length);
-
-      const f_string_static_t status_string = macro_f_string_static_t_initialize_1(buffer, 0, length);
-
-      set->status = fl_status_string_from(status_string, &status);
+        set->abstruses.array[0].value.type = f_abstruse_none_e;
+        set->abstruses.array[0].value.is.a_unsigned = 0;
 
-      if (set->status == F_okay) {
-        set->abstruses.array[0].value.type = f_abstruse_unsigned_e;
-        set->abstruses.array[0].value.is.a_unsigned = (f_number_unsigned_t) status;
+        set->status = F_status_set_error(F_packet);
       }
       else {
-        kt_tacocat_print_error_on_packet_header_value_invalid(&main->program.error, direction, set->network, set->status, set->name, set->buffer, set->objects.array[at], set->abstruses.array[6].value.is.a_range);
+        const f_number_unsigned_t length = ranges[0].stop - ranges[0].start + 1;
+        char buffer[length];
+        f_status_t code = F_false;
 
-        set->abstruses.array[0].value.type = f_abstruse_none_e;
-        set->abstruses.array[0].value.is.a_unsigned = 0;
+        memcpy(buffer, set->buffer.string + ranges[0].start, length);
 
-        set->status = F_status_set_error(F_packet);
+        const f_string_static_t status_string = macro_f_string_static_t_initialize_1(buffer, 0, length);
+
+        status = fl_status_string_from(status_string, &code);
+
+        if (code == F_okay) {
+          set->abstruses.array[0].value.type = f_abstruse_unsigned_e;
+          set->abstruses.array[0].value.is.a_unsigned = (f_number_unsigned_t) code;
+        }
+        else {
+          kt_tacocat_print_error_on_packet_header_value_invalid(&main->program.error, direction, set->network, F_status_is_error(status) ? status : F_found_not, set->name, set->buffer, set->objects.array[at], ranges[0]);
+
+          set->abstruses.array[0].value.type = f_abstruse_none_e;
+          set->abstruses.array[0].value.is.a_unsigned = 0;
+
+          set->status = F_status_set_error(F_packet);
+        }
       }
     }
 
     // Convert the type.
     if (set->abstruses.array[1].value.type) {
-      if (f_compare_dynamic_partial_string(kt_tacocat_file_s.string, set->buffer, kt_tacocat_file_s.used, set->abstruses.array[1].value.is.a_range) == F_equal_to) {
-        set->abstruses.array[1].value.type = f_abstruse_unsigned_e;
-        set->abstruses.array[1].value.is.a_unsigned = (f_number_unsigned_t) kt_tacocat_packet_type_file_d;
+      if (ranges[1].start > ranges[1].stop) {
+
+        kt_tacocat_print_error_on_packet_header_value_invalid(&main->program.error, direction, set->network, F_packet, set->name, set->buffer, set->objects.array[at], ranges[1]);
+
+        set->abstruses.array[1].value.type = f_abstruse_none_e;
+        set->abstruses.array[1].value.is.a_unsigned = 0;
+
+        set->status = F_status_set_error(F_packet);
       }
-      else if (f_compare_dynamic_partial_string(kt_tacocat_done_s.string, set->buffer, kt_tacocat_done_s.used, set->abstruses.array[1].value.is.a_range) == F_equal_to) {
-        set->abstruses.array[1].value.type = f_abstruse_unsigned_e;
-        set->abstruses.array[1].value.is.a_unsigned = (f_number_unsigned_t) kt_tacocat_packet_type_done_d;
+      else {
+        if (f_compare_dynamic_partial_string(kt_tacocat_file_s.string, set->buffer, kt_tacocat_file_s.used, ranges[1]) == F_equal_to) {
+          set->abstruses.array[1].value.type = f_abstruse_unsigned_e;
+          set->abstruses.array[1].value.is.a_unsigned = (f_number_unsigned_t) kt_tacocat_packet_type_file_d;
+        }
+        else if (f_compare_dynamic_partial_string(kt_tacocat_done_s.string, set->buffer, kt_tacocat_done_s.used, ranges[1]) == F_equal_to) {
+          set->abstruses.array[1].value.type = f_abstruse_unsigned_e;
+          set->abstruses.array[1].value.is.a_unsigned = (f_number_unsigned_t) kt_tacocat_packet_type_done_d;
+        }
+        else if (f_compare_dynamic_partial_string(kt_tacocat_next_s.string, set->buffer, kt_tacocat_next_s.used, ranges[1]) == F_equal_to) {
+          set->abstruses.array[1].value.type = f_abstruse_unsigned_e;
+          set->abstruses.array[1].value.is.a_unsigned = (f_number_unsigned_t) kt_tacocat_packet_type_next_d;
+        }
+        else if (f_compare_dynamic_partial_string(kt_tacocat_resend_s.string, set->buffer, kt_tacocat_resend_s.used, ranges[1]) == F_equal_to) {
+          set->abstruses.array[1].value.type = f_abstruse_unsigned_e;
+          set->abstruses.array[1].value.is.a_unsigned = (f_number_unsigned_t) kt_tacocat_packet_type_resend_d;
+        }
+        else {
+          kt_tacocat_print_error_on_packet_header_value_invalid(&main->program.error, direction, set->network, F_found_not, set->name, set->buffer, set->objects.array[at], ranges[1]);
+
+          set->abstruses.array[1].value.type = f_abstruse_none_e;
+          set->abstruses.array[1].value.is.a_unsigned = 0;
+
+          set->status = F_status_set_error(F_packet);
+        }
       }
-      else if (f_compare_dynamic_partial_string(kt_tacocat_next_s.string, set->buffer, kt_tacocat_next_s.used, set->abstruses.array[1].value.is.a_range) == F_equal_to) {
-        set->abstruses.array[1].value.type = f_abstruse_unsigned_e;
-        set->abstruses.array[1].value.is.a_unsigned = (f_number_unsigned_t) kt_tacocat_packet_type_next_d;
+    }
+
+    // Convert the name.
+    if (set->abstruses.array[5].value.type) {
+      if (ranges[5].start > ranges[5].stop) {
+        kt_tacocat_print_error_on_packet_header_value_invalid(&main->program.error, direction, set->network, F_found_not, set->name, set->buffer, set->objects.array[at], ranges[5]);
+
+        set->abstruses.array[5].value.type = f_abstruse_none_e;
+        set->abstruses.array[5].value.is.a_unsigned = 0;
+
+        set->status = F_status_set_error(F_packet);
       }
-      else if (f_compare_dynamic_partial_string(kt_tacocat_resend_s.string, set->buffer, kt_tacocat_resend_s.used, set->abstruses.array[1].value.is.a_range) == F_equal_to) {
-        set->abstruses.array[1].value.type = f_abstruse_unsigned_e;
-        set->abstruses.array[1].value.is.a_unsigned = (f_number_unsigned_t) kt_tacocat_packet_type_resend_d;
+      else {
+        set->name.used = 0;
+
+        status = f_string_dynamic_partial_append(set->buffer, ranges[5], &set->name);
+
+        if (F_status_is_error(status)) {
+          kt_tacocat_print_error_on_packet_header_value_invalid(&main->program.error, direction, set->network, status, set->name, set->buffer, set->objects.array[at], ranges[5]);
+
+          set->abstruses.array[5].value.type = f_abstruse_none_e;
+          set->abstruses.array[5].value.is.a_unsigned = 0;
+
+          set->status = F_status_set_error(F_packet);
+        }
+        else {
+          set->abstruses.array[5].value.type = f_abstruse_dynamic_e;
+          set->abstruses.array[5].value.is.a_dynamic = set->name;
+          set->abstruses.array[5].value.is.a_dynamic.size = 0;
+        }
+      }
+    }
+
+    // Convert the id.
+    if (set->abstruses.array[7].value.type && ranges[7].start <= ranges[7].stop) {
+      if (ranges[7].start > ranges[7].stop) {
+        kt_tacocat_print_error_on_packet_header_value_invalid(&main->program.error, direction, set->network, F_found_not, set->name, set->buffer, set->objects.array[at], ranges[7]);
+
+        set->abstruses.array[7].value.type = f_abstruse_none_e;
+        set->abstruses.array[7].value.is.a_unsigned = 0;
+
+        set->status = F_status_set_error(F_packet);
       }
       else {
-        set->status = F_status_set_error(F_found_not);
+        set->id.used = 0;
 
-        kt_tacocat_print_error_on_packet_header_value_invalid(&main->program.error, direction, set->network, set->status, set->name, set->buffer, set->objects.array[at], set->abstruses.array[6].value.is.a_range);
+        status = f_string_dynamic_partial_append(set->buffer, ranges[7], &set->id);
 
-        set->abstruses.array[1].value.type = f_abstruse_none_e;
-        set->abstruses.array[1].value.is.a_unsigned = 0;
+        if (F_status_is_error(status)) {
+          kt_tacocat_print_error_on_packet_header_value_invalid(&main->program.error, direction, set->network, status, set->id, set->buffer, set->objects.array[at], ranges[7]);
+
+          set->abstruses.array[7].value.type = f_abstruse_none_e;
+          set->abstruses.array[7].value.is.a_unsigned = 0;
+
+          set->status = F_status_set_error(F_packet);
+        }
+        else {
+          set->abstruses.array[7].value.type = f_abstruse_dynamic_e;
+          set->abstruses.array[7].value.is.a_dynamic = set->id;
+          set->abstruses.array[7].value.is.a_dynamic.size = 0;
+        }
+      }
+    }
+
+    // Convert the time.
+    if (set->abstruses.array[8].value.type) {
+      if (ranges[8].start > ranges[8].stop) {
+        kt_tacocat_print_error_on_packet_header_value_invalid(&main->program.error, direction, set->network, F_found_not, set->name, set->buffer, set->objects.array[at], ranges[8]);
+
+        set->abstruses.array[8].value.type = f_abstruse_none_e;
+        set->abstruses.array[8].value.is.a_unsigned = 0;
 
         set->status = F_status_set_error(F_packet);
+      }
+      else {
+        set->time.used = 0;
 
-        return;
+        status = f_string_dynamic_partial_append(set->buffer, ranges[8], &set->time);
+
+        if (F_status_is_error(status)) {
+          kt_tacocat_print_error_on_packet_header_value_invalid(&main->program.error, direction, set->network, status, set->time, set->buffer, set->objects.array[at], ranges[8]);
+
+          set->abstruses.array[8].value.type = f_abstruse_none_e;
+          set->abstruses.array[8].value.is.a_unsigned = 0;
+
+          set->status = F_status_set_error(F_packet);
+        }
+        else {
+          set->abstruses.array[8].value.type = f_abstruse_dynamic_e;
+          set->abstruses.array[8].value.is.a_dynamic = set->time;
+          set->abstruses.array[8].value.is.a_dynamic.size = 0;
+        }
       }
     }
 
-    // Convert the length, part, and total.
+    // Convert the length (2), part (3), total (4), and salt (6).
     {
       f_number_unsigned_t number = 0;
 
-      for (i = 2; i < 5; ++i) {
+      for (i = 2; i < 7; ++i) {
 
-        if (!set->abstruses.array[i].value.type) continue;
+        if (!set->abstruses.array[i].value.type || i == 5) continue;
 
-        set->status = fl_conversion_dynamic_partial_to_unsigned(fl_conversion_data_base_10_c, set->buffer, set->abstruses.array[i].value.is.a_range, &number);
+        status = fl_conversion_dynamic_partial_to_unsigned(fl_conversion_data_base_10_c, set->buffer, ranges[i], &number);
 
-        if (set->status == F_okay) {
+        if (status == F_okay) {
           set->abstruses.array[i].value.type = f_abstruse_unsigned_e;
           set->abstruses.array[i].value.is.a_unsigned = number;
         }
         else {
-          kt_tacocat_print_error_on_packet_header_value_invalid(&main->program.error, direction, set->network, set->status, set->name, set->buffer, set->objects.array[at], set->abstruses.array[6].value.is.a_range);
+          kt_tacocat_print_error_on_packet_header_value_invalid(&main->program.error, direction, set->network, status, set->name, set->buffer, set->objects.array[at], ranges[i]);
 
           set->abstruses.array[i].value.type = f_abstruse_none_e;
           set->abstruses.array[i].value.is.a_unsigned = 0;
 
           set->status = F_status_set_error(F_packet);
+
+          return;
         }
       } // for
     }
 
     set->abstruses.used = kt_tacocat_packet_headers_d;
-    set->status = F_okay;
   }
 #endif // _di_kt_tacocat_packet_extract_header_
 
index 21f1e5952ea839282593bd5c17eccda6a00e174c..6d900e70b0cb194988c67e3ae210c2edf8007be5 100644 (file)
@@ -71,6 +71,7 @@ extern "C" {
     set->abstruses.array[0].key = f_fss_payload_object_status_s;
     set->abstruses.array[0].value.type = f_abstruse_dynamic_e;
     set->abstruses.array[0].value.is.a_dynamic = f_status_okay_s;
+    set->abstruses.array[0].value.is.a_dynamic.size = 0;
 
     // Index 1 is the type.
     set->abstruses.array[1].key = f_fss_payload_object_type_s;
index bf7b00e2d6d732e386da54db3631d78eb05a91bd..f564279f5cab30f4fd6125b583244d7e60405a72 100644 (file)
@@ -40,6 +40,8 @@ extern "C" {
  *   4: total.
  *   5: name.
  *   6: salt.
+ *   7: id (transaction id).
+ *   8: time.
  *
  * @param main
  *   The main program and settings data.
@@ -53,7 +55,7 @@ extern "C" {
  *   Must not be NULL.
  *
  *   This alters set.status:
- *     Success from: f_memory_array_increase_by().
+ *     F_okay on success.
  *
  *     Errors (with error bit) from: f_memory_array_increase_by().
  *