From c857b5d22f7df94ef44a6a75bf1dd54d44491fab Mon Sep 17 00:00:00 2001 From: Simon Woertz Date: Sun, 28 Nov 2021 11:52:48 +0100 Subject: [PATCH] LibPDF: Convert `PDF::Parser::m_document` from `RefPtr` to `WeakPtr` Otherwise both `PDF::Document` and `PDF::Parser` have a `RefPtr` pointing to each other which leads to a memory leak due to a circular dependency. --- Userland/Libraries/LibPDF/Document.h | 5 ++++- Userland/Libraries/LibPDF/Parser.cpp | 2 +- Userland/Libraries/LibPDF/Parser.h | 5 +++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibPDF/Document.h b/Userland/Libraries/LibPDF/Document.h index 02303cee02..d8da59f2e5 100644 --- a/Userland/Libraries/LibPDF/Document.h +++ b/Userland/Libraries/LibPDF/Document.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -70,7 +71,9 @@ struct OutlineDict final : public RefCounted { OutlineDict() = default; }; -class Document final : public RefCounted { +class Document final + : public RefCounted + , public Weakable { public: static RefPtr create(ReadonlyBytes bytes); diff --git a/Userland/Libraries/LibPDF/Parser.cpp b/Userland/Libraries/LibPDF/Parser.cpp index 744a88521a..20bc36fd00 100644 --- a/Userland/Libraries/LibPDF/Parser.cpp +++ b/Userland/Libraries/LibPDF/Parser.cpp @@ -39,7 +39,7 @@ Parser::Parser(ReadonlyBytes bytes) { } -void Parser::set_document(RefPtr const& document) +void Parser::set_document(WeakPtr const& document) { m_document = document; } diff --git a/Userland/Libraries/LibPDF/Parser.h b/Userland/Libraries/LibPDF/Parser.h index b19bc50bd8..b862bc67c2 100644 --- a/Userland/Libraries/LibPDF/Parser.h +++ b/Userland/Libraries/LibPDF/Parser.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include #include #include @@ -29,7 +30,7 @@ public: Parser(Badge, ReadonlyBytes); [[nodiscard]] ALWAYS_INLINE RefPtr const& trailer() const { return m_trailer; } - void set_document(RefPtr const&); + void set_document(WeakPtr const&); // Parses the header and initializes the xref table and trailer bool initialize(); @@ -139,7 +140,7 @@ private: bool consume(char); Reader m_reader; - RefPtr m_document; + WeakPtr m_document; RefPtr m_xref_table; RefPtr m_trailer; Optional m_linearization_dictionary;