From: Bastian Dehn Date: Sat, 18 May 2024 06:35:40 +0000 (+0200) Subject: add test for empty image header X-Git-Tag: v1.0.3^2~7 X-Git-Url: https://gitweb.hhaalo.de/?a=commitdiff_plain;h=2ec202d09422e3db9ac4823e1ba4b1133bc32522;p=sane-kds-s2000w-net.git add test for empty image header --- diff --git a/src/kds_s2000w_net.c b/src/kds_s2000w_net.c index 593ac3a..480c637 100644 --- a/src/kds_s2000w_net.c +++ b/src/kds_s2000w_net.c @@ -9,9 +9,10 @@ #include "kds_s2000w_handler.h" #include "kds_s2000w_debug.h" -int _sane_kds_s2000w_net_find_first_data_byte(const char* data) +int _sane_kds_s2000w_net_find_first_data_byte(imagedata* image) { debug_printf(ALL, "sane_kds_s2000w_net_find_first_data_byte"); + char* data = image->data; int header_spaces = 3; if (strncmp(data, "P4", 2) == 0) @@ -21,10 +22,9 @@ int _sane_kds_s2000w_net_find_first_data_byte(const char* data) int space_count = 0; int byte_count = 0; - while(space_count < header_spaces) { - if (data[byte_count] == space) { + while(space_count < header_spaces && byte_count < image->size) { + if (data[byte_count] == space) space_count++; - } byte_count++; } @@ -215,6 +215,15 @@ SANE_Status _sane_kds_s2000w_net_read(SANE_Handle handle, SANE_Byte* data, return SANE_STATUS_CANCELLED; } + // calc max length + *length = h->pnm_image->size - h->read_info->read_size; + if (*length > max_length) + *length = max_length; + + // read image + if (h->pnm_image->data != NULL && h->read_info->read_size <= 0) + h->read_info->read_size += _sane_kds_s2000w_net_find_first_data_byte(h->pnm_image); + // last frame if (h->read_info->read_size >= h->pnm_image->size) { *length = 0; @@ -228,15 +237,6 @@ SANE_Status _sane_kds_s2000w_net_read(SANE_Handle handle, SANE_Byte* data, return SANE_STATUS_EOF; } - // calc max length - *length = h->pnm_image->size - h->read_info->read_size; - if (*length > max_length) - *length = max_length; - - // read image - if (h->pnm_image->data != NULL && h->read_info->read_size <= 0) - h->read_info->read_size += _sane_kds_s2000w_net_find_first_data_byte(h->pnm_image->data); - memcpy(data, h->pnm_image->data + h->read_info->read_size, *length); h->read_info->read_size += *length; diff --git a/tests/kds_s2000w_net_read_tests.c b/tests/kds_s2000w_net_read_tests.c index 4463ed7..81fa72e 100644 --- a/tests/kds_s2000w_net_read_tests.c +++ b/tests/kds_s2000w_net_read_tests.c @@ -80,6 +80,37 @@ void sane_kds_s2000w_net_read_empty_image() h = NULL; } +void sane_kds_s2000w_net_read_without_header_test() +{ + handler* h = init_handler(); + h->pnm_image->size = 65536; + h->pnm_image->data = malloc(sizeof(char) * 65536); + char* imagedata = (char*) h->pnm_image->data; + for (int i = 0; i < 65536; i++) { + imagedata[i] = 0xff; + } + + SANE_Int maxlen = 65536; + char* dataptr = malloc(sizeof(char) * maxlen); + SANE_Int* length = malloc(sizeof(SANE_Int)); + + SANE_Status status = _sane_kds_s2000w_net_read(h, (void*) dataptr, maxlen, length); + + assert_int_equal(*length, 0); + assert_null(h->pnm_image->data); + assert_int_equal(h->read_info->read_size, 65536); + assert_int_equal(status, SANE_STATUS_EOF); + + free(dataptr); + dataptr = NULL; + free(length); + length = NULL; + free(h->pnm_image->data); + h->pnm_image->data = NULL; + free_handler(h); + h = NULL; +} + void sane_kds_s2000w_net_read_test() { handler* h = init_handler(); diff --git a/tests/kds_s2000w_net_read_tests.h b/tests/kds_s2000w_net_read_tests.h index 8b375b4..b306155 100644 --- a/tests/kds_s2000w_net_read_tests.h +++ b/tests/kds_s2000w_net_read_tests.h @@ -9,6 +9,7 @@ void sane_kds_s2000w_net_read_cancel_test(); void sane_kds_s2000w_net_read_without_data(); void sane_kds_s2000w_net_read_empty_image(); +void sane_kds_s2000w_net_read_without_header_test(); void sane_kds_s2000w_net_read_test(); void sane_kds_s2000w_net_read_bw_test(); void sane_kds_s2000w_net_read_bytes_per_line_bigger_test(); diff --git a/tests/kds_s2000w_net_read_tests_run.c b/tests/kds_s2000w_net_read_tests_run.c index 4950a01..47cef1d 100644 --- a/tests/kds_s2000w_net_read_tests_run.c +++ b/tests/kds_s2000w_net_read_tests_run.c @@ -6,6 +6,7 @@ int main() cmocka_unit_test(sane_kds_s2000w_net_read_cancel_test), cmocka_unit_test(sane_kds_s2000w_net_read_without_data), cmocka_unit_test(sane_kds_s2000w_net_read_empty_image), + cmocka_unit_test(sane_kds_s2000w_net_read_without_header_test), cmocka_unit_test(sane_kds_s2000w_net_read_test), cmocka_unit_test(sane_kds_s2000w_net_read_bw_test), cmocka_unit_test(sane_kds_s2000w_net_read_bytes_per_line_bigger_test)