Skip to content

Commit bb6c1e7

Browse files
committed
resolve some issues arounf VM zero, add tests
See #51
1 parent 827126b commit bb6c1e7

File tree

2 files changed

+86
-1
lines changed

2 files changed

+86
-1
lines changed

src/dicom.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,18 @@
2626

2727
void *dcm_calloc(DcmError **error, size_t n, size_t size)
2828
{
29-
void *result = calloc(n, size);
29+
/* malloc(0) behaviour depends on the platform heap implementation. It can
30+
* return either a valid pointer that can't be dereferenced, or NULL.
31+
*
32+
* We need to be able to support dcm_calloc(0), since VM == 0 is allowed,
33+
* but we can't return NULL in this case, since that's how we detect
34+
* out of memory.
35+
*
36+
* Instead, force n == 0 to n == 1. This means we will always get a valid
37+
* pointer from calloc, a NULL return always means out of memory, and we
38+
* can always free the result.
39+
*/
40+
void *result = calloc(n == 0 ? 1 : n, size);
3041
if (!result) {
3142
dcm_error_set(error, DCM_ERROR_CODE_NOMEM,
3243
"Out of memory",

tests/check_dicom.c

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,27 @@ START_TEST(test_element_CS_multivalue)
294294
END_TEST
295295

296296

297+
START_TEST(test_element_CS_multivalue_empty)
298+
{
299+
uint32_t tag = 0x00080008;
300+
uint32_t vm = 0;
301+
302+
char **values = malloc(vm * sizeof(char *));
303+
304+
DcmElement *element = dcm_element_create(NULL, tag, DCM_VR_CS);
305+
(void) dcm_element_set_value_string_multi(NULL, element, values, vm, true);
306+
307+
ck_assert_int_eq(dcm_element_get_tag(element), tag);
308+
ck_assert_int_eq(dcm_element_get_vr(element), DCM_VR_CS);
309+
ck_assert_int_eq(dcm_element_get_length(element),
310+
compute_length_of_string_value_multi(values, vm));
311+
ck_assert_int_eq(dcm_element_is_multivalued(element), false);
312+
313+
dcm_element_destroy(element);
314+
}
315+
END_TEST
316+
317+
297318
START_TEST(test_element_DS)
298319
{
299320
uint32_t tag = 0x0040072A;
@@ -474,6 +495,56 @@ START_TEST(test_element_US)
474495
END_TEST
475496

476497

498+
START_TEST(test_element_US_multivalue)
499+
{
500+
uint32_t tag = 0x00280010;
501+
uint16_t value[] = {512, 513, 514, 515};
502+
uint32_t vm = sizeof(value) / sizeof(value[0]);
503+
504+
DcmElement *element = dcm_element_create(NULL, tag, DCM_VR_US);
505+
(void) dcm_element_set_value_numeric_multi(NULL,
506+
element, (int*) value, vm, false);
507+
508+
ck_assert_int_eq(dcm_element_get_tag(element), tag);
509+
ck_assert_int_eq(dcm_element_get_vr(element), DCM_VR_US);
510+
ck_assert_int_eq(dcm_element_get_length(element), sizeof(value));
511+
ck_assert_int_eq(dcm_element_is_multivalued(element), true);
512+
513+
for (uint32_t i = 0; i < vm; i++) {
514+
int64_t integer;
515+
(void) dcm_element_get_value_integer(NULL, element, i, &integer);
516+
ck_assert_int_eq(value[i], integer);
517+
}
518+
519+
dcm_element_print(element, 0);
520+
521+
dcm_element_destroy(element);
522+
}
523+
END_TEST
524+
525+
526+
START_TEST(test_element_US_multivalue_empty)
527+
{
528+
uint32_t tag = 0x00280010;
529+
uint16_t value[] = {};
530+
uint32_t vm = sizeof(value) / sizeof(value[0]);
531+
532+
DcmElement *element = dcm_element_create(NULL, tag, DCM_VR_US);
533+
(void) dcm_element_set_value_numeric_multi(NULL,
534+
element, (int*) &value, vm, false);
535+
536+
ck_assert_int_eq(dcm_element_get_tag(element), tag);
537+
ck_assert_int_eq(dcm_element_get_vr(element), DCM_VR_US);
538+
ck_assert_int_eq(dcm_element_get_length(element), sizeof(value));
539+
ck_assert_int_eq(dcm_element_is_multivalued(element), false);
540+
541+
dcm_element_print(element, 0);
542+
543+
dcm_element_destroy(element);
544+
}
545+
END_TEST
546+
547+
477548
START_TEST(test_sequence)
478549
{
479550
DcmElement *element;
@@ -738,13 +809,16 @@ static Suite *create_data_suite(void)
738809
tcase_add_test(element_case, test_element_AE);
739810
tcase_add_test(element_case, test_element_AS);
740811
tcase_add_test(element_case, test_element_CS_multivalue);
812+
tcase_add_test(element_case, test_element_CS_multivalue_empty);
741813
tcase_add_test(element_case, test_element_DS);
742814
tcase_add_test(element_case, test_element_IS);
743815
tcase_add_test(element_case, test_element_ST);
744816
tcase_add_test(element_case, test_element_SQ);
745817
tcase_add_test(element_case, test_element_SQ_empty);
746818
tcase_add_test(element_case, test_element_UI);
747819
tcase_add_test(element_case, test_element_US);
820+
tcase_add_test(element_case, test_element_US_multivalue);
821+
tcase_add_test(element_case, test_element_US_multivalue_empty);
748822
suite_add_tcase(suite, element_case);
749823

750824
TCase *dataset_case = tcase_create("dataset");

0 commit comments

Comments
 (0)