Commit 5cab144f authored by David Howells's avatar David Howells Committed by Greg Kroah-Hartman

Provide a function to create a NUL-terminated string from unterminated data

commit f3515741 upstream.

Provide a function, kmemdup_nul(), that will create a NUL-terminated string
from an unterminated character array where the length is known in advance.

This is better than kstrndup() in situations where we already know the
string length as the strnlen() in kstrndup() is superfluous.
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5fd4db30
...@@ -123,6 +123,7 @@ extern char *kstrdup(const char *s, gfp_t gfp) __malloc; ...@@ -123,6 +123,7 @@ extern char *kstrdup(const char *s, gfp_t gfp) __malloc;
extern const char *kstrdup_const(const char *s, gfp_t gfp); extern const char *kstrdup_const(const char *s, gfp_t gfp);
extern char *kstrndup(const char *s, size_t len, gfp_t gfp); extern char *kstrndup(const char *s, size_t len, gfp_t gfp);
extern void *kmemdup(const void *src, size_t len, gfp_t gfp); extern void *kmemdup(const void *src, size_t len, gfp_t gfp);
extern char *kmemdup_nul(const char *s, size_t len, gfp_t gfp);
extern char **argv_split(gfp_t gfp, const char *str, int *argcp); extern char **argv_split(gfp_t gfp, const char *str, int *argcp);
extern void argv_free(char **argv); extern void argv_free(char **argv);
......
...@@ -80,6 +80,8 @@ EXPORT_SYMBOL(kstrdup_const); ...@@ -80,6 +80,8 @@ EXPORT_SYMBOL(kstrdup_const);
* @s: the string to duplicate * @s: the string to duplicate
* @max: read at most @max chars from @s * @max: read at most @max chars from @s
* @gfp: the GFP mask used in the kmalloc() call when allocating memory * @gfp: the GFP mask used in the kmalloc() call when allocating memory
*
* Note: Use kmemdup_nul() instead if the size is known exactly.
*/ */
char *kstrndup(const char *s, size_t max, gfp_t gfp) char *kstrndup(const char *s, size_t max, gfp_t gfp)
{ {
...@@ -117,6 +119,28 @@ void *kmemdup(const void *src, size_t len, gfp_t gfp) ...@@ -117,6 +119,28 @@ void *kmemdup(const void *src, size_t len, gfp_t gfp)
} }
EXPORT_SYMBOL(kmemdup); EXPORT_SYMBOL(kmemdup);
/**
* kmemdup_nul - Create a NUL-terminated string from unterminated data
* @s: The data to stringify
* @len: The size of the data
* @gfp: the GFP mask used in the kmalloc() call when allocating memory
*/
char *kmemdup_nul(const char *s, size_t len, gfp_t gfp)
{
char *buf;
if (!s)
return NULL;
buf = kmalloc_track_caller(len + 1, gfp);
if (buf) {
memcpy(buf, s, len);
buf[len] = '\0';
}
return buf;
}
EXPORT_SYMBOL(kmemdup_nul);
/** /**
* memdup_user - duplicate memory region from user space * memdup_user - duplicate memory region from user space
* *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment