ref: ab9945c1eefb4a3b64365e10ff6e8cf610f7c52a
parent: 18e4f132a8663f950436618b3ee74764ec9bed05
author: ISSOtm <eldredhabert0@gmail.com>
date: Tue Jul 19 14:31:14 EDT 2022
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.
--- a/include/linkdefs.h
+++ b/include/linkdefs.h
@@ -13,8 +13,7 @@
#include <stdbool.h>
#include <stdint.h>
-#define RGBDS_OBJECT_VERSION_STRING "RGB%1u"
-#define RGBDS_OBJECT_VERSION_NUMBER 9U
+#define RGBDS_OBJECT_VERSION_STRING "RGB9"
#define RGBDS_OBJECT_REV 9U
enum AssertionType {
--- a/src/asm/output.c
+++ b/src/asm/output.c
@@ -532,7 +532,7 @@
/* 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);
--- a/src/link/object.c
+++ b/src/link/object.c
@@ -500,20 +500,15 @@
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;