From 064c936f11f2c257661cd1d089c79ed6144e00b8 Mon Sep 17 00:00:00 2001 From: Armin Friedl Date: Sun, 23 Feb 2020 09:56:33 +0100 Subject: [PATCH] [fix] Extractor falls out of scope Extractor was created and destroyed within the if scope, leading to a dereference error when trying to call the virtual writer methods. --- .gitignore | 1 + src/archive.cpp | 14 +++++++------- src/archive_sys.cpp | 5 ++++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index c293aa2..ac35e7b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .clangd/ build/ +target/ compile_commands.json # Created by https://www.gitignore.io/api/vim,c++,emacs,ninja diff --git a/src/archive.cpp b/src/archive.cpp index e1397e1..50026da 100644 --- a/src/archive.cpp +++ b/src/archive.cpp @@ -106,17 +106,17 @@ ArchiveSpec Archive::check() { void Archive::extract(ExtractSpec extract_spec) { std::filesystem::path abs_path = std::filesystem::absolute(this->path); + std::unique_ptr extractor; + if(extract_spec.make_dir) { - ArchiveExtractorSys extractor{ArchiveExtractorSys{extract_spec.dirname}}; logger::trace("Creating extract directory {}", extract_spec.dirname.string()); - ArchiveReaderSys reader{abs_path}; - extractor.extract_all(reader); + extractor = std::unique_ptr(new ArchiveExtractorSys{extract_spec.dirname}); } else { - ArchiveExtractorSys extractor{}; - logger::trace("Creating extract directory {}", extract_spec.dirname.string()); - ArchiveReaderSys reader{abs_path}; - extractor.extract_all(reader); + extractor = std::unique_ptr(new ArchiveExtractorSys{}); } + + ArchiveReaderSys reader{abs_path}; + extractor->extract_all(reader); } } // namespace xwim diff --git a/src/archive_sys.cpp b/src/archive_sys.cpp index adff9de..0fcccf5 100644 --- a/src/archive_sys.cpp +++ b/src/archive_sys.cpp @@ -79,6 +79,8 @@ xwim::ArchiveExtractorSys::ArchiveExtractorSys(std::filesystem::path& root) { this->writer = archive_write_disk_new(); archive_write_disk_set_standard_lookup(this->writer); + + logger::trace("Constructed ArchiveExtractorSys at {:p}", (void*) this->writer); } xwim::ArchiveExtractorSys::ArchiveExtractorSys() { @@ -86,6 +88,7 @@ xwim::ArchiveExtractorSys::ArchiveExtractorSys() { this->writer = archive_write_disk_new(); archive_write_disk_set_standard_lookup(this->writer); + logger::trace("Constructed ArchiveExtractorSys at {:p}", (void*) this->writer); } void xwim::ArchiveExtractorSys::extract_all(xwim::ArchiveReaderSys& reader) { @@ -111,7 +114,7 @@ void xwim::ArchiveExtractorSys::extract_entry(xwim::ArchiveReaderSys& reader) { } xwim::ArchiveExtractorSys::~ArchiveExtractorSys(){ - logger::trace("Destructing ArchiveExtractorSys"); + logger::trace("Destructing ArchiveExtractorSys at {:p}", (void*) this->writer); if(this->writer) { archive_write_close(this->writer); archive_write_free(this->writer);