From 34621d78fbe0450f9b22a9765b46c42c89cd0542 Mon Sep 17 00:00:00 2001 From: Fabrice Le Fessant Date: Fri, 11 Oct 2024 19:22:14 +0200 Subject: [PATCH] Fix overlapping move between Alphanum and Display --- libcob/move.c | 10 ++++++++++ tests/testsuite.src/run_file.at | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/libcob/move.c b/libcob/move.c index 053bbf246..cc300bcd5 100644 --- a/libcob/move.c +++ b/libcob/move.c @@ -299,8 +299,15 @@ cob_move_alphanum_to_display (cob_field *f1, cob_field *f2) int sign; int count; int size; + unsigned char *tmp_src_data = NULL; /* Initialize */ + if ( (s1 >= s2 && s1 < e2) || (s2 >= s1 && s2 < e1) ){ + tmp_src_data = malloc (f1->size); + memcpy (tmp_src_data, s1, f1->size); + s1 = tmp_src_data; + e1 = s1 + f1->size; + } memset (f2->data, '0', f2->size); /* Skip white spaces */ @@ -359,11 +366,14 @@ cob_move_alphanum_to_display (cob_field *f1, cob_field *f2) } COB_PUT_SIGN (f2, sign); + if (tmp_src_data) free(tmp_src_data); return; error: memset (f2->data, '0', f2->size); COB_PUT_SIGN (f2, 0); + if (tmp_src_data) free(tmp_src_data); + return; } static void diff --git a/tests/testsuite.src/run_file.at b/tests/testsuite.src/run_file.at index 0cb8cf7dd..ee5d07a8d 100644 --- a/tests/testsuite.src/run_file.at +++ b/tests/testsuite.src/run_file.at @@ -14685,7 +14685,7 @@ AT_CHECK([$COMPILE prog.cob -o prog], [0], [], [prog.cob:16: warning: overlapping MOVE may produce unpredictable results ]) -AT_CHECK([./prog], [0], [00000 +AT_CHECK([./prog], [0], [01234 ]) AT_CLEANUP