shithub: rgbds

Download patch

ref: ab9945c1eefb4a3b64365e10ff6e8cf610f7c52a
parent: 18e4f132a8663f950436618b3ee74764ec9bed05
author: ISSOtm <[email protected]>
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;