mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-04 00:06:36 +00:00

This is a preparation for changing over architectures to the generic implementation one at a time. As there are no callers of either __strncpy_from_user() or __strnlen_user(), fold these into the strncpy_from_user() and strnlen_user() functions to make each implementation independent of the others. Many of these implementations have known bugs, but the intention here is to not change behavior at all and stay compatible with those bugs for the moment. Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
49 lines
1.6 KiB
C
49 lines
1.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
|
|
* Copyright (C) 2015 Richard Weinberger (richard@nod.at)
|
|
*/
|
|
|
|
#ifndef __UM_UACCESS_H
|
|
#define __UM_UACCESS_H
|
|
|
|
#include <asm/elf.h>
|
|
|
|
#define __under_task_size(addr, size) \
|
|
(((unsigned long) (addr) < TASK_SIZE) && \
|
|
(((unsigned long) (addr) + (size)) < TASK_SIZE))
|
|
|
|
#define __access_ok_vsyscall(addr, size) \
|
|
(((unsigned long) (addr) >= FIXADDR_USER_START) && \
|
|
((unsigned long) (addr) + (size) <= FIXADDR_USER_END) && \
|
|
((unsigned long) (addr) + (size) >= (unsigned long)(addr)))
|
|
|
|
#define __addr_range_nowrap(addr, size) \
|
|
((unsigned long) (addr) <= ((unsigned long) (addr) + (size)))
|
|
|
|
extern unsigned long raw_copy_from_user(void *to, const void __user *from, unsigned long n);
|
|
extern unsigned long raw_copy_to_user(void __user *to, const void *from, unsigned long n);
|
|
extern long strncpy_from_user(char *dst, const char __user *src, long count);
|
|
extern long strnlen_user(const void __user *str, long len);
|
|
extern unsigned long __clear_user(void __user *mem, unsigned long len);
|
|
static inline int __access_ok(unsigned long addr, unsigned long size);
|
|
|
|
/* Teach asm-generic/uaccess.h that we have C functions for these. */
|
|
#define __access_ok __access_ok
|
|
#define __clear_user __clear_user
|
|
#define strnlen_user strnlen_user
|
|
#define strncpy_from_user strncpy_from_user
|
|
#define INLINE_COPY_FROM_USER
|
|
#define INLINE_COPY_TO_USER
|
|
|
|
#include <asm-generic/uaccess.h>
|
|
|
|
static inline int __access_ok(unsigned long addr, unsigned long size)
|
|
{
|
|
return __addr_range_nowrap(addr, size) &&
|
|
(__under_task_size(addr, size) ||
|
|
__access_ok_vsyscall(addr, size) ||
|
|
uaccess_kernel());
|
|
}
|
|
|
|
#endif
|