Bugs item #28198, was opened at 2010-05-13 12:53
You can respond by visiting:
http://rubyforge.org/tracker/?func=detail&atid=1971&aid=28198&group_id=494
Category: None
Group: None
>Status: Closed
>Resolution: Accepted
Priority: 3
Submitted By: Mamoru Tasaka (mtasaka)
>Assigned to: Charlie Savage (cfis)
Summary: 1.1.4 segfaults with test/tc_sax_parser.rb
Initial Comment:
With ruby 1.8.6p399 / libxml2 2.7.7 / libxml-ruby-1.1.4 gem
running test program test/tc_sax_parser.rb (in libxml-ruby-1.1.4 gem)
causes segfault and it seems that segfault is happening in
libxml-ruby side.
gdb log attached.
----------------------------------------------------------------------
>Comment By: Charlie Savage (cfis)
Date: 2011-04-22 21:44
Message:
Hi Mamoru,
This has been fixed in the latest release (I think I applied your patch from a
git branch). Thanks for the report and fix!
Charlieh
----------------------------------------------------------------------
Comment By: Huzaifa Sidhpurwala (huzaifas)
Date: 2011-01-18 23:36
Message:
any ETA on this one?
----------------------------------------------------------------------
Comment By: Hans de Graaff (graaff)
Date: 2010-12-03 08:30
Message:
I've written a patch for this that I can't seem to attach to the bug as a file.
Note that even with this patch the test still fails:
1) Failure:
test_parse_error(TestSaxParser) [./test/tc_sax_parser.rb:244]:
<LibXML::XML::Error> exception expected but was
Class: <NoMethodError>
Message: <"undefined method `on_error' for false:FalseClass">
I assume that this is another side-effect of the parsing failing and the
remainder of the C method (that should raise the error) not being carried out.
I'm not sure if the xmlParseDocument behaviour changed at some point, so I
can't really propose a fix for this.
Patch inline:
--- ext/libxml/ruby_xml_sax_parser.c.~1~ 2010-12-03 15:41:33.849563666
+0100
+++ ext/libxml/ruby_xml_sax_parser.c 2010-12-03 15:42:48.824938521 +0100
@@ -94,6 +94,7 @@
int status;
VALUE context = rb_ivar_get(self, CONTEXT_ATTR);
xmlParserCtxtPtr ctxt;
+ xmlSAXHandlerPtr handler = NULL;
Data_Get_Struct(context, xmlParserCtxt, ctxt);
ctxt->sax2 = 1;
@@ -101,15 +102,15 @@
if (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler)
xmlFree(ctxt->sax);
-
- ctxt->sax = (xmlSAXHandlerPtr)&rxml_sax_handler;
+
+ /* Provide a copy of our handler to that it can be freed by libxml2. */
+ handler = xmlMalloc(sizeof(xmlSAXHandler));
+ memcpy(handler, &rxml_sax_handler, sizeof(xmlSAXHandler));
+
+ ctxt->sax = handler;
status = xmlParseDocument(ctxt);
- /* IMPORTANT - null the handle to our sax handler
- so libxml doesn't try to free it.*/
- ctxt->sax = NULL;
-
/* Now check the parsing result*/
if (status == -1 || !ctxt->wellFormed)
{
----------------------------------------------------------------------
Comment By: Hans de Graaff (graaff)
Date: 2010-12-03 07:33
Message:
This happens because rxml_sax_parser_parse() in ruby_xml_sax_parser.c set
ctxt->sax to a statically defined sax object that cannot be freed, specifically
rxml_sax_handler defined in ruby_xml_sax2_handler.c.
The code tries to compensate for that by resetting ctxt->sax back to NULL right
after parsing, but since the failing test induces a parsing error I guess the
object is ctxt object is freed before the ctxt->sax pointer can be reset to
NULL.
----------------------------------------------------------------------
Comment By: Mamoru Tasaka (mtasaka)
Date: 2010-06-10 12:40
Message:
The testcase in
http://rubyforge.org/pipermail/libxml-devel/2010-June/001502.html
crashes at the same place:
(gdb) bt
#0 0x00f42416 in __kernel_vsyscall ()
#1 0x008c8eb1 in raise (sig=6) at
../nptl/sysdeps/unix/sysv/linux/raise.c:64
#2 0x008ca78a in abort () at abort.c:92
#3 0x0090793d in __libc_message (do_abort=2, fmt=0x9f1ce0
"*** glibc detected *** %s: %s: 0x%s ***\n")
at ../sysdeps/unix/sysv/linux/libc_fatal.c:186
#4 0x0090de91 in malloc_printerr (action=<value optimized
out>, str=<value optimized out>, ptr=0xbcd780)
at malloc.c:6283
#5 0x02cee62d in xmlFreeParserCtxt__internal_alias
(ctxt=0x82abee0) at parserInternals.c:1797
#6 0x00bbd5ae in rxml_parser_context_free (ctxt=0x82abee0)
at ruby_xml_parser_context.c:20
#7 0x067a069e in rb_gc_call_finalizer_at_exit () at gc.c:1988
#8 0x067858c8 in ruby_finalize_1 () at eval.c:1572
#9 0x06791e9b in ruby_cleanup (ex=0) at eval.c:1609
#10 0x06791fce in ruby_stop (ex=0) at eval.c:1664
#11 0x06799206 in ruby_run () at eval.c:1685
#12 0x0804867e in main (argc=3, argv=0xbffff034,
envp=0xbffff044) at main.c:48
----------------------------------------------------------------------
Comment By: Mamoru Tasaka (mtasaka)
Date: 2010-05-13 13:09
Message:
Note that the attachedd gdb log shows that one other
test failure is occuring in the test.
For segfault issue, commenting out the line 20 of
./ext/libxml/ruby_xml_parser_context.c seems to stop
segfault, however I don't know if this is the desired
solution.
----------------------------------------------------------------------
You can respond by visiting:
http://rubyforge.org/tracker/?func=detail&atid=1971&aid=28198&group_id=494
_______________________________________________
libxml-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/libxml-devel