From 4baad26fd9931b3a7da9fb23cfe2c47d513c7940 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Tue, 26 Mar 2019 14:02:57 +0100 Subject: Fix leak of output buffer in _XSLTResultTree.write_output(). --- CHANGES.txt | 9 +++++++++ src/lxml/xslt.pxi | 23 +++++++++-------------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 0b1aa718..a3fe72c2 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -2,6 +2,15 @@ lxml changelog ============== +4.3.3 (2019-03-26) +================== + +Bugs fixed +---------- + +* Fix leak of output buffer and unclosed files in ``_XSLTResultTree.write_output()``. + + 4.3.2 (2019-02-29) ================== diff --git a/src/lxml/xslt.pxi b/src/lxml/xslt.pxi index d63a65ea..ee7b0719 100644 --- a/src/lxml/xslt.pxi +++ b/src/lxml/xslt.pxi @@ -720,7 +720,7 @@ cdef class _XSLTResultTree(_ElementTree): """ cdef _FilelikeWriter writer = None cdef _Document doc - cdef int r, c_compression + cdef int r, rclose, c_compression cdef const_xmlChar* c_encoding = NULL cdef tree.xmlOutputBuffer* c_buffer @@ -733,23 +733,18 @@ cdef class _XSLTResultTree(_ElementTree): if doc is None: raise XSLTSaveError("No document to serialise") c_compression = compression or 0 - if _isString(file): - file_path = _encodeFilename(file) - c_filename = _cstr(file_path) + xslt.LXML_GET_XSLT_ENCODING(c_encoding, self._xslt._c_style) + writer = _create_output_buffer(file, c_encoding, compression, &c_buffer, close=False) + if writer is None: with nogil: - r = xslt.xsltSaveResultToFilename( - c_filename, doc._c_doc, self._xslt._c_style, c_compression) - else: - xslt.LXML_GET_XSLT_ENCODING(c_encoding, self._xslt._c_style) - writer = _create_output_buffer(file, c_encoding, compression, &c_buffer, close=False) - if writer is None: - with nogil: - r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) - else: r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) + rclose = tree.xmlOutputBufferClose(c_buffer) + else: + r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) + rclose = tree.xmlOutputBufferClose(c_buffer) if writer is not None: writer._exc_context._raise_if_stored() - if r == -1: + if r < 0 or rclose < 0: python.PyErr_SetFromErrno(XSLTSaveError) # raises cdef _saveToStringAndSize(self, xmlChar** s, int* l): -- cgit v1.2.1