tplink-safeloader: ignore NULLs in version info
authorSander Vanheule <sander@svanheule.net>
Fri, 3 Feb 2023 22:03:20 +0000 (23:03 +0100)
committerSander Vanheule <sander@svanheule.net>
Sun, 12 Mar 2023 12:35:51 +0000 (13:35 +0100)
When the soft-version partition contents are checked for a text-format
version string, isascii() is used to check the contained bytes. This
also returns true on control characters, which includes terminating
NULL characters.

After checking if the data is a string, use the actual string length for
printing the contained data to avoid outputting NULLs to stdout.

Signed-off-by: Sander Vanheule <sander@svanheule.net>
src/tplink-safeloader.c

index 05b7ca17f7864f9546cc5c96ba28803100c8b931..51f6683c802a80fac1443a802df6cd9dcdccbcef 100644 (file)
@@ -3928,18 +3928,16 @@ static int firmware_info(const char *input)
                if (fread(buf, data_len, 1, fp) != 1)
                        error(1, errno, "Can not read fwup-ptn data from the firmware");
 
-               /* Check for string ignoring padding character */
-               isstr = true;
-               for (i = 0; i < data_len - 1; i++) {
-                       if (!isascii(buf[i])) {
-                               isstr = false;
-                               break;
-                       }
-               }
+               /* Check for (null-terminated) string */
+               ascii_len = 0;
+               while (ascii_len < data_len && isascii(buf[ascii_len]))
+                       ascii_len++;
+
+               isstr = ascii_len == data_len;
 
                printf("\n[Software version]\n");
                if (isstr) {
-                       fwrite(buf, data_len, 1, stdout);
+                       fwrite(buf, strnlen(buf, data_len), 1, stdout);
                        putchar('\n');
                } else if (data_len >= offsetof(struct soft_version, rev)) {
                        s = (struct soft_version *)buf;