From b809a079820f9786b4d18d59d582eb0a47d9ad3d Mon Sep 17 00:00:00 2001 From: Speedy_Lex <78314533+speedy-lex@users.noreply.github.com> Date: Wed, 2 Jul 2025 11:12:38 +0200 Subject: [PATCH] drive now err's on an invalid sector/buffer --- src/components/drive.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/components/drive.c b/src/components/drive.c index c4652a2..70a48c7 100644 --- a/src/components/drive.c +++ b/src/components/drive.c @@ -52,6 +52,11 @@ void nn_drive_readSector(nn_drive *drive, void *_, nn_component *component, nn_c int sector = nn_toInt(sectorValue); size_t sector_size = drive->getSectorSize(component, drive->userdata); char buf[sector_size]; + // we leave the +1 intentionally to compare the end of the real sector + if (sector < 1 || (sector * sector_size > drive->getCapacity(component, drive->userdata))) { + nn_setCError(computer, "bad argument #1 (sector out of range)"); + return; + } drive->readSector(component, drive->userdata, sector, buf); nn_return_string(computer, buf, sector_size); } @@ -63,14 +68,16 @@ void nn_drive_writeSector(nn_drive *drive, void *_, nn_component *component, nn_ size_t buf_size = 0; const char *buf = nn_toString(bufValue, &buf_size); - if (buf_size < sector_size) { - char padded[sector_size]; - memset(padded, 0, sector_size); - memcpy(padded, buf, buf_size); - drive->writeSector(component, drive->userdata, sector, padded); - } else { - drive->writeSector(component, drive->userdata, sector, buf); + if (buf_size != sector_size) { + nn_setCError(computer, "bad argument #2 (expected buffer of length `sectorSize`)"); + return; } + // we leave the +1 intentionally to compare the end of the real sector + if (sector < 1 || (sector * sector_size > drive->getCapacity(component, drive->userdata))) { + nn_setCError(computer, "bad argument #1 (sector out of range)"); + return; + } + drive->writeSector(component, drive->userdata, sector, buf); } void nn_drive_readByte(nn_drive *drive, void *_, nn_component *component, nn_computer *computer) { nn_value offsetValue = nn_getArgument(computer, 0);