gzip: Don't fail when trying to compress empty files

Given an empty file, gzip would try to create a zero-size memory mapping
of that file, which would fail with EINVAL.
This commit is contained in:
Rummskartoffel 2022-01-08 13:06:49 +01:00 committed by Andreas Kling
parent 748218d5d0
commit ba0d46e31a

View file

@ -43,14 +43,18 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
// We map the whole file instead of streaming to reduce size overhead (gzip header) and increase the deflate block size (better compression)
// TODO: automatically fallback to buffered streaming for very large files
auto file = TRY(Core::MappedFile::map(input_filename));
RefPtr<Core::MappedFile> file;
ReadonlyBytes input_bytes;
if (TRY(Core::System::stat(input_filename)).st_size > 0) {
file = TRY(Core::MappedFile::map(input_filename));
input_bytes = file->bytes();
}
AK::Optional<ByteBuffer> output_bytes;
if (decompress) {
output_bytes = Compress::GzipDecompressor::decompress_all(file->bytes());
} else {
output_bytes = Compress::GzipCompressor::compress_all(file->bytes());
}
if (decompress)
output_bytes = Compress::GzipDecompressor::decompress_all(input_bytes);
else
output_bytes = Compress::GzipCompressor::compress_all(input_bytes);
if (!output_bytes.has_value()) {
warnln("Failed gzip {} input file", decompress ? "decompressing"sv : "compressing"sv);