Package: esorex Version: 3.13.2+dfsg-1 Severity: normal Tags: upstream patch User: [email protected] Usertags: riscv64
esorex fail to build from source on riscv64 due to two failures in the testsuite: | PASS: esorex_json_parse_errors1-test | ../../admin/test-driver: line 107: 2130 Aborted "$@" > $log_file 2>&1 | FAIL: esorex_json-test | PASS: esorex_json_parser-test | PASS: esorex_json_parse_errors2-test | PASS: esorex_json_parse_errors3-test | ../../admin/test-driver: line 107: 2133 Aborted "$@" > $log_file 2>&1 | FAIL: esorex_json_internal-test | PASS: esorex_json_parse_errors4-test | PASS: esorex_python_errors1-test | PASS: esorex_python_errors2-test | PASS: esorex_python_errors4-test | SKIP: esorex_python_recipe-test | PASS: esorex_python-test | PASS: esorex_python_errors3-test | PASS: esorex_python_internal-test A full build log is available there: https://buildd.debian.org/status/fetch.php?pkg=esorex&arch=riscv64&ver=3.13.2%2Bdfsg-1&stamp=1564942941&raw=0 After some debugging I have found that libffi is called incorrectly in src/er_json.c. The ffi_prep_cif() function is used to prepare a call to cpl_parameter_new_enum(), however this function is a variadic function. In that case depending on the architecture, the arguments, and their order the ABI might be slightly different. That's why ffi_prep_cif_var must be used instead for variadic functions. See the libffi manual for more details: http://www.chiark.greenend.org.uk/doc/libffi-dev/html/The-Basics.html ffi_prep_cif_var() takes the number of fixed arguments, 4 in the case of cpl_parameter_new_enum(), and the total number of arguments just like ffi_prep_cif(). Therefore here is a small patch fixing the issue: --- esorex-3.13.2+dfsg.orig/src/er_json.c +++ esorex-3.13.2+dfsg/src/er_json.c @@ -3714,8 +3714,8 @@ static cpl_parameter * json_to_parameter || type == CPL_TYPE_STRING); break; } - if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, nargs, &ffi_type_pointer, - argtypes) + if (ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 4, nargs, + &ffi_type_pointer, argtypes) == FFI_OK) { ffi_call(&cif, (void (*)(void))&cpl_parameter_new_enum, ¶m, With it the testsuite fully passes on riscv64, and I also see no regression on amd64. Regards, Aurelien

