From 0cc41a420843e4c035637f07f2f7725661a55d5e Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Tue, 25 Nov 2025 22:00:57 -0600 Subject: [PATCH] Update: Use the set to manage dynamic varriables associated with the receive abstruses. 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. --- .../c/program/kevux/tools/tacocat/main/packet.c | 222 +++++++++++++++------ .../c/program/kevux/tools/tacocat/main/process.c | 1 + .../c/program/kevux/tools/tacocat/main/process.h | 4 +- 3 files changed, 170 insertions(+), 57 deletions(-) diff --git a/sources/c/program/kevux/tools/tacocat/main/packet.c b/sources/c/program/kevux/tools/tacocat/main/packet.c index 5b06d61..3dd8ba3 100644 --- a/sources/c/program/kevux/tools/tacocat/main/packet.c +++ b/sources/c/program/kevux/tools/tacocat/main/packet.c @@ -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_ diff --git a/sources/c/program/kevux/tools/tacocat/main/process.c b/sources/c/program/kevux/tools/tacocat/main/process.c index 21f1e59..6d900e7 100644 --- a/sources/c/program/kevux/tools/tacocat/main/process.c +++ b/sources/c/program/kevux/tools/tacocat/main/process.c @@ -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; diff --git a/sources/c/program/kevux/tools/tacocat/main/process.h b/sources/c/program/kevux/tools/tacocat/main/process.h index bf7b00e..f564279 100644 --- a/sources/c/program/kevux/tools/tacocat/main/process.h +++ b/sources/c/program/kevux/tools/tacocat/main/process.h @@ -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(). * -- 1.8.3.1