From e3952e3ebefd3674443635815704ede59922b4dd Mon Sep 17 00:00:00 2001 From: Bastian Dehn Date: Sat, 11 Oct 2025 11:13:46 +0200 Subject: [PATCH] change option descriptor no mem return --- src/kds_s2000w_net.c | 3 +- src/kds_s2000w_option_descriptors.c | 46 ++++++++++++++++++---- src/kds_s2000w_option_descriptors.h | 2 +- tests/kds_s2000w_option_descriptor_tests.c | 4 +- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/kds_s2000w_net.c b/src/kds_s2000w_net.c index 6a184d9..9d8b7de 100644 --- a/src/kds_s2000w_net.c +++ b/src/kds_s2000w_net.c @@ -90,8 +90,7 @@ SANE_Status sane_kds_s2000w_net_open(SANE_String_Const devicename, return SANE_STATUS_DEVICE_BUSY; } - kds_s2000w_option_descriptors_init(h->profile); - return SANE_STATUS_GOOD; + return kds_s2000w_option_descriptors_init(h->profile); } void sane_kds_s2000w_net_close(SANE_Handle handle) diff --git a/src/kds_s2000w_option_descriptors.c b/src/kds_s2000w_option_descriptors.c index 545ef07..4e921ae 100644 --- a/src/kds_s2000w_option_descriptors.c +++ b/src/kds_s2000w_option_descriptors.c @@ -1492,13 +1492,21 @@ SANE_Option_Descriptor* _kds_s2000w_option_descriptor_document_feeder_timeout_re /******************************************************************************* * profiles ******************************************************************************/ -void _kds_s2000w_option_descriptors_init_min_profile() +SANE_Status _kds_s2000w_option_descriptors_init_min_profile() { max_option_count = PROFILE_MIN_MAX_OPTION_COUNT; descriptors = malloc(sizeof(option_descriptor*) * max_option_count); + if (descriptors == NULL) + return SANE_STATUS_NO_MEM; + for (int i = 0; i < max_option_count; i++) { descriptors[i] = malloc(sizeof(option_descriptor)); + if (descriptors[i] == NULL) { + kds_s2000w_option_descriptors_free(descriptors); + descriptors = NULL; + return SANE_STATUS_NO_MEM; + } } descriptors[0]->config_name = OPTION_COUNT; @@ -1525,15 +1533,25 @@ void _kds_s2000w_option_descriptors_init_min_profile() descriptors[10]->descriptor = _kds_s2000w_option_descriptor_feeder_group(); descriptors[11]->config_name = AUTOSTART; descriptors[11]->descriptor = _kds_s2000w_option_descriptor_autostart(); + + return SANE_STATUS_GOOD; } -void _kds_s2000w_option_descriptors_init_230802_v1_0_36_profile() +SANE_Status _kds_s2000w_option_descriptors_init_230802_v1_0_36_profile() { max_option_count = PROFILE_230802_V1_0_36_MAX_OPTION_COUNT; descriptors = malloc(sizeof(option_descriptor*) * max_option_count); + if (descriptors == NULL) + return SANE_STATUS_NO_MEM; + for (int i = 0; i < max_option_count; i++) { descriptors[i] = malloc(sizeof(option_descriptor)); + if (descriptors[i] == NULL) { + kds_s2000w_option_descriptors_free(descriptors); + descriptors = NULL; + return SANE_STATUS_NO_MEM; + } } descriptors[0]->config_name = OPTION_COUNT; @@ -1588,15 +1606,25 @@ void _kds_s2000w_option_descriptors_init_230802_v1_0_36_profile() descriptors[24]->descriptor = _kds_s2000w_option_descriptor_feeder_group(); descriptors[25]->config_name = AUTOSTART; descriptors[25]->descriptor = _kds_s2000w_option_descriptor_autostart(); + + return SANE_STATUS_GOOD; } -void _kds_s2000w_option_descriptors_init_full_profile() +SANE_Status _kds_s2000w_option_descriptors_init_full_profile() { max_option_count = PROFILE_FULL_MAX_OPTION_COUNT; descriptors = malloc(sizeof(option_descriptor*) * max_option_count); + if (descriptors == NULL) + return SANE_STATUS_NO_MEM; + for (int i = 0; i < max_option_count; i++) { descriptors[i] = malloc(sizeof(option_descriptor)); + if (descriptors[i] == NULL) { + kds_s2000w_option_descriptors_free(descriptors); + descriptors = NULL; + return SANE_STATUS_NO_MEM; + } } descriptors[0]->config_name = OPTION_COUNT; @@ -1695,26 +1723,30 @@ void _kds_s2000w_option_descriptors_init_full_profile() descriptors[46]->descriptor = _kds_s2000w_option_descriptor_document_feeder_timeout(); descriptors[47]->config_name = DOCUMENT_FEEDER_TIMEOUT_RESPONSE; descriptors[47]->descriptor = _kds_s2000w_option_descriptor_document_feeder_timeout_response(); + + return SANE_STATUS_GOOD; } /******************************************************************************* * public methods ******************************************************************************/ -void kds_s2000w_option_descriptors_init(uint8_t profile) +SANE_Status kds_s2000w_option_descriptors_init(uint8_t profile) { kds_s2000w_debug_printf(ALL, "kds_s2000w_option_descriptors_init"); switch (profile) { case PROFILE_FULL: - _kds_s2000w_option_descriptors_init_full_profile(); + return _kds_s2000w_option_descriptors_init_full_profile(); break; case PROFILE_230802_V1_0_36: - _kds_s2000w_option_descriptors_init_230802_v1_0_36_profile(); + return _kds_s2000w_option_descriptors_init_230802_v1_0_36_profile(); break; default: - _kds_s2000w_option_descriptors_init_min_profile(); + return _kds_s2000w_option_descriptors_init_min_profile(); break; } + + return SANE_STATUS_INVAL; } void kds_s2000w_option_descriptors_free() diff --git a/src/kds_s2000w_option_descriptors.h b/src/kds_s2000w_option_descriptors.h index 37410ff..3f2be1e 100644 --- a/src/kds_s2000w_option_descriptors.h +++ b/src/kds_s2000w_option_descriptors.h @@ -69,7 +69,7 @@ typedef struct { SANE_Option_Descriptor* descriptor; } option_descriptor; -void kds_s2000w_option_descriptors_init(uint8_t profile); +SANE_Status kds_s2000w_option_descriptors_init(uint8_t profile); void kds_s2000w_option_descriptors_free(); uint8_t kds_s2000w_option_descriptors_get_max_option_count(); diff --git a/tests/kds_s2000w_option_descriptor_tests.c b/tests/kds_s2000w_option_descriptor_tests.c index 5682233..eadb364 100644 --- a/tests/kds_s2000w_option_descriptor_tests.c +++ b/tests/kds_s2000w_option_descriptor_tests.c @@ -10,9 +10,7 @@ int setup(void** state) { - kds_s2000w_option_descriptors_init(PROFILE_FULL); - - return 0; + return kds_s2000w_option_descriptors_init(PROFILE_FULL); } int teardown(void **state) -- 2.47.3