Skip to content

Commit

Permalink
Fix order of initialization for threading on Windows with libxml2 2.1…
Browse files Browse the repository at this point in the history
…1.4 (GH-370)

This fixes an Access Violation on Windows when using a shared build of libxml2 2.11.4.

Stacktrace:

 	ntdll.dll!RtlpWaitOnCriticalSection()  + 0xa6 Bytes	
 	ntdll.dll!RtlpEnterCriticalSectionContended()  + 0x1c4 Bytes	
 	ntdll.dll!RtlEnterCriticalSection()  + 0x42 Bytes	
>	libxml2.dll!xmlRMutexLock(_xmlRMutex * tok=0x0000000002fea170)  Zeile 234	C
 	libxml2.dll!xmlThrDefIndentTreeOutput(int v=0)  Zeile 934	C
 	etree.pyd!00000000037fc566() 	
 	python27.dll!_PyImport_LoadDynamicModule(char * name=0x0000000002fe4408, char * pathname=0x000000005a49c660, _iobuf * fp=0x0000000002839880)  Zeile 54	C

libxml2 changed the mutex initialization in this commit:
https://gitlab.gnome.org/GNOME/libxml2/-/commit/65d381f32c0d2cb2361055fddbd5c4a9119031d1

xmlThrDefIndentTreeOutput tries to use the global Mutex, but this is only initialized by xmlInitParser(), so it crashes due to wrong initialization order.
  • Loading branch information
schlenk committed May 25, 2023
1 parent bf03e45 commit 53eb0f8
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions src/lxml/etree.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -142,15 +142,15 @@ cdef struct qname:
const_xmlChar* c_name
python.PyObject* href

# initialize parser (and threading)
xmlparser.xmlInitParser()

# global per-thread setup
tree.xmlThrDefIndentTreeOutput(1)
tree.xmlThrDefLineNumbersDefaultValue(1)

_initThreadLogging()

# initialize parser (and threading)
xmlparser.xmlInitParser()

# filename encoding
cdef bytes _FILENAME_ENCODING = (sys.getfilesystemencoding() or sys.getdefaultencoding() or 'ascii').encode("UTF-8")
cdef char* _C_FILENAME_ENCODING = _cstr(_FILENAME_ENCODING)
Expand Down

0 comments on commit 53eb0f8

Please sign in to comment.