diff --git a/Userland/Libraries/LibPDF/Renderer.cpp b/Userland/Libraries/LibPDF/Renderer.cpp index f3eaf0b160..01b509959f 100644 --- a/Userland/Libraries/LibPDF/Renderer.cpp +++ b/Userland/Libraries/LibPDF/Renderer.cpp @@ -646,20 +646,26 @@ RENDERER_HANDLER(paint_xobject) // Use a RAII object to restore the graphics state, to make sure it gets restored even if // a TRY(handle_operator()) causes us to exit the operators loop early. + // Explicitly resize stack size at the end so that if the recursive document contains + // `q q unsupportedop Q Q`, we undo the stack pushes from the inner `q q` even if + // `unsupportedop` terminates processing the inner instruction stream before `Q Q` + // would normally pop state. class ScopedState { public: ScopedState(Renderer& renderer) : m_renderer(renderer) + , m_starting_stack_depth(m_renderer.m_graphics_state_stack.size()) { MUST(m_renderer.handle_save_state({})); } ~ScopedState() { - MUST(m_renderer.handle_restore_state({})); + m_renderer.m_graphics_state_stack.shrink(m_starting_stack_depth); } private: Renderer& m_renderer; + size_t m_starting_stack_depth; }; ScopedState scoped_state { *this };