1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-14 08:44:58 +00:00

unzip: Verify extracted files against CRC32 checksums

This removes one TODO.
This commit is contained in:
implicitfield 2022-12-18 12:48:20 +02:00 committed by Andreas Kling
parent 2da1c1c10e
commit a520894522
2 changed files with 11 additions and 2 deletions

View file

@ -14,6 +14,7 @@
#include <LibCore/File.h>
#include <LibCore/MappedFile.h>
#include <LibCore/System.h>
#include <LibCrypto/Checksum/CRC32.h>
#include <sys/stat.h>
static bool unpack_zip_member(Archive::ZipMember zip_member, bool quiet)
@ -37,13 +38,14 @@ static bool unpack_zip_member(Archive::ZipMember zip_member, bool quiet)
if (!quiet)
outln(" extracting: {}", zip_member.name);
// TODO: verify CRC32s match!
Crypto::Checksum::CRC32 checksum;
switch (zip_member.compression_method) {
case Archive::ZipCompressionMethod::Store: {
if (!new_file->write(zip_member.compressed_data.data(), zip_member.compressed_data.size())) {
warnln("Can't write file contents in {}: {}", zip_member.name, new_file->error_string());
return false;
}
checksum.update({ zip_member.compressed_data.data(), zip_member.compressed_data.size() });
break;
}
case Archive::ZipCompressionMethod::Deflate: {
@ -60,6 +62,7 @@ static bool unpack_zip_member(Archive::ZipMember zip_member, bool quiet)
warnln("Can't write file contents in {}: {}", zip_member.name, new_file->error_string());
return false;
}
checksum.update({ decompressed_data.value().data(), decompressed_data.value().size() });
break;
}
default:
@ -71,6 +74,12 @@ static bool unpack_zip_member(Archive::ZipMember zip_member, bool quiet)
return false;
}
if (checksum.digest() != zip_member.crc32) {
warnln("Failed decompressing file {}: CRC32 mismatch", zip_member.name);
MUST(new_file->remove(zip_member.name, Core::File::RecursionMode::Disallowed, true));
return false;
}
return true;
}