Valgrind: fix "Invalid read" in test-exp-parser

The pointer passed to the gfec exception handler is
not valid after the exception handler ends

==382525== Invalid read of size 1
==382525==    at 0x484B050: memcpy@GLIBC_2.2.5 (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==382525==    by 0x531AB67: __printf_buffer_write (Xprintf_buffer_write.c:39)
==382525==    by 0x5322CD4: __printf_buffer (vfprintf-process-arg.c:501)
==382525==    by 0x53465F3: __vasprintf_internal (vasprintf.c:102)
==382525==    by 0x499C8C1: g_vasprintf (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==382525==    by 0x4969BE0: g_strdup_vprintf (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==382525==    by 0x494B2F6: g_logv (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==382525==    by 0x494B7A2: g_log (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==382525==    by 0x4862862: func_op (gnc-exp-parser.c:342)
==382525==    by 0x485D381: primary_exp (expression_parser.c:1222)
==382525==    by 0x485CE0F: multiply_divide_op (expression_parser.c:1028)
==382525==    by 0x485CC33: add_sub_op (expression_parser.c:968)
==382525==  Address 0xad387ec is 764 bytes inside a block of size 766 free'd
==382525==    at 0x484620F: free (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==382525==    by 0x4861D9B: gfec_apply (gfec.c:145)
==382525==    by 0x4862813: func_op (gnc-exp-parser.c:339)
==382525==    by 0x485D381: primary_exp (expression_parser.c:1222)
==382525==    by 0x485CE0F: multiply_divide_op (expression_parser.c:1028)
==382525==    by 0x485CC33: add_sub_op (expression_parser.c:968)
==382525==    by 0x485C9DE: assignment_op (expression_parser.c:886)
==382525==    by 0x485C101: parse_string (expression_parser.c:605)
==382525==    by 0x4862F07: gnc_exp_parser_parse_separate_vars (gnc-exp-parser.c:535)
==382525==    by 0x4862D60: gnc_exp_parser_parse (gnc-exp-parser.c:475)
==382525==    by 0x10A963: run_parser_test (test-exp-parser.c:94)
==382525==    by 0x10AB99: run_parser_tests (test-exp-parser.c:144)
==382525==  Block was alloc'd at
==382525==    at 0x4843738: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==382525==    by 0x4A81473: scm_realloc (in /usr/lib/x86_64-linux-gnu/libguile-3.0.so.1.5.0)
==382525==    by 0x4AEEF70: scm_to_utf8_stringn (in /usr/lib/x86_64-linux-gnu/libguile-3.0.so.1.5.0)
==382525==    by 0x55AA71F: gnc_scm_to_utf8_string (gnc-guile-utils.c:42)
==382525==    by 0x4861D4E: gfec_apply (gfec.c:136)
==382525==    by 0x4862813: func_op (gnc-exp-parser.c:339)
==382525==    by 0x485D381: primary_exp (expression_parser.c:1222)
==382525==    by 0x485CE0F: multiply_divide_op (expression_parser.c:1028)
==382525==    by 0x485CC33: add_sub_op (expression_parser.c:968)
==382525==    by 0x485C9DE: assignment_op (expression_parser.c:886)
==382525==    by 0x485C101: parse_string (expression_parser.c:605)
==382525==    by 0x4862F07: gnc_exp_parser_parse_separate_vars (gnc-exp-parser.c:535)
This commit is contained in:
Richard Cohen 2023-06-15 20:09:14 +01:00
parent b331ec974e
commit 958e9a4d6f

View File

@ -280,11 +280,10 @@ update_variables (var_store_ptr vars)
}
}
static char* _function_evaluation_error_msg = NULL;
static void
_exception_handler(const char *error_message)
{
_function_evaluation_error_msg = (char*)error_message;
PERR("function eval error: [%s]\n", error_message);
}
static
@ -335,14 +334,9 @@ func_op(const char *fname, int argc, void **argv)
scmArgs = scm_cons( scmTmp, scmArgs );
}
//scmTmp = scm_apply(scmFn, scmArgs , SCM_EOL);
scmTmp = gfec_apply(scmFn, scmArgs, _exception_handler);
if (_function_evaluation_error_msg != NULL)
{
PERR("function eval error: [%s]\n", _function_evaluation_error_msg);
_function_evaluation_error_msg = NULL;
if (scmTmp == SCM_UNDEFINED)
return NULL;
}
if (!scm_is_number (scmTmp))
{