Avoid relocating buffers while libxml2 reads its text

* src/xml.c (parse_region) [REL_ALLOC]: Freeze the ralloc arena
while libxml2 reads the current buffer's text.  (Bug#24764)
This commit is contained in:
Eli Zaretskii 2016-10-23 19:52:56 +03:00
parent 1b3fc8ab49
commit 71ca4f6a43

View file

@ -202,6 +202,11 @@ parse_region (Lisp_Object start, Lisp_Object end, Lisp_Object base_url,
} }
buftext = BYTE_POS_ADDR (istart_byte); buftext = BYTE_POS_ADDR (istart_byte);
#ifdef REL_ALLOC
/* Prevent ralloc.c from relocating the current buffer while libxml2
functions below read its text. */
r_alloc_inhibit_buffer_relocation (1);
#endif
if (htmlp) if (htmlp)
doc = htmlReadMemory ((char *)buftext, doc = htmlReadMemory ((char *)buftext,
iend_byte - istart_byte, burl, "utf-8", iend_byte - istart_byte, burl, "utf-8",
@ -214,6 +219,9 @@ parse_region (Lisp_Object start, Lisp_Object end, Lisp_Object base_url,
XML_PARSE_NONET|XML_PARSE_NOWARNING| XML_PARSE_NONET|XML_PARSE_NOWARNING|
XML_PARSE_NOBLANKS |XML_PARSE_NOERROR); XML_PARSE_NOBLANKS |XML_PARSE_NOERROR);
#ifdef REL_ALLOC
r_alloc_inhibit_buffer_relocation (0);
#endif
/* If the assertion below fails, malloc was called inside the above /* If the assertion below fails, malloc was called inside the above
libxml2 functions, and ralloc.c caused relocation of buffer text, libxml2 functions, and ralloc.c caused relocation of buffer text,
so we could have read from unrelated memory. */ so we could have read from unrelated memory. */