]> gitweb.hhaalo.de Git - sane-kds-s2000w-net.git/commitdiff
validate option descriptors
authorBastian Dehn <hhaalo@arcor.de>
Sat, 11 Oct 2025 09:45:31 +0000 (11:45 +0200)
committerBastian Dehn <hhaalo@arcor.de>
Sat, 11 Oct 2025 09:45:31 +0000 (11:45 +0200)
src/kds_s2000w_option_descriptors.c

index 4e921ae03c6a3876aaa2c14f38a8b96f12b3b6d5..3b948eb2252f63a22cc304fadced34cbb2b38627 100644 (file)
@@ -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;