Avoid using fscanf to detect RGBDS object files

This function is made for text, e.g. accepts spaces, leading zeros, etc. before `%u`.
This way checks that the correct amount of bytes are read instead.
This commit is contained in:
ISSOtm
2022-07-19 18:31:14 +02:00
parent 18e4f132a8
commit ab9945c1ee
3 changed files with 8 additions and 14 deletions

View File

@@ -532,7 +532,7 @@ void out_WriteObject(void)
/* Also write symbols that weren't written above */
sym_ForEach(registerUnregisteredSymbol, NULL);
fprintf(f, RGBDS_OBJECT_VERSION_STRING, RGBDS_OBJECT_VERSION_NUMBER);
fprintf(f, RGBDS_OBJECT_VERSION_STRING);
putlong(RGBDS_OBJECT_REV, f);
putlong(nbSymbols, f);

View File

@@ -500,20 +500,15 @@ void obj_ReadFile(char const *fileName, unsigned int fileID)
return;
}
/* Begin by reading the magic bytes and version number */
unsigned versionNumber;
int matchedElems = fscanf(file, RGBDS_OBJECT_VERSION_STRING,
&versionNumber);
/* Begin by reading the magic bytes */
int matchedElems;
if (matchedElems != 1)
if (fscanf(file, RGBDS_OBJECT_VERSION_STRING "%n", &matchedElems) == 1
&& matchedElems != strlen(RGBDS_OBJECT_VERSION_STRING))
errx("\"%s\" is not a RGBDS object file", fileName);
verbosePrint("Reading object file %s, version %u\n",
fileName, versionNumber);
if (versionNumber != RGBDS_OBJECT_VERSION_NUMBER)
errx("\"%s\" is an incompatible version %u object file",
fileName, versionNumber);
verbosePrint("Reading object file %s\n",
fileName);
uint32_t revNum;