Skip to content

Commit

Permalink
Fix GH-17223: Memory leak in libxml encoding handling
Browse files Browse the repository at this point in the history
This was a bug in both libxml and PHP.
We follow up with the same change as done in GNOME/libxml@b3871dd138.

Changing away from `xmlOutputBufferCreateFilenameDefault` is not
possible yet because this is a stable branch and would break BC.

Closes GH-17254.
  • Loading branch information
nielsdos committed Dec 26, 2024
1 parent 99a14b8 commit 7be950f
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 3 deletions.
3 changes: 3 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ PHP NEWS
- Iconv:
. Fixed bug GH-17047 (UAF on iconv filter failure). (nielsdos)

- LibXML:
. Fixed bug GH-17223 (Memory leak in libxml encoding handling). (nielsdos)

- MBString:
. Fixed bug GH-17112 (Macro redefinitions). (nielsdos, cmb)

Expand Down
12 changes: 12 additions & 0 deletions ext/dom/tests/gh17223.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
--TEST--
GH-17223 (Memory leak in libxml encoding handling)
--EXTENSIONS--
dom
--FILE--
<?php
$doc = new DOMDocument("1.0", "Shift-JIS");
@$doc->save("%00");
echo "Done\n";
?>
--EXPECT--
Done
11 changes: 8 additions & 3 deletions ext/libxml/libxml.c
Original file line number Diff line number Diff line change
Expand Up @@ -590,11 +590,11 @@ php_libxml_output_buffer_create_filename(const char *URI,
char *unescaped = NULL;

if (URI == NULL)
return(NULL);
goto err;

if (strstr(URI, "%00")) {
php_error_docref(NULL, E_WARNING, "URI must not contain percent-encoded NUL bytes");
return NULL;
goto err;
}

puri = xmlParseURI(URI);
Expand All @@ -615,7 +615,7 @@ php_libxml_output_buffer_create_filename(const char *URI,
}

if (context == NULL) {
return(NULL);
goto err;
}

/* Allocate the Output buffer front-end. */
Expand All @@ -627,6 +627,11 @@ php_libxml_output_buffer_create_filename(const char *URI,
}

return(ret);

err:
/* Similarly to __xmlOutputBufferCreateFilename we should also close the encoder on failure. */
xmlCharEncCloseFunc(encoder);
return NULL;
}

static void _php_libxml_free_error(void *ptr)
Expand Down

0 comments on commit 7be950f

Please sign in to comment.