mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-05-08 10:03:51 +00:00
fix(wcp): detect truncated WCP files on unpack
Previously a short read (truncated WCP, partial download, etc.) would silently write the partial bytes that were read and report success — leaving the consumer with a half-extracted zone that would fail in confusing ways at runtime. Check gcount and return false so the caller can refuse the broken pack.
This commit is contained in:
parent
44777c7d58
commit
aa2a70de8d
1 changed files with 14 additions and 0 deletions
|
|
@ -208,10 +208,24 @@ bool ContentPacker::unpackZone(const std::string& wcpPath, const std::string& de
|
||||||
|
|
||||||
std::vector<char> data(dataSize);
|
std::vector<char> data(dataSize);
|
||||||
in.read(data.data(), dataSize);
|
in.read(data.data(), dataSize);
|
||||||
|
// Detect short reads — indicates the WCP was truncated mid-file.
|
||||||
|
// gcount() reflects the actual bytes read; if it's less than dataSize
|
||||||
|
// we'd write a partial file silently and the consumer would think
|
||||||
|
// the zone is intact.
|
||||||
|
auto bytesRead = in.gcount();
|
||||||
|
if (bytesRead != static_cast<std::streamsize>(dataSize)) {
|
||||||
|
LOG_ERROR("WCP file ", path, " truncated: expected ", dataSize,
|
||||||
|
" got ", bytesRead);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
std::string fullPath = zoneDir + "/" + path;
|
std::string fullPath = zoneDir + "/" + path;
|
||||||
fs::create_directories(fs::path(fullPath).parent_path());
|
fs::create_directories(fs::path(fullPath).parent_path());
|
||||||
std::ofstream fout(fullPath, std::ios::binary);
|
std::ofstream fout(fullPath, std::ios::binary);
|
||||||
|
if (!fout) {
|
||||||
|
LOG_ERROR("WCP could not open output file: ", fullPath);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
fout.write(data.data(), dataSize);
|
fout.write(data.data(), dataSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue