powerpc/prom_init: Convert prom_strcpy() into prom_strscpy_pad()
authorMichael Ellerman <mpe@ellerman.id.au>
Mon, 21 Jun 2021 06:49:37 +0000 (16:49 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 24 Jun 2021 14:06:55 +0000 (00:06 +1000)
In a subsequent patch we'd like to have something like a strscpy_pad()
implementation usable in prom_init.c.

Currently we have a strcpy() implementation with only one caller, so
convert it into strscpy_pad() and update the caller.

Reviewed-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210621064938.2021419-1-mpe@ellerman.id.au
arch/powerpc/kernel/prom_init.c

index 523b316..c18d55f 100644 (file)
@@ -242,13 +242,31 @@ static int __init prom_strcmp(const char *cs, const char *ct)
        return 0;
 }
 
-static char __init *prom_strcpy(char *dest, const char *src)
+static ssize_t __init prom_strscpy_pad(char *dest, const char *src, size_t n)
 {
-       char *tmp = dest;
+       ssize_t rc;
+       size_t i;
 
-       while ((*dest++ = *src++) != '\0')
-               /* nothing */;
-       return tmp;
+       if (n == 0 || n > INT_MAX)
+               return -E2BIG;
+
+       // Copy up to n bytes
+       for (i = 0; i < n && src[i] != '\0'; i++)
+               dest[i] = src[i];
+
+       rc = i;
+
+       // If we copied all n then we have run out of space for the nul
+       if (rc == n) {
+               // Rewind by one character to ensure nul termination
+               i--;
+               rc = -E2BIG;
+       }
+
+       for (; i < n; i++)
+               dest[i] = '\0';
+
+       return rc;
 }
 
 static int __init prom_strncmp(const char *cs, const char *ct, size_t count)
@@ -2701,7 +2719,7 @@ static void __init flatten_device_tree(void)
 
        /* Add "phandle" in there, we'll need it */
        namep = make_room(&mem_start, &mem_end, 16, 1);
-       prom_strcpy(namep, "phandle");
+       prom_strscpy_pad(namep, "phandle", sizeof("phandle"));
        mem_start = (unsigned long)namep + prom_strlen(namep) + 1;
 
        /* Build string array */