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;
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");
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()
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()
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();
}
/*******************************************************************************
{
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;