aboutsummaryrefslogtreecommitdiff
path: root/kernel/compat.c
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2010-11-01 13:58:18 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2010-11-01 13:58:18 -0400
commit6e1bd1ab1d9ab8e83cdc940df82fbf8418e2593f (patch)
treef1324a39f155375221ed88db0626f61b75c51db6 /kernel/compat.c
parentfec6dd833e733b5d9588a1f1e4d81118b79b5774 (diff)
parent76a6106f124e375df0ea6ba6bcf204b8caff786a (diff)
Merge branch 'for-2.6.37' into for-2.6.38
Diffstat (limited to 'kernel/compat.c')
-rw-r--r--kernel/compat.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/kernel/compat.c b/kernel/compat.c
index e167efce842..c9e2ec0b34a 100644
--- a/kernel/compat.c
+++ b/kernel/compat.c
@@ -1126,3 +1126,24 @@ compat_sys_sysinfo(struct compat_sysinfo __user *info)
return 0;
}
+
+/*
+ * Allocate user-space memory for the duration of a single system call,
+ * in order to marshall parameters inside a compat thunk.
+ */
+void __user *compat_alloc_user_space(unsigned long len)
+{
+ void __user *ptr;
+
+ /* If len would occupy more than half of the entire compat space... */
+ if (unlikely(len > (((compat_uptr_t)~0) >> 1)))
+ return NULL;
+
+ ptr = arch_compat_alloc_user_space(len);
+
+ if (unlikely(!access_ok(VERIFY_WRITE, ptr, len)))
+ return NULL;
+
+ return ptr;
+}
+EXPORT_SYMBOL_GPL(compat_alloc_user_space);