Bug #5542
closedPython example causes segmentation error
100%
Description
The following python script causes a segmentation error:
from saxonc import *
with PySaxonProcessor(license=False) as proc:
print(proc.version)
xdmAtomicval = proc.make_boolean_value(False)
xsltproc = proc.new_xslt30_processor()
executable = xsltproc.compile_stylesheet(stylesheet_file="test.xsl")
executable.set_result_as_raw_value(True)
executable.set_initial_match_selection(file_name="cat.xml")
xdm_atomic_value = proc.make_integer_value(5)
executable.set_parameter("param",proc.make_string_value("text"))
executable.set_parameter("param2",xdm_atomic_value)
result = executable.apply_templates_returning_string()
print(result)
Running under gdb we get some insight as to where the segmentation fault occurs:
SaxonC-HE 11.3 from Saxonica
Thread 1 "python3" received signal SIGSEGV, Segmentation fault.
0x00007ffff7481bdb in SaxonProcessor::createParameterJArray (parameters=std::map with 2 elements = {...}, properties=std::map with 2 elements = {...},
additions=additions@entry=0) at ../SaxonProcessor.cpp:543
543 SaxonProcessor::sxn_environ->env->SetObjectArrayElement(comboArrays.objectArray, i,
(gdb) bt
#0 0x00007ffff7481bdb in SaxonProcessor::createParameterJArray (parameters=std::map with 2 elements = {...}, properties=std::map with 2 elements = {...},
additions=additions@entry=0) at ../SaxonProcessor.cpp:543
#1 0x00007ffff749da78 in XsltExecutable::applyTemplatesReturningString (this=0xfd8270) at /usr/include/c++/9/bits/stl_tree.h:129
#2 0x00007ffff7478832 in __pyx_pf_6saxonc_16PyXsltExecutable_50apply_templates_returning_string (__pyx_v_self=0x7ffff7557e50, __pyx_v_kwds=<optimised out>)
at saxonc.cpp:22186
#3 __pyx_pw_6saxonc_16PyXsltExecutable_51apply_templates_returning_string (__pyx_v_self=0x7ffff7557e50, __pyx_args=<optimised out>, __pyx_kwds=<optimised out>)
at saxonc.cpp:21831
#4 0x0000000000503b99 in ?? ()
#5 0x000000000056b1da in _PyEval_EvalFrameDefault ()
#6 0x000000000056939a in _PyEval_EvalCodeWithName ()
#7 0x000000000068d047 in PyEval_EvalCode ()
#8 0x000000000067e351 in ?? ()
#9 0x000000000067e3cf in ?? ()
#10 0x000000000067e471 in ?? ()
#11 0x000000000067e817 in PyRun_SimpleFileExFlags ()
#12 0x00000000006b6fe2 in Py_RunMain ()
#13 0x00000000006b736d in Py_BytesMain ()
#14 0x00007ffff7de8083 in __libc_start_main (main=0x4eead0 <main>, argc=2, argv=0x7fffffffe1c8, init=<optimised out>, fini=<optimised out>, rtld_fini=<optimised out>,
stack_end=0x7fffffffe1b8) at ../csu/libc-start.c:308
#15 0x00000000005fa5ce in _start ()
Related issues
Updated by O'Neil Delpratt over 2 years ago
The workaround is to replace the following code:
executable.set_parameter("param",proc.make_string_value("text"))
With the below code which creates a variable for the XdmAtomicValue:
value1= proc.make_string_value("text")
executable.set_parameter("param",value1)
Updated by O'Neil Delpratt over 2 years ago
This bug issue looks the same as the following: #5533
Updated by O'Neil Delpratt over 2 years ago
- Related to Bug #5533: segfault when setting xslt parameter in a loop added
Updated by O'Neil Delpratt over 2 years ago
- Related to Bug #5452: set_source and set_output_file functions don't exists but are in examples added
Updated by O'Neil Delpratt over 2 years ago
- Status changed from New to Resolved
- % Done changed from 0 to 100
During the debugging phase the Python sys.getrefcount(object)
was useful to check for objects not used anywhere else.
The fix was to add the C++ XdmValue.incrementRefCount()
method call in the PyXsltExecutable.set_parameter
.
This prevents the Python garbage collection mechanism from deleting the PyXdmValue before it is used in the internal processor.
Bug fix committed on the saxon11 and main branches.
Updated by O'Neil Delpratt over 2 years ago
- Status changed from Resolved to Closed
- Fixed in version set to 11.4
Bug fix applied in the SaxonC 11.4 maintenance release.
Please register to edit this issue