Skip to content

Commit 434bef2

Browse files
keesAlex Shi
authored andcommitted
ia64/uaccess: Enable hardened usercopy
Enables CONFIG_HARDENED_USERCOPY checks on ia64. Based on code from PaX and grsecurity. Signed-off-by: Kees Cook <keescook@chromium.org> (cherry picked from commit 73d35887e24da77e8d1321b2e92bd9b9128e2fc2) Signed-off-by: Alex Shi <alex.shi@linaro.org>
1 parent 3308a2c commit 434bef2

2 files changed

Lines changed: 16 additions & 3 deletions

File tree

arch/ia64/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ config IA64
5353
select MODULES_USE_ELF_RELA
5454
select ARCH_USE_CMPXCHG_LOCKREF
5555
select HAVE_ARCH_AUDITSYSCALL
56+
select HAVE_ARCH_HARDENED_USERCOPY
5657
default y
5758
help
5859
The Itanium Processor Family is Intel's 64-bit successor to

arch/ia64/include/asm/uaccess.h

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -241,12 +241,18 @@ extern unsigned long __must_check __copy_user (void __user *to, const void __use
241241
static inline unsigned long
242242
__copy_to_user (void __user *to, const void *from, unsigned long count)
243243
{
244+
if (!__builtin_constant_p(count))
245+
check_object_size(from, count, true);
246+
244247
return __copy_user(to, (__force void __user *) from, count);
245248
}
246249

247250
static inline unsigned long
248251
__copy_from_user (void *to, const void __user *from, unsigned long count)
249252
{
253+
if (!__builtin_constant_p(count))
254+
check_object_size(to, count, false);
255+
250256
return __copy_user((__force void __user *) to, from, count);
251257
}
252258

@@ -258,8 +264,11 @@ __copy_from_user (void *to, const void __user *from, unsigned long count)
258264
const void *__cu_from = (from); \
259265
long __cu_len = (n); \
260266
\
261-
if (__access_ok(__cu_to, __cu_len, get_fs())) \
262-
__cu_len = __copy_user(__cu_to, (__force void __user *) __cu_from, __cu_len); \
267+
if (__access_ok(__cu_to, __cu_len, get_fs())) { \
268+
if (!__builtin_constant_p(n)) \
269+
check_object_size(__cu_from, __cu_len, true); \
270+
__cu_len = __copy_user(__cu_to, (__force void __user *) __cu_from, __cu_len); \
271+
} \
263272
__cu_len; \
264273
})
265274

@@ -270,8 +279,11 @@ __copy_from_user (void *to, const void __user *from, unsigned long count)
270279
long __cu_len = (n); \
271280
\
272281
__chk_user_ptr(__cu_from); \
273-
if (__access_ok(__cu_from, __cu_len, get_fs())) \
282+
if (__access_ok(__cu_from, __cu_len, get_fs())) { \
283+
if (!__builtin_constant_p(n)) \
284+
check_object_size(__cu_to, __cu_len, false); \
274285
__cu_len = __copy_user((__force void __user *) __cu_to, __cu_from, __cu_len); \
286+
} \
275287
__cu_len; \
276288
})
277289

0 commit comments

Comments
 (0)