mirror of
https://github.com/JesseTG/melonds-ds.git
synced 2025-02-17 12:47:32 +00:00
Don't treat files as firmware if the firmware identifier is invalid
This commit is contained in:
parent
e3be31a26b
commit
618c5a85a2
@ -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;
|
||||
}
|
@ -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
|
||||
|
23
test/python/firmware/core_rejects_invalid_nds_firmware_id.py
Normal file
23
test/python/firmware/core_rejects_invalid_nds_firmware_id.py
Normal 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
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user