Potential bug in array append and/or recursion?
Imported from http://bugzilla.roxen.com/bugzilla/show_bug.cgi?id=7552
Reported by Jonas Wallden jonasw@roxen.com
This is a infinite recursion issue seen with Pike 8.0 (b762abf9 from July 23, 2015).
In the backtrace the code is walking a tree structure, but the parameters indicate some weird parent/child loop. Since this was a freak occurrence that hasn't been reproduced I don't know if the tree construction (which is many years old) once in a blue moon can fail spectacularly and create that loop; another possibility is that the compilation/execution of the recursion fails in refcounts and/or recursion optimizations.
A simplified backtrace looks like this:
recurse( ({ @1 }) ) recurse(@2 = ({ @1 }) ) recurse(@2) [...repeat...] recurse(@2) recurse(@3 = ({ Node_with_no_children, @1 }) )
Here is the full backtrace and the relevant code:
: Internal server error: Svalue stack overflow. (99624 of 100000 entries on stack, needed 256 more entries)
: modules/sitebuilder/pike-modules/Sitebuilder.pmod/FS.pmod/VCFile.pike (70c61484):380: VCFile(N/E:72:[Basic]::/cms-components.xsl)->update_state(0,0,0,0,0,1)
: modules/sitebuilder/pike-modules/Sitebuilder.pmod/FS.pmod/VCFile.pike (70c61484):318: VCFile(N/E:72:[Basic]::/cms-components.xsl)->init_state(UNDEFINED)
: modules/sitebuilder/pike-modules/Sitebuilder.pmod/Workarea.pike (2ee0cf90):1304: Workarea(Basic:)->_sbobj(72,"cms-components.xsl",UNDEFINED,UNDEFINED)
16:44:13 : modules/sitebuilder/pike-modules/Sitebuilder.pmod/Workarea.pike (2ee0cf90):3056: Workarea(Basic:)->sbobj("cms-components.xsl",72,ProtocolCacheKey(inactive),UNDEFINED,UNDEFINED)
0d 1h55m : modules/sitebuilder/pike-modules/Sitebuilder.pmod/Workarea.pike (2ee0cf90):6050: Workarea(Basic:)->locate_file("cms-components.xsl",VCDir(E:72:[Basic]::/),"sitebuilder/xsl-template",,,0)
: modules/sitebuilder/modules/xsltransform/xsltransform.pike (2ea961c2):2412: RoxenModule(Basic/xsltransform#0)->get_xsl_path("cms-components.xsl",VCFile(E/E:72:[Basic]::/index.xml),0,@0=RequestID(/edit/__afs/compedit-get-fragments?path=%2Findex.xml&tag=2&sb_session_id=B96F7A67-1FEC-4A3C-86D8-846DE1C45BFD&rnd=1440773049777))
: modules/sitebuilder/modules/xsltransform/xsltransform.pike (2ea961c2):2497: RoxenModule(Basic/xsltransform#0)->do_xsltransform("xsltransform",mapping[1],"<content-box component-position='middle' height='"+[518],@0,0,/Users/jonasw/Roxen/server/modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.__class_66926_7_line_3900(),UNDEFINED)
: modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.pmod (01ee0491):3905: /Users/jonasw/Roxen/server/modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.get_component_transform(ComponentInstance(form2-component),0,0,@0,,,1)
: modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.pmod (01ee0491):3339: /Users/jonasw/Roxen/server/modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.item_for_frag(/Users/jonasw/Roxen/server/modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.EditorPageState(),@1=Editor.Fragment(bfe691ac7b0ae19830d2452b7334f0b1,"comp:000055988faf:0000000006:4cd3",1,1,ch#1),,,3)
16:44:13 : modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.pmod (01ee0491):3382: /Users/jonasw/Roxen/server/modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.recurse(({@1}))
0d 1h55m : modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.pmod (01ee0491):3385: /Users/jonasw/Roxen/server/modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.recurse(@2=({@1}))
: modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.pmod (01ee0491):3385: /Users/jonasw/Roxen/server/modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.recurse(@2)
: ... last 1 frames above repeated 8277 times ...
: modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.pmod (01ee0491):3385: /Users/jonasw/Roxen/server/modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.recurse(@3=({Editor.Fragment(bdda1d0df467a1ea7f4a8fcc71daa3bc,"comp:00003d89db82:0000000000:281e",1,1,ch#-1),@1}))
: modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.pmod (01ee0491):3389: /Users/jonasw/Roxen/server/modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.items_for_frags(@4=/Users/jonasw/Roxen/server/modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.EditorPageState(),@3,@5=([]),UNDEFINED,UNDEFINED,@0)
16:44:13 : modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.pmod (01ee0491):3431: /Users/jonasw/Roxen/server/modules/sitebuilder/pike-modules/Sitebuilder.pmod/Editor.get_fragments(@6=VCFile(E/E:72:[Basic]::/index.xml),UNDEFINED,UNDEFINED,@0)
0d 1h55m : modules/sitebuilder/modules/manager/content_editor.pike (d10d5f89):6265: AFS.Action(compedit-get-fragments)->exec(@0,ClientSession("72-\"B96F7A67-1FEC-4A3C-86D8-846DE1C45BFD\"", 0, 61),mapping[12],"2")
: etc/modules/AFS.pmod/Filesystem.pike:330: RoxenModule(Basic/content_editor#0)->call_fs_action("compedit-get-fragments",@0,@7=ClientSession("72-\"B96F7A67-1FEC-4A3C-86D8-846DE1C45BFD\"", 0, 61),mapping[12])
: etc/modules/AFS.pmod/Filesystem.pike:374: RoxenModule(Basic/content_editor#0)->find_action("compedit-get-fragments",@0)
: modules/sitebuilder/modules/manager/content_editor.pike (d10d5f89):2562: RoxenModule(Basic/content_editor#0)->find_file("__afs/compedit-get-fragments",@0,UNDEFINED)
: base_server/configuration.pike (e4e92c15):2266: Configuration(Basic)->low_get_file(@0,UNDEFINED)
16:44:13 : base_server/configuration.pike (e4e92c15):2525: Configuration(Basic)->get_file(@0,UNDEFINED,UNDEFINED)
0d 1h55m : base_server/configuration.pike (e4e92c15):2500: Configuration(Basic)->handle_request(@0,UNDEFINED)
: protocols/http.pike (6608940b):3063: RequestID(/edit/__afs/compedit-get-fragments?path=%2Findex.xml&tag=2&sb_session_id=B96F7A67-1FEC-4A3C-86D8-846DE1C45BFD&rnd=1440773049777)->handle_request()
: protocols/http.pike (6608940b):3006: RequestID(/edit/__afs/compedit-get-fragments?path=%2Findex.xml&tag=2&sb_session_id=B96F7A67-1FEC-4A3C-86D8-846DE1C45BFD&rnd=1440773049777)->handle_request_from_queue()
: base_server/roxen.pike (a1029109):929: roxen()->handler_thread(14)
private array(mapping|array) items_for_frags(EditorPageState state,
array(Fragment) fragments,
mapping attrs,
string|void edit_sid,
string|void suppress_output_sid,
RequestID id)
{
// Iterate through nesting and accumulate all info. Children are
// output as a nested array following the parent component.
array(mapping|array) recurse(array(Fragment) child_frags) {
array(mapping|array) res = ({ });
foreach (child_frags, Fragment f) {
mapping item =
item_for_frag(state, f, attrs, edit_sid, suppress_output_sid, id);
res += ({ item });
if (item.is_group && f->children)
res += ({ recurse(f->children) });
}
return res;
};
return recurse(fragments);
}