The opml crate's Outline reader (hard-xml's derive) recurses once per <outline> level with no limit. A 2 MB upload holds tens of thousands of levels, enough to overflow a tokio worker's 2 MiB stack, and a stack overflow aborts the process, not the task. A fetched OPML (up to 50 MB) reached the same parse on every scan, so a publisher could keep the daemon in a crash loop. feed::read_opml counts nesting with quick-xml's streaming reader, which does not recurse, and refuses past 100 before handing the text to the opml crate. Every place that parsed OPML goes through it: the upload, `ipx opml`, a fetched OPML's feeds and its title. The limit also bounds collect_outlines' recursion and the drop of the nested Vec. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
94 KiB
94 KiB