Don't treat files as firmware if the firmware identifier is invalid

This commit is contained in:
Jesse Talavera 2024-07-21 17:07:49 -04:00
parent e3be31a26b
commit 618c5a85a2
4 changed files with 60 additions and 0 deletions

View File

@ -159,6 +159,13 @@ bool MelonDsDs::config::IsFirmwareImage(const retro::dirent& file, Firmware::Fir
return false;
}
bool isDsFirmware = loadedHeader.ConsoleType == Firmware::FirmwareConsoleType::DS || loadedHeader.ConsoleType == Firmware::FirmwareConsoleType::DSLite;
if (isDsFirmware && strncmp(reinterpret_cast<const char*>(loadedHeader.Identifier.data()), "MAC", 3) != 0) {
retro::debug("{} doesn't look like valid NDS firmware (unrecognized identifier {})", file.path, fmt::join(loadedHeader.Identifier, ""));
return false;
}
// TODO: Validate the checksum of the userdata region
memcpy(&header, &buffer, sizeof(buffer));
return true;
}

View File

@ -7,6 +7,19 @@ add_python_test(
CORE_OPTION "melonds_sysfile_mode=builtin"
)
### Validating Firmware (see https://github.com/JesseTG/melonds-ds/issues/183)
add_python_test(
NAME "Core doesn't list wrongly-sized files as NDS firmware"
TEST_MODULE firmware.core_rejects_wrong_sized_nds_firmware
NDS_SYSFILES
)
add_python_test(
NAME "Core doesn't list files with an invalid identifier as NDS firmware"
TEST_MODULE firmware.core_rejects_invalid_nds_firmware_id
NDS_SYSFILES
)
### Ensuring firmware is not overwritten
# See https://github.com/JesseTG/melonds-ds/issues/59

View File

@ -0,0 +1,23 @@
import os
from libretro import Session
import prelude
with open(os.environ["NDS_FIRMWARE"], "rb") as f:
firmware = bytearray(f.read())
assert len(firmware) == 262144
firmware[0x8:0xC] = b"NNNN"
badfirmwarepath = os.path.join(prelude.core_system_dir, "badfirmware.bin")
with open(badfirmwarepath, "wb") as f:
f.write(firmware)
session: Session
with prelude.session() as session:
definition = session.options.definitions[b"melonds_firmware_nds_path"]
assert definition is not None, "melonds_firmware_nds_path should be defined"
assert all(v.value is None or b"badfirmware.bin" not in v.value for v in definition.values), \
"ARM9_BIOS should not be in melonds_firmware_nds_path values"
# Account for the empty entries in the values array

View File

@ -0,0 +1,17 @@
import os
from libretro import Session
import prelude
session: Session
with prelude.session() as session:
definition = session.options.definitions[b"melonds_firmware_nds_path"]
assert definition is not None, "melonds_firmware_nds_path should be defined"
assert os.environ["ARM7_BIOS"] is not None
arm9name = os.path.basename(os.environ["ARM9_BIOS"]).encode()
assert arm9name is not None and arm9name != b""
assert all(v.value is None or arm9name not in v.value for v in definition.values), \
"ARM9_BIOS should not be in melonds_firmware_nds_path values"
# Account for the empty entries in the values array