From 673efc787cd022f8c3df284e7f5b1f9efd47fe47 Mon Sep 17 00:00:00 2001 From: Bastian Dehn Date: Sat, 11 Oct 2025 11:45:31 +0200 Subject: [PATCH] validate option descriptors --- src/kds_s2000w_option_descriptors.c | 33 ++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/kds_s2000w_option_descriptors.c b/src/kds_s2000w_option_descriptors.c index 4e921ae..3b948eb 100644 --- a/src/kds_s2000w_option_descriptors.c +++ b/src/kds_s2000w_option_descriptors.c @@ -13,6 +13,15 @@ uint8_t max_option_count = 0; void _kds_s2000w_option_descriptor_descriptor_free(option_descriptor* descriptor) { + if (descriptor == NULL) + return; + + if (descriptor->descriptor == NULL) { + free(descriptor); + descriptor = NULL; + return; + } + if (descriptor->descriptor->constraint_type == SANE_CONSTRAINT_STRING_LIST) { free((void*) descriptor->descriptor->constraint.string_list); descriptor->descriptor->constraint.string_list = NULL; @@ -34,6 +43,21 @@ void _kds_s2000w_option_descriptor_descriptor_free(option_descriptor* descriptor descriptor = NULL; } +SANE_Status _kds_s2000w_option_descriptor_validate() +{ + if (descriptors == NULL) + return SANE_STATUS_NO_MEM; + + for (int i = 0; i < max_option_count; i++) { + if (descriptors[i]->descriptor == NULL) { + kds_s2000w_option_descriptors_free(); + return SANE_STATUS_NO_MEM; + } + } + + return SANE_STATUS_GOOD; +} + SANE_Option_Descriptor* _kds_s2000w_option_descriptor_num_options() { kds_s2000w_debug_printf(ALL, "kds_s2000w_option_descriptor_num_options"); @@ -1534,7 +1558,7 @@ SANE_Status _kds_s2000w_option_descriptors_init_min_profile() descriptors[11]->config_name = AUTOSTART; descriptors[11]->descriptor = _kds_s2000w_option_descriptor_autostart(); - return SANE_STATUS_GOOD; + return _kds_s2000w_option_descriptor_validate(); } SANE_Status _kds_s2000w_option_descriptors_init_230802_v1_0_36_profile() @@ -1607,7 +1631,7 @@ SANE_Status _kds_s2000w_option_descriptors_init_230802_v1_0_36_profile() descriptors[25]->config_name = AUTOSTART; descriptors[25]->descriptor = _kds_s2000w_option_descriptor_autostart(); - return SANE_STATUS_GOOD; + return _kds_s2000w_option_descriptor_validate(); } SANE_Status _kds_s2000w_option_descriptors_init_full_profile() @@ -1724,7 +1748,7 @@ SANE_Status _kds_s2000w_option_descriptors_init_full_profile() descriptors[47]->config_name = DOCUMENT_FEEDER_TIMEOUT_RESPONSE; descriptors[47]->descriptor = _kds_s2000w_option_descriptor_document_feeder_timeout_response(); - return SANE_STATUS_GOOD; + return _kds_s2000w_option_descriptor_validate(); } /******************************************************************************* @@ -1753,6 +1777,9 @@ void kds_s2000w_option_descriptors_free() { kds_s2000w_debug_printf(ALL, "kds_s2000w_option_descriptors_free"); + if (descriptors == NULL) + return; + for (int i = 0; i < max_option_count; i++) { _kds_s2000w_option_descriptor_descriptor_free(descriptors[i]); descriptors[i] = NULL; -- 2.47.3