diff options
Diffstat (limited to 'lib/string.c')
| -rw-r--r-- | lib/string.c | 47 | 
1 files changed, 40 insertions, 7 deletions
| diff --git a/lib/string.c b/lib/string.c index 3ab861c1a857..6016eb3ac73d 100644 --- a/lib/string.c +++ b/lib/string.c @@ -159,11 +159,9 @@ EXPORT_SYMBOL(strlcpy);   * @src: Where to copy the string from   * @count: Size of destination buffer   * - * Copy the string, or as much of it as fits, into the dest buffer. - * The routine returns the number of characters copied (not including - * the trailing NUL) or -E2BIG if the destination buffer wasn't big enough. - * The behavior is undefined if the string buffers overlap. - * The destination buffer is always NUL terminated, unless it's zero-sized. + * Copy the string, or as much of it as fits, into the dest buffer.  The + * behavior is undefined if the string buffers overlap.  The destination + * buffer is always NUL terminated, unless it's zero-sized.   *   * Preferred to strlcpy() since the API doesn't require reading memory   * from the src string beyond the specified "count" bytes, and since @@ -173,8 +171,10 @@ EXPORT_SYMBOL(strlcpy);   *   * Preferred to strncpy() since it always returns a valid string, and   * doesn't unnecessarily force the tail of the destination buffer to be - * zeroed.  If the zeroing is desired, it's likely cleaner to use strscpy() - * with an overflow test, then just memset() the tail of the dest buffer. + * zeroed.  If zeroing is desired please use strscpy_pad(). + * + * Return: The number of characters copied (not including the trailing + *         %NUL) or -E2BIG if the destination buffer wasn't big enough.   */  ssize_t strscpy(char *dest, const char *src, size_t count)  { @@ -237,6 +237,39 @@ ssize_t strscpy(char *dest, const char *src, size_t count)  EXPORT_SYMBOL(strscpy);  #endif +/** + * strscpy_pad() - Copy a C-string into a sized buffer + * @dest: Where to copy the string to + * @src: Where to copy the string from + * @count: Size of destination buffer + * + * Copy the string, or as much of it as fits, into the dest buffer.  The + * behavior is undefined if the string buffers overlap.  The destination + * buffer is always %NUL terminated, unless it's zero-sized. + * + * If the source string is shorter than the destination buffer, zeros + * the tail of the destination buffer. + * + * For full explanation of why you may want to consider using the + * 'strscpy' functions please see the function docstring for strscpy(). + * + * Return: The number of characters copied (not including the trailing + *         %NUL) or -E2BIG if the destination buffer wasn't big enough. + */ +ssize_t strscpy_pad(char *dest, const char *src, size_t count) +{ +	ssize_t written; + +	written = strscpy(dest, src, count); +	if (written < 0 || written == count - 1) +		return written; + +	memset(dest + written + 1, 0, count - written - 1); + +	return written; +} +EXPORT_SYMBOL(strscpy_pad); +  #ifndef __HAVE_ARCH_STRCAT  /**   * strcat - Append one %NUL-terminated string to another |