Commit 610a77e0 authored by Li Zefan's avatar Li Zefan Committed by Linus Torvalds
Browse files

memdup_user(): introduce

I notice there are many places doing copy_from_user() which follows

        dst = kmalloc(len, GFP_KERNEL);
        if (!dst)
                return -ENOMEM;
        if (copy_from_user(dst, src, len)) {
		return -EFAULT

memdup_user() is a wrapper of the above code.  With this new function, we
don't have to write 'len' twice, which can lead to typos/mistakes.  It
also produces smaller code and kernel text.

A quick grep shows 250+ places where memdup_user() *may* be used.  I'll
prepare a patchset to do this conversion.
Signed-off-by: default avatarLi Zefan <>
Cc: KOSAKI Motohiro <>
Cc: Americo Wang <>
Cc: Alexey Dobriyan <>
Signed-off-by: default avatarAndrew Morton <>
Signed-off-by: default avatarLinus Torvalds <>
parent e2f17d94
......@@ -12,6 +12,7 @@
#include <linux/stddef.h> /* for NULL */
extern char *strndup_user(const char __user *, long);
extern void *memdup_user(const void __user *, size_t);
* Include machine specific inline routines
......@@ -69,6 +69,36 @@ void *kmemdup(const void *src, size_t len, gfp_t gfp)
* memdup_user - duplicate memory region from user space
* @src: source address in user space
* @len: number of bytes to copy
* Returns an ERR_PTR() on failure.
void *memdup_user(const void __user *src, size_t len)
void *p;
* Always use GFP_KERNEL, since copy_from_user() can sleep and
* cause pagefault, which makes it pointless to use GFP_NOFS
p = kmalloc_track_caller(len, GFP_KERNEL);
if (!p)
return ERR_PTR(-ENOMEM);
if (copy_from_user(p, src, len)) {
return ERR_PTR(-EFAULT);
return p;
* __krealloc - like krealloc() but don't free @p.
* @p: object to reallocate memory for.
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