Hi,
I've been trying this problem these days.
For now I've not yet reached to an answer, but this may be a hint :
gdb told me that the problem is about memory allocation,
especially a double-freeing problem.
Changing optyk's script like this :
div2.each do |child|
#c = child.clone
c = child.copy(false)
div1.child_add(c)
exit # <--------- add this
end
causes
*** glibc detected *** ruby: double free or corruption (fasttop): 0x088b5db0 ***
======= Backtrace: =========
/lib/libc.so.6[0x4f2c0f5d]
/lib/libc.so.6(cfree+0x90)[0x4f2c45b0]
/usr/lib/libxml2.so.2(xmlFreeNode+0x14b)[0x4fa1ce8b]
./xml/libxml_so.so(ruby_xml_node2_free+0x5f)[0x4865ef]
/usr/lib/libruby.so.1.8(rb_gc_call_finalizer_at_exit+0xa7)[0x457f4a87]
/usr/lib/libruby.so.1.8[0x457dad07]
/usr/lib/libruby.so.1.8(ruby_cleanup+0xf9)[0x457e2ad9]
/usr/lib/libruby.so.1.8(ruby_stop+0x1d)[0x457e2bbd]
/usr/lib/libruby.so.1.8[0x457edae1]
ruby[0x80485f2]
/lib/libc.so.6(__libc_start_main+0xdc)[0x4f270dec]
ruby[0x8048521]
Next, I found 'double-wrapping' in ruby_xml_node2_wrap().
It happened because xmlNode's member "_private" was set to NULL by
xmlAddChild() function.
'_private' is used to store the xmlNode object's wrapper VALUE object
(which is actually a Ruby object pointer).
you can see it by inserting following code in ruby_xml_node_child_set_aux()
fprintf(stderr, "--- %p\n", chld->_private);
ret = xmlAddChild(pnode->node, chld);
fprintf(stderr, "--- %p\n", chld->_private);
==> (Run optyk's script)
--- 0xb7f8b9b8
--- (nil)
Just restoring '_private' value didn't fix the problem, but there may
be 'set-to-null problem'
elsewhere.
So, to conclude, I'm afraid it's not a good idea to store VALUE
pointer in '_private'.
libxml header file says its for internal use related to CORBA ... :-(
I'm glad if this could be a help for you, experts :-)
2007/11/27, optyk <[EMAIL PROTECTED]>:
> hello,
>
> I get segmentation fault when add the cloned/copied node to other
> node,
> script to problem reproduction below,
>
> segv appears when use clone and copy methods,
> what's interesting, with clone segv is thrown in div1.child_add(c)
> line (see script)
> but when use copy I get it in printf root statement, moreover copy
> seems to work wrong only for text nodes, when use 't3' div everything
> works fine
>
> I get this error on 0.5.2.0, 0.5.2.1 and 0.5.2.2 (latest svn) version
>
> it looks like fix is required in ruby-libxml code,
>
> BTW. it looks also like ruby_xml_node_copy() in ruby_xml_node.c calls
> xmlCopyNode() with wrong attributes, it should be 2 for shallow copy
> and 1 for deep copy
>
> regards,
> Piotrek
>
> -------------------- SCRIPT ---------------------
> require 'xml/libxml'
>
> str = <<-STR
> <html>
> <body>
> <div class="textarea" id="t1"
> style="STATIC">werwerwerwerwer </div>
> <div class="textarea" id="t2" style="STATIC">
> Quisque et diam dapibus nisi bibendum blandit.
> </div>
> <div class="textarea" id="t3" style="STATIC">
> <p>aaaaaaaaa</p>
> </div>
> </body>
> </html>
> STR
>
>
> XML::Parser.default_keep_blanks = false
> xp = XML::Parser.new
> xp.string = str
> doc = xp.parse
>
> xpath = "//[EMAIL PROTECTED]'t1']"
> div1 = doc.find(xpath).to_a[0]
> printf "xxx div1: #{div1}\n"
>
> xpath = "//[EMAIL PROTECTED]'t2']"
> div2 = doc.find(xpath).to_a[0]
> printf "xxx div2: #{div2}\n"
>
>
> div2.each do |child|
> #c = child.clone
> c = child.copy(false)
> div1.child_add(c)
> end
>
> printf "xxx root: #{doc.root}\n"
>
>
> _______________________________________________
> libxml-devel mailing list
> [email protected]
> http://rubyforge.org/mailman/listinfo/libxml-devel
>
--
FUKUDA, Keisuke <福田圭祐>
http://d.hatena.ne.jp/keisukefukuda/
_______________________________________________
libxml-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/libxml-devel