X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=direct.c;h=d6d6c3f2e63499d7301253b41f9881eb72daef08;hp=65a119d3211e5063fb9a58d05b957dd86f17a54f;hb=HEAD;hpb=253a4352d61d123a20ebb8999127a58498543e8d diff --git a/direct.c b/direct.c index 65a119d..c403b48 100644 --- a/direct.c +++ b/direct.c @@ -621,32 +621,45 @@ allright: tok += 2; + size = lseek(fd, 0L, SEEK_END); + pos = lseek(fd, 0L, SEEK_SET); + if (*tok != EOL) { - // Check size parameter (can be omitted) - if (*tok++ == ',') + // Parse size and position parameters + uint64_t requested_size = -1; // -1 means "not set" for these two + + if (*tok++ != ',') + { + close(fd); + return error("expected comma after incbin filename"); + } + + if (*tok != EOL) { if (*tok != ',') { - if (abs_expr(&size) != OK) + if (abs_expr(&requested_size) != OK) { close(fd); return ERROR; } - if ((int64_t)size <= 0) + + if ((int64_t)requested_size <= 0 || requested_size > size) { + close(fd); return error("invalid incbin size requested"); } } - else - size = lseek(fd, 0L, SEEK_END); - } - // Check offset parameter (can be omitted) - if (*tok != EOL) - { - if (*tok++ == ',') + if (*tok != EOL) { + if (*tok++ != ',') + { + close(fd); + return error("expected comma after size parameter"); + } + if (*tok != EOL) { if (abs_expr(&pos) != OK) @@ -655,29 +668,37 @@ allright: return ERROR; } - lseek(fd, pos, SEEK_SET); - if ((int64_t)(size - pos) < 0) + if ((int64_t)pos <= 0 || pos > size) { - return error("requested incbin size out of range"); + close(fd); + return error("invalid incbin position requested"); } } - else - { - // offset parameter omitted, so it's 0 - pos = lseek(fd, 0L, SEEK_SET); - } } - else - return error(comma_error); + + if (*tok != EOL) + { + close(fd); + return error("extra characters following incbin"); + } } - else - pos = lseek(fd, 0L, SEEK_SET); - } - else - { - // size & pos not given, so assume offset of 0 and all of the binary - size = lseek(fd, 0L, SEEK_END); - pos = lseek(fd, 0L, SEEK_SET); + + // Adjust size if the user didn't specify it via the parameter + if (requested_size == -1) + { + requested_size = size - pos; + } + + // Are we going to read past the end of the file? + if (pos + requested_size > size) + { + close(fd); + return error("invalid combination of incbin position and size"); + } + size = requested_size; + + // All checks passed, let's seek to where the user requested, otherwise at file start + lseek(fd, pos, SEEK_SET); } chcheck(size); @@ -1200,7 +1221,7 @@ int d_ds(WORD siz) if (expr(exprbuf, &eval, &eattr, NULL) < 0) return ERROR; - + // Check to see if the value being passed in is negative (who the hell does // that?--nobody does; it's the code gremlins, or rum, what does it) // N.B.: Since 'eval' is of type uint64_t, if it goes negative, it will @@ -2006,6 +2027,7 @@ int d_56001(void) regtab = reg56tab; regcheck = reg56check; regaccept = reg56accept; + used_architectures |= M56001P | M56001X | M56001Y | M56001L; return 0; } @@ -2037,6 +2059,7 @@ int d_gpu(void) regtab = regrisctab; regcheck = regrisccheck; regaccept = regriscaccept; + //used_architectures |= MGPU; // TODO: Should GPU/DSP have their own dedicated sections in the long run? return 0; } @@ -2068,6 +2091,7 @@ int d_dsp(void) regtab = regrisctab; regcheck = regrisccheck; regaccept = regriscaccept; + //used_architectures |= MDSP; // TODO: Should GPU/DSP have their own dedicated sections in the long run? return 0; } @@ -2340,6 +2364,7 @@ int d_objproc(void) rgpu = 0; // Unset GPU assembly rdsp = 0; // Unset DSP assembly dsp56001 = 0; // Unset 56001 assembly + //used_architectures |= MOP; // TODO: Should OP have its own dedicated section in the long run? return OK; }