1 Commits
Author SHA1 Message Date
Deorder 7acca3d47d Fixed memory corruption in bsarch by zeroing allocated memory
Added test for fo4 dds
2019-09-02 23:56:27 +02:00
3 changed files with 118 additions and 19 deletions
+101 -9
View File
@@ -30,6 +30,15 @@ bool mkdirp(const std::wstring& directory, bool basedir = true) {
}
}
void dds_info(bsa_archive_t archive, const wchar_t* file_path, bsa_dds_info_t* dds_info, void* context) {
// Mock result
dds_info->width = 2048;
dds_info->height = 2048;
dds_info->mipmaps = 12;
printf("ba2 dds_info callback file: %ls, context: %s\n", file_path, (char*)context);
}
int main() {
bsa_result_message_t result = { 0 };
bsa_archive_t archive = bsa_create();
@@ -37,23 +46,26 @@ int main() {
{
result = bsa_load_from_file(archive, L"test_read.bsa");
if(result.code < 0)
printf("%ls\n", result.text);
printf("ba1 %ls\n", result.text);
bsa_entry_list_t entries = bsa_entry_list_create();
bsa_get_resource_list(archive, entries, L"");
for(size_t index = 0; index < bsa_entry_list_count(entries); index++) {
wchar_t filename[2048];
wchar_t dest_filename[2048] = L"test_ba1\\";
bsa_entry_list_get(entries, index, 2048, filename);
wcscat_s(dest_filename, 2048, filename);
printf("file: %ls\n", filename);
printf("ba1 file: %ls %ls\n", filename, dest_filename);
if(mkdirp(dirname(filename))) {
result = bsa_extract_file(archive, filename, filename);
if(mkdirp(dirname(dest_filename))) {
result = bsa_extract_file(archive, filename, dest_filename);
if(result.code < 0)
printf("%ls\n", result.text);
printf("ba1 %ls\n", result.text);
} else {
printf("could not create: %ls\n", dirname(filename).c_str());
printf("ba1 could not create: %ls\n", dirname(dest_filename).c_str());
}
}
@@ -68,15 +80,95 @@ int main() {
bsa_entry_list_add(entries, L"textures\\grass\\test2.dds");
bsa_create_archive(archive, L"test_write.bsa", baSSE, entries);
bsa_add_file_from_disk_root(archive, L"", L"textures\\grass\\test.dds");
result = bsa_add_file_from_disk(archive, L"textures\\grass\\test2.dds", L"textures\\grass\\test.dds");
bsa_add_file_from_disk_root(archive, L"test_ba1\\", L"test_ba1\\textures\\grass\\test.dds");
result = bsa_add_file_from_disk(archive, L"textures\\grass\\test2.dds", L"test_ba1\\textures\\grass\\test.dds");
if (result.code < 0)
printf("%ls\n", result.text);
printf("ba1 %ls\n", result.text);
bsa_save(archive);
bsa_close(archive);
bsa_entry_list_free(entries);
}
bsa_file_dds_info_callback_set(archive, dds_info, (void*)"I was shared");
{
result = bsa_load_from_file(archive, L"test_read.ba2");
if (result.code < 0)
printf("ba2 %ls\n", result.text);
bsa_entry_list_t entries = bsa_entry_list_create();
bsa_get_resource_list(archive, entries, L"");
for (size_t index = 0; index < bsa_entry_list_count(entries); index++) {
wchar_t filename[2048];
wchar_t dest_filename[2048] = L"test_ba2\\";
bsa_entry_list_get(entries, index, 2048, filename);
wcscat_s(dest_filename, 2048, filename);
printf("ba2 file: %ls %ls\n", filename, dest_filename);
if (mkdirp(dirname(dest_filename))) {
result = bsa_extract_file(archive, filename, dest_filename);
if (result.code < 0)
printf("ba2 %ls\n", result.text);
}
else {
printf("ba2 could not create: %ls\n", dirname(dest_filename).c_str());
}
}
bsa_entry_list_free(entries);
bsa_close(archive);
}
{
bsa_entry_list_t entries = bsa_entry_list_create();
bsa_entry_list_add(entries, L"textures\\grass\\test.dds");
bsa_entry_list_add(entries, L"textures\\grass\\test2.dds");
bsa_create_archive(archive, L"test_write.ba2", baFO4dds, entries);
bsa_add_file_from_disk_root(archive, L"test_ba2\\", L"test_ba2\\textures\\grass\\test.dds");
result = bsa_add_file_from_disk(archive, L"textures\\grass\\test2.dds", L"test_ba2\\textures\\grass\\test.dds");
if (result.code < 0)
printf("ba2 %ls\n", result.text);
bsa_save(archive);
bsa_close(archive);
bsa_entry_list_free(entries);
}
/*
{
result = bsa_load_from_file(archive, L"test_large.ba2");
if (result.code < 0)
printf("ba2 large %ls\n", result.text);
bsa_entry_list_t entries = bsa_entry_list_create();
bsa_get_resource_list(archive, entries, L"");
for (size_t index = 0; index < bsa_entry_list_count(entries); index++) {
wchar_t filename[2048];
wchar_t dest_filename[2048] = L"test_ba2_large\\";
bsa_entry_list_get(entries, index, 2048, filename);
wcscat_s(dest_filename, 2048, filename);
printf("ba2 file large: %ls %ls\n", filename, dest_filename);
if (mkdirp(dirname(dest_filename))) {
result = bsa_extract_file(archive, filename, dest_filename);
if (result.code < 0)
printf("ba2 large %ls\n", result.text);
}
else {
printf("ba2 large could not create: %ls\n", dirname(dest_filename).c_str());
}
}
}
*/
bsa_free(archive);
}
+1 -1
View File
@@ -3,7 +3,7 @@
<ProjectGuid>{381E4D59-4D34-46B3-B039-1B3C3ABEC58F}</ProjectGuid>
<MainSource>libbsarch.dpr</MainSource>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Debug</Config>
<Config Condition="'$(Config)'==''">Release</Config>
<TargetedPlatforms>3</TargetedPlatforms>
<AppType>Library</AppType>
<FrameworkType>None</FrameworkType>
+16 -9
View File
@@ -1374,7 +1374,6 @@ begin
end;
fStream := TwbWriteCachedFileStream.Create(aFilePath, fmCreate);
fFileName := aFilePath;
Include(fStates, stWriting);
@@ -1550,7 +1549,8 @@ begin
stream := TFileStream.Create(aSourcePath, fmOpenRead + fmShareDenyNone);
try
GetMem(buffer, stream.Size);
// Modified: Make sure memory is zeroed when allocated
buffer := AllocMem(stream.Size);
try
stream.Read(buffer^, stream.Size);
AddFileDataCompat(aFilePath, stream.Size, buffer);
@@ -1907,8 +1907,8 @@ begin
FileTES3 := aFileRecord;
fStream.Position := fDataOffset + FileTES3.Offset;
Result.size := FileTES3.Size;
GetMem(Result.data, FileTES3.Size);
fStream.ReadBuffer(Result.data[0], Result.size);
// Modified: Make sure memory is zeroed when allocated
Result.data := AllocMem(FileTES3.Size);
end;
baTES4, baFO3, baSSE: begin
@@ -1929,7 +1929,8 @@ begin
if bCompressed then begin
// reading uncompressed size
Result.size := fStream.ReadCardinal;
GetMem(Result.data, Result.size);
// Modified: Make sure memory is zeroed when allocated
Result.data := AllocMem(Result.size);
dec(size, SizeOf(Cardinal));
if (Result.size > 0) and (size > 0) then begin
SetLength(Buffer, size);
@@ -1954,7 +1955,8 @@ begin
end
else begin
Result.size := size;
GetMem(Result.data, Result.size);
// Modified: Make sure memory is zeroed when allocated
Result.data := AllocMem(Result.size);
if size > 0 then
fStream.ReadBuffer(Result.data[0], Result.size);
end;
@@ -1967,7 +1969,8 @@ begin
SetLength(Buffer, FileFO4.PackedSize);
fStream.ReadBuffer(Buffer[0], Length(Buffer));
Result.size := FileFO4.Size;
GetMem(Result.data, Result.size);
// Modified: Make sure memory is zeroed when allocated
Result.data := AllocMem(Result.size);
if Assigned(Sync) then
Sync.EndWrite;
try
@@ -1979,7 +1982,8 @@ begin
end
else begin
Result.size := FileFO4.Size;
GetMem(Result.data, Result.size);
// Modified: Make sure memory is zeroed when allocated
Result.data := AllocMem(Result.size);
fStream.ReadBuffer(Result.data[0], Result.size);
end;
end;
@@ -1988,11 +1992,14 @@ begin
FileFO4 := aFileRecord;
TexSize := SizeOf(TDDSHeader);
for i := Low(FileFO4.TexChunks) to High(FileFO4.TexChunks) do
Inc(TexSize, FileFO4.TexChunks[i].Size);
Result.size := Texsize;
GetMem(Result.data, Result.size);
// Modified: Make sure memory is zeroed when allocated
Result.data := AllocMem(Result.size);
DDSHeader := @Result.data[0];
DDSHeader.Magic := MAGIC_DDS;