Skip to content

Commit

Permalink
LibPDF: Convert PDF::Parser::m_document from RefPtr to WeakPtr
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
swoertz authored and linusg committed Jan 8, 2022
1 parent d8013f9 commit c857b5d
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 4 deletions.
5 changes: 4 additions & 1 deletion Userland/Libraries/LibPDF/Document.h
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion Userland/Libraries/LibPDF/Parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
5 changes: 3 additions & 2 deletions Userland/Libraries/LibPDF/Parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand All @@ -29,7 +30,7 @@ class Parser final : public RefCounted<Parser> {
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();
Expand Down Expand Up @@ -139,7 +140,7 @@ class Parser final : public RefCounted<Parser> {
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;
Expand Down

0 comments on commit c857b5d

Please sign in to comment.