implement ModelDbPart::Read & ModelDbModel::Read (#620)

* implement ModelDbPart::Read & ModelDbModel::Read

* Update modeldb.cpp

* Minor style fixes

* Add comment about buffer overrun

* Use sizeof on var

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
This commit is contained in:
Misha 2024-03-03 17:15:24 -05:00 committed by GitHub
parent 01f07a323c
commit 7f5ad98749
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 66 additions and 6 deletions

View file

@ -6,16 +6,70 @@ DECOMP_SIZE_ASSERT(ModelDbModel, 0x38)
DECOMP_SIZE_ASSERT(ModelDbPartList, 0x1c) DECOMP_SIZE_ASSERT(ModelDbPartList, 0x1c)
DECOMP_SIZE_ASSERT(ModelDbPartListCursor, 0x10) DECOMP_SIZE_ASSERT(ModelDbPartListCursor, 0x10)
// STUB: LEGO1 0x100276b0 // FUNCTION: LEGO1 0x100276b0
MxResult ModelDbModel::Read(FILE* p_file) MxResult ModelDbModel::Read(FILE* p_file)
{ {
return SUCCESS; MxU32 len;
if (fread(&len, sizeof(len), 1, p_file) != 1) {
return FAILURE;
} }
// STUB: LEGO1 0x10027850 m_modelName = new char[len];
if (fread(m_modelName, len, 1, p_file) != 1) {
return FAILURE;
}
if (fread(&m_unk0x04, sizeof(m_unk0x04), 1, p_file) != 1) {
return FAILURE;
}
if (fread(&m_unk0x08, sizeof(m_unk0x08), 1, p_file) != 1) {
return FAILURE;
}
if (fread(&len, sizeof(len), 1, p_file) != 1) {
return FAILURE;
}
m_presenterName = new char[len];
if (fread(m_presenterName, len, 1, p_file) != 1) {
return FAILURE;
}
if (fread(&m_unk0x10, sizeof(*m_unk0x10), 3, p_file) != 3) {
return FAILURE;
}
if (fread(&m_unk0x1c, sizeof(*m_unk0x1c), 3, p_file) != 3) {
return FAILURE;
}
if (fread(&m_unk0x28, sizeof(*m_unk0x28), 3, p_file) != 3) {
return FAILURE;
}
return fread(&m_unk0x34, sizeof(m_unk0x34), 1, p_file) == 1 ? SUCCESS : FAILURE;
}
// FUNCTION: LEGO1 0x10027850
MxResult ModelDbPart::Read(FILE* p_file) MxResult ModelDbPart::Read(FILE* p_file)
{ {
return SUCCESS; MxU32 len;
char buff[128];
if (fread(&len, sizeof(len), 1, p_file) != 1) {
return FAILURE;
}
// Critical bug: buffer overrun
if (fread(buff, len, 1, p_file) != 1) {
return FAILURE;
}
m_roiName = buff;
if (fread(&m_unk0x10, sizeof(m_unk0x10), 1, p_file) != 1) {
return FAILURE;
}
return fread(&m_unk0x14, sizeof(m_unk0x14), 1, p_file) == 1 ? SUCCESS : FAILURE;
} }
// FUNCTION: LEGO1 0x10027910 // FUNCTION: LEGO1 0x10027910

View file

@ -94,7 +94,13 @@ struct ModelDbModel {
MxResult Read(FILE* p_file); MxResult Read(FILE* p_file);
char* m_modelName; // 0x00 char* m_modelName; // 0x00
undefined m_unk0x04[0x34]; // 0x04 undefined4 m_unk0x04; // 0x04
undefined4 m_unk0x08; // 0x08
char* m_presenterName; // 0x0c
undefined4 m_unk0x10[3]; // 0x10
undefined4 m_unk0x1c[3]; // 0x1c
undefined4 m_unk0x28[3]; // 0x28
undefined m_unk0x34; // 0x34
}; };
// SIZE 0x18 // SIZE 0x18