|
@@ -83,6 +83,8 @@ EXPORT_SYMBOL(kstrdup_const);
|
|
|
* @s: the string to duplicate
|
|
|
* @max: read at most @max chars from @s
|
|
|
* @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)
|
|
|
{
|
|
@@ -120,6 +122,28 @@ void *kmemdup(const void *src, size_t len, gfp_t gfp)
|
|
|
}
|
|
|
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
|
|
|
*
|