diff options
author | squalus <squalus@squalus.net> | 2022-09-22 12:47:43 -0700 |
---|---|---|
committer | squalus <squalus@squalus.net> | 2022-09-22 12:50:32 -0700 |
commit | 223f8dace091a0549f86b966b1d935c42bb01efd (patch) | |
tree | 391ed8b4a68a6239bcfd466ece9529054ecd1eca /src/libutil | |
parent | f704c2720f136a6bb73a2e91d4a85e0e9a42ff6f (diff) |
archive: check close errors when extracting nars
Diffstat (limited to 'src/libutil')
-rw-r--r-- | src/libutil/archive.cc | 7 | ||||
-rw-r--r-- | src/libutil/archive.hh | 1 |
2 files changed, 8 insertions, 0 deletions
diff --git a/src/libutil/archive.cc b/src/libutil/archive.cc index 30b471af5..4b0636129 100644 --- a/src/libutil/archive.cc +++ b/src/libutil/archive.cc @@ -234,6 +234,7 @@ static void parse(ParseSink & sink, Source & source, const Path & path) else if (s == "contents" && type == tpRegular) { parseContents(sink, source, path); + sink.closeRegularFile(); } else if (s == "executable" && type == tpRegular) { @@ -324,6 +325,12 @@ struct RestoreSink : ParseSink if (!fd) throw SysError("creating file '%1%'", p); } + void closeRegularFile() override + { + /* Call close explicitly to make sure the error is checked */ + fd.close(); + } + void isExecutable() override { struct stat st; diff --git a/src/libutil/archive.hh b/src/libutil/archive.hh index 79ce08df0..ac4183bf5 100644 --- a/src/libutil/archive.hh +++ b/src/libutil/archive.hh @@ -60,6 +60,7 @@ struct ParseSink virtual void createDirectory(const Path & path) { }; virtual void createRegularFile(const Path & path) { }; + virtual void closeRegularFile() { }; virtual void isExecutable() { }; virtual void preallocateContents(uint64_t size) { }; virtual void receiveContents(std::string_view data) { }; |