Hello…
The following Rivet/Tcl code will reliably crash Apache:
<?
set char_string "&<>\"'/"
puts [escape_sgml_chars $char_string]
?>
Looking at Rivet_EscapeSgmlCharsCmd in rivetWWW.c, the Tcl_Alloc call at line
236 allocates origLength * 3 + 1 bytes.
You can probably already guess what the deal is… & gets mapped to & , < to
< , > to > , ‘ to ' and “ to "
So in the widest case double quotes are mapped to six characters, so a string
containing nothing but double-quotes would need 6 * the size of the original
string, so I believe the line that allocates the new string needs to be changed
to
newString = (char *)Tcl_Alloc( (unsigned)origLength * 6 + 1 );
Thank you for developing, caring for and feeding Rivet.
-karl