1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-17 16:47:38 +00:00

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.
This commit is contained in:
Simon Woertz 2021-11-28 11:52:48 +01:00 committed by Linus Groh
parent d8013f9c3a
commit c857b5d22f
3 changed files with 8 additions and 4 deletions

View file

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

View file

@ -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; m_document = document;
} }

View file

@ -7,6 +7,7 @@
#pragma once #pragma once
#include <AK/NonnullRefPtrVector.h> #include <AK/NonnullRefPtrVector.h>
#include <AK/WeakPtr.h>
#include <LibPDF/Command.h> #include <LibPDF/Command.h>
#include <LibPDF/Object.h> #include <LibPDF/Object.h>
#include <LibPDF/Reader.h> #include <LibPDF/Reader.h>
@ -29,7 +30,7 @@ public:
Parser(Badge<Document>, ReadonlyBytes); Parser(Badge<Document>, ReadonlyBytes);
[[nodiscard]] ALWAYS_INLINE RefPtr<DictObject> const& trailer() const { return m_trailer; } [[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 // Parses the header and initializes the xref table and trailer
bool initialize(); bool initialize();
@ -139,7 +140,7 @@ private:
bool consume(char); bool consume(char);
Reader m_reader; Reader m_reader;
RefPtr<Document> m_document; WeakPtr<Document> m_document;
RefPtr<XRefTable> m_xref_table; RefPtr<XRefTable> m_xref_table;
RefPtr<DictObject> m_trailer; RefPtr<DictObject> m_trailer;
Optional<LinearizationDictionary> m_linearization_dictionary; Optional<LinearizationDictionary> m_linearization_dictionary;