aboutsummaryrefslogtreecommitdiff
path: root/dos/chudisk.c
diff options
context:
space:
mode:
authorJavier <dev.git@javispedro.com>2026-11-01 02:07:26 +0100
committerJavier <dev.git@javispedro.com>2026-11-01 02:07:26 +0100
commitc1ec955152b48b7938d20e9cba8b6e67479c2e73 (patch)
treef2fcff55d7a4d9962d08c973f7d49810f213954e /dos/chudisk.c
parent2b80e7e349eeb6b5839577946cff962470d57c21 (diff)
downloadchu-c1ec955152b48b7938d20e9cba8b6e67479c2e73.tar.gz
chu-c1ec955152b48b7938d20e9cba8b6e67479c2e73.zip
add a signature mechanism for ioctl control strings
Diffstat (limited to 'dos/chudisk.c')
-rw-r--r--dos/chudisk.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/dos/chudisk.c b/dos/chudisk.c
index c7c0968..d822110 100644
--- a/dos/chudisk.c
+++ b/dos/chudisk.c
@@ -598,10 +598,13 @@ void interrupt_routine()
return;
}
// If there's enough space, return our internal config string.
- if (saved_drs->cmd.ioctlrw.len >= 3 + 2 + 1 + 5 + 1) {
+ if (saved_drs->cmd.ioctlrw.len >= 2 + /*B*/3 + /*3*/2 + /*R*/2 + /*S*/5 + /*L*/5 + 1) {
uint8_t far * buf = saved_drs->cmd.ioctlrw.buffer;
int len = 0;
- // B = base port (2 byte)
+ // signature (2 bytes)
+ buf[len++] = 'C';
+ buf[len++] = 'H';
+ // B = base port (2 bytes)
buf[len++] = 'B';
_fmemcpy(&buf[len], &ch375_dev.io_base, sizeof(ch375_dev.io_base));
len += sizeof(ch375_dev.io_base);
@@ -615,6 +618,10 @@ void interrupt_routine()
buf[len++] = 'S';
_fmemcpy(&buf[len], &data.unit[saved_drs->unit].start_sector, sizeof(uint32_t));
len += sizeof(uint32_t);
+ // L = partition len (4 bytes)
+ buf[len++] = 'L';
+ _fmemcpy(&buf[len], &data.unit[saved_drs->unit].sectors, sizeof(uint32_t));
+ len += sizeof(uint32_t);
buf[len++] = '\0';
saved_drs->cmd.ioctlrw.len = len;
} else {
@@ -632,7 +639,14 @@ void interrupt_routine()
if (saved_drs->cmd.ioctlrw.len >= 2) {
uint8_t far * buf = saved_drs->cmd.ioctlrw.buffer;
int i = 0;
- do {
+ if (buf[i] != 'C' || buf[i+1] != 'H') {
+ dprintf(" invalid signature\n");
+ saved_drs->cmd.ioctlrw.len = 0;
+ saved_drs->status = DOS_DD_ERR_UNKNOWN_COMMAND | DOS_DD_STATUS_ERROR_DONE;
+ return;
+ }
+ i += 2;
+ while (i < saved_drs->cmd.ioctlrw.len) {
char c = buf[i++];
switch (c) {
case 'S': // Partition start (5 bytes)
@@ -659,7 +673,7 @@ void interrupt_routine()
saved_drs->status = DOS_DD_ERR_WRITE_FAULT | DOS_DD_STATUS_ERROR_DONE;
return;
}
- } while (i < saved_drs->cmd.ioctlrw.len);
+ }
} else {
saved_drs->cmd.ioctlrw.len = 0;
saved_drs->status = DOS_DD_ERR_WRITE_FAULT | DOS_DD_STATUS_ERROR_DONE;