Bladeren bron

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.
Simon Woertz 3 jaren geleden
bovenliggende
commit
c857b5d22f

+ 4 - 1
Userland/Libraries/LibPDF/Document.h

@@ -9,6 +9,7 @@
 #include <AK/Format.h>
 #include <AK/HashMap.h>
 #include <AK/RefCounted.h>
+#include <AK/Weakable.h>
 #include <LibGfx/Color.h>
 #include <LibPDF/ObjectDerivatives.h>
 #include <LibPDF/Parser.h>
@@ -70,7 +71,9 @@ struct OutlineDict final : public RefCounted<OutlineDict> {
     OutlineDict() = default;
 };
 
-class Document final : public RefCounted<Document> {
+class Document final
+    : public RefCounted<Document>
+    , public Weakable<Document> {
 public:
     static RefPtr<Document> create(ReadonlyBytes bytes);
 

+ 1 - 1
Userland/Libraries/LibPDF/Parser.cpp

@@ -39,7 +39,7 @@ Parser::Parser(ReadonlyBytes bytes)
 {
 }
 
-void Parser::set_document(RefPtr<Document> const& document)
+void Parser::set_document(WeakPtr<Document> const& document)
 {
     m_document = document;
 }

+ 3 - 2
Userland/Libraries/LibPDF/Parser.h

@@ -7,6 +7,7 @@
 #pragma once
 
 #include <AK/NonnullRefPtrVector.h>
+#include <AK/WeakPtr.h>
 #include <LibPDF/Command.h>
 #include <LibPDF/Object.h>
 #include <LibPDF/Reader.h>
@@ -29,7 +30,7 @@ public:
     Parser(Badge<Document>, ReadonlyBytes);
 
     [[nodiscard]] ALWAYS_INLINE RefPtr<DictObject> const& trailer() const { return m_trailer; }
-    void set_document(RefPtr<Document> const&);
+    void set_document(WeakPtr<Document> 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<Document> m_document;
+    WeakPtr<Document> m_document;
     RefPtr<XRefTable> m_xref_table;
     RefPtr<DictObject> m_trailer;
     Optional<LinearizationDictionary> m_linearization_dictionary;