From 28228e7272b84ab03ab3b86becd57d69eed1dbfb Mon Sep 17 00:00:00 2001 From: Bastian Dehn Date: Fri, 23 Feb 2024 17:30:22 +0100 Subject: [PATCH] fix read empty data with test --- src/kds_s2000w_handler.c | 40 ++++++++++++++++++++----------- src/kds_s2000w_handler.h | 2 ++ src/kds_s2000w_net.c | 10 ++++---- tests/kds_s2000w_net_read_tests.c | 39 ++++++++++++++++++++++++++++++ tests/runtests.c | 2 ++ 5 files changed, 75 insertions(+), 18 deletions(-) diff --git a/src/kds_s2000w_handler.c b/src/kds_s2000w_handler.c index bd5eec9..e618767 100644 --- a/src/kds_s2000w_handler.c +++ b/src/kds_s2000w_handler.c @@ -155,12 +155,8 @@ void _get_current_scan_status(handler* h) sleep(1); } -void kds_s2000w_handler_open(const char* devicename, void** handle) +handler* init_handler() { - debug_printf(ALL, "kds_s2000w_handler_open"); - if (strcmp(devicename, "kds_s2000w_net") != 0) - return; - handler* h = malloc(sizeof(handler)); h->current_scan_status = malloc(sizeof(scan_status)); h->current_metadata = malloc(sizeof(metadata)); @@ -188,6 +184,30 @@ void kds_s2000w_handler_open(const char* devicename, void** handle) h->read_info->readed_bytes_per_line = 0; h->read_info->readed_lines = 0; + return h; +} + +void free_handler(handler* h) +{ + free(h->current_scan_status); + h->current_scan_status = NULL; + free(h->current_metadata->image); + h->current_metadata->image = NULL; + free(h->current_metadata); + h->current_metadata = NULL; + free(h->read_info); + h->read_info = NULL; + free(h); + h = NULL; +} + +void kds_s2000w_handler_open(const char* devicename, void** handle) +{ + debug_printf(ALL, "kds_s2000w_handler_open"); + if (strcmp(devicename, "kds_s2000w_net") != 0) + return; + + handler* h = init_handler(); *handle = h; init_gamma_table(); @@ -252,15 +272,7 @@ void kds_s2000w_handler_close(void* handle) kds_s2000w_client_close_session(h->sessionid); h->sessionid = 0; - free(h->current_scan_status); - h->current_scan_status = NULL; - free(h->current_metadata->image); - h->current_metadata->image = NULL; - free(h->read_info); - h->read_info = NULL; - free(h->current_metadata); - h->current_metadata = NULL; - free(h); + free_handler(h); h = NULL; } diff --git a/src/kds_s2000w_handler.h b/src/kds_s2000w_handler.h index 6f1798f..fdf6a66 100644 --- a/src/kds_s2000w_handler.h +++ b/src/kds_s2000w_handler.h @@ -47,6 +47,8 @@ typedef struct { readinfo* read_info; } handler; +handler* init_handler(); +void free_handler(handler* h); void kds_s2000w_handler_open(const char* devicename, void** handle); void kds_s2000w_handler_close(void* handle); void kds_s2000w_handler_get_option(void* handle, int option, void* value); diff --git a/src/kds_s2000w_net.c b/src/kds_s2000w_net.c index 6a15bdc..ad80a36 100644 --- a/src/kds_s2000w_net.c +++ b/src/kds_s2000w_net.c @@ -182,11 +182,13 @@ SANE_Status _sane_kds_s2000w_net_read(SANE_Handle handle, SANE_Byte* data, sleep(1); kds_s2000w_handler_open("kds_s2000w_net", handle); return SANE_STATUS_CANCELLED; - } + } - int skip_header_bytes = _sane_kds_s2000w_net_find_first_data_byte(h->current_metadata->image); - if (h->read_info->read_size <= 0) - h->read_info->read_size += skip_header_bytes; + if (h->current_metadata->image != NULL) { + int skip_header_bytes = _sane_kds_s2000w_net_find_first_data_byte(h->current_metadata->image); + if (h->read_info->read_size <= 0) + h->read_info->read_size += skip_header_bytes; + } if (h->read_info->readed_lines >= h->current_metadata->lines) { *length = 0; diff --git a/tests/kds_s2000w_net_read_tests.c b/tests/kds_s2000w_net_read_tests.c index 1324843..acc35ea 100644 --- a/tests/kds_s2000w_net_read_tests.c +++ b/tests/kds_s2000w_net_read_tests.c @@ -37,6 +37,45 @@ START_TEST(sane_kds_s2000w_net_read_cancel_test) } END_TEST +START_TEST(sane_kds_s2000w_net_read_without_data) +{ + int length = 0; + handler* h = init_handler(); + char* dataptr = malloc(sizeof(char)); + + SANE_Status status = _sane_kds_s2000w_net_read(h, dataptr, 65536, &length); + + ck_assert_int_eq(status, SANE_STATUS_EOF); + + free(dataptr); + dataptr = NULL; + free_handler(h); + h = NULL; +} +END_TEST + +START_TEST(sane_kds_s2000w_net_read_empty_image) +{ + int length = 0; + handler* h = init_handler(); + h->current_metadata->size = 1; + char* image = malloc(sizeof(char)); + image[0] = 0; + h->current_metadata->image = image; + char* dataptr = malloc(sizeof(char)); + + SANE_Status status = _sane_kds_s2000w_net_read(h, dataptr, 65536, &length); + + ck_assert_int_eq(status, SANE_STATUS_EOF); + + free(dataptr); + dataptr = NULL; + image = NULL; + free_handler(h); + h = NULL; +} +END_TEST + START_TEST(sane_kds_s2000w_net_read_all_lines_test) { handler h; diff --git a/tests/runtests.c b/tests/runtests.c index 696c6cd..69b0c8c 100644 --- a/tests/runtests.c +++ b/tests/runtests.c @@ -24,6 +24,8 @@ Suite* net_read() TCase* net_read = tcase_create("read"); tcase_add_test(net_read, sane_kds_s2000w_net_find_first_data_byte_test); tcase_add_test(net_read, sane_kds_s2000w_net_read_cancel_test); + tcase_add_test(net_read, sane_kds_s2000w_net_read_without_data); + tcase_add_test(net_read, sane_kds_s2000w_net_read_empty_image); tcase_add_test(net_read, sane_kds_s2000w_net_read_all_lines_test); tcase_add_test(net_read, sane_kds_s2000w_net_read_test); tcase_add_test(net_read, sane_kds_s2000w_net_read_bytes_per_line_bigger_test); -- 2.39.5