Hi > -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; > } >
This implementation seems good to me. I copied it into a new C file and added the following: int main() { char longstr[255]="abcdefghijklmnopqrstuvwxyz"; char shortstr[5]; assert(prom_strscpy_pad(longstr, "", 0) == -E2BIG); assert(prom_strscpy_pad(longstr, "hello", 255) == 5); assert(prom_strscpy_pad(shortstr, "hello", 5) == -E2BIG); assert(memcmp(shortstr, "hell", 5) == 0); assert(memcmp(longstr, "hello\0\0\0\0\0\0\0\0\0", 6) == 0); return 0; } All the assertions pass. I believe this covers all the conditions from the strscpy_pad docstring. Reviewed-by: Daniel Axtens <d...@axtens.net> Kind regards, Daniel > 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 */ > -- > 2.25.1