Remove 'type' argument from access_ok() function
Nobody has actually used the type (VERIFY_READ vs VERIFY_WRITE) argument of the user address range verification function since we got rid of the old racy i386-only code to walk page tables by hand. It existed because the original 80386 would not honor the write protect bit when in kernel mode, so you had to do COW by hand before doing any user access. But we haven't supported that in a long time, and these days the 'type' argument is a purely historical artifact. A discussion about extending 'user_access_begin()' to do the range checking resulted this patch, because there is no way we're going to move the old VERIFY_xyz interface to that model. And it's best done at the end of the merge window when I've done most of my merges, so let's just get this done once and for all. This patch was mostly done with a sed-script, with manual fix-ups for the cases that weren't of the trivial 'access_ok(VERIFY_xyz' form. There were a couple of notable cases: - csky still had the old "verify_area()" name as an alias. - the iter_iov code had magical hardcoded knowledge of the actual values of VERIFY_{READ,WRITE} (not that they mattered, since nothing really used it) - microblaze used the type argument for a debug printout but other than those oddities this should be a total no-op patch. I tried to fix up all architectures, did fairly extensive grepping for access_ok() uses, and the changes are trivial, but I may have missed something. Any missed conversion should be trivially fixable, though. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
@@ -72,7 +72,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
|
||||
int ret = 0;
|
||||
u32 prev;
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))
|
||||
if (!access_ok(uaddr, sizeof(u32)))
|
||||
return -EFAULT;
|
||||
|
||||
__asm__ __volatile__ (
|
||||
|
@@ -62,7 +62,7 @@ static inline int __access_ok(unsigned long addr, unsigned long size,
|
||||
|
||||
#endif
|
||||
|
||||
#define access_ok(type, addr, size) \
|
||||
#define access_ok(addr, size) \
|
||||
(__chk_user_ptr(addr), (void)(type), \
|
||||
__access_ok((__force unsigned long)(addr), (size), get_fs()))
|
||||
|
||||
@@ -166,7 +166,7 @@ do { \
|
||||
long __pu_err = -EFAULT; \
|
||||
__typeof__(*(ptr)) __user *__pu_addr = (ptr); \
|
||||
might_fault(); \
|
||||
if (access_ok(VERIFY_WRITE, __pu_addr, size)) \
|
||||
if (access_ok(__pu_addr, size)) \
|
||||
__put_user_size((x), __pu_addr, (size), __pu_err); \
|
||||
__pu_err; \
|
||||
})
|
||||
@@ -276,7 +276,7 @@ do { \
|
||||
__long_type(*(ptr)) __gu_val = 0; \
|
||||
__typeof__(*(ptr)) __user *__gu_addr = (ptr); \
|
||||
might_fault(); \
|
||||
if (access_ok(VERIFY_READ, __gu_addr, (size))) { \
|
||||
if (access_ok(__gu_addr, (size))) { \
|
||||
barrier_nospec(); \
|
||||
__get_user_size(__gu_val, __gu_addr, (size), __gu_err); \
|
||||
} \
|
||||
@@ -374,7 +374,7 @@ extern unsigned long __clear_user(void __user *addr, unsigned long size);
|
||||
static inline unsigned long clear_user(void __user *addr, unsigned long size)
|
||||
{
|
||||
might_fault();
|
||||
if (likely(access_ok(VERIFY_WRITE, addr, size)))
|
||||
if (likely(access_ok(addr, size)))
|
||||
return __clear_user(addr, size);
|
||||
return size;
|
||||
}
|
||||
|
@@ -131,8 +131,7 @@ static int emulate_spe(struct pt_regs *regs, unsigned int reg,
|
||||
|
||||
/* Verify the address of the operand */
|
||||
if (unlikely(user_mode(regs) &&
|
||||
!access_ok((flags & ST ? VERIFY_WRITE : VERIFY_READ),
|
||||
addr, nb)))
|
||||
!access_ok(addr, nb)))
|
||||
return -EFAULT;
|
||||
|
||||
/* userland only */
|
||||
|
@@ -523,7 +523,7 @@ static ssize_t validate_flash_write(struct file *file, const char __user *buf,
|
||||
args_buf->status = VALIDATE_INCOMPLETE;
|
||||
}
|
||||
|
||||
if (!access_ok(VERIFY_READ, buf, count)) {
|
||||
if (!access_ok(buf, count)) {
|
||||
rc = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
@@ -335,7 +335,7 @@ static ssize_t rtas_log_read(struct file * file, char __user * buf,
|
||||
|
||||
count = rtas_error_log_buffer_max;
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, buf, count))
|
||||
if (!access_ok(buf, count))
|
||||
return -EFAULT;
|
||||
|
||||
tmp = kmalloc(count, GFP_KERNEL);
|
||||
|
@@ -44,7 +44,7 @@ void __user *get_sigframe(struct ksignal *ksig, unsigned long sp,
|
||||
newsp = (oldsp - frame_size) & ~0xFUL;
|
||||
|
||||
/* Check access */
|
||||
if (!access_ok(VERIFY_WRITE, (void __user *)newsp, oldsp - newsp))
|
||||
if (!access_ok((void __user *)newsp, oldsp - newsp))
|
||||
return NULL;
|
||||
|
||||
return (void __user *)newsp;
|
||||
|
@@ -1017,7 +1017,7 @@ static int do_setcontext(struct ucontext __user *ucp, struct pt_regs *regs, int
|
||||
#else
|
||||
if (__get_user(mcp, &ucp->uc_regs))
|
||||
return -EFAULT;
|
||||
if (!access_ok(VERIFY_READ, mcp, sizeof(*mcp)))
|
||||
if (!access_ok(mcp, sizeof(*mcp)))
|
||||
return -EFAULT;
|
||||
#endif
|
||||
set_current_blocked(&set);
|
||||
@@ -1120,7 +1120,7 @@ SYSCALL_DEFINE3(swapcontext, struct ucontext __user *, old_ctx,
|
||||
*/
|
||||
mctx = (struct mcontext __user *)
|
||||
((unsigned long) &old_ctx->uc_mcontext & ~0xfUL);
|
||||
if (!access_ok(VERIFY_WRITE, old_ctx, ctx_size)
|
||||
if (!access_ok(old_ctx, ctx_size)
|
||||
|| save_user_regs(regs, mctx, NULL, 0, ctx_has_vsx_region)
|
||||
|| put_sigset_t(&old_ctx->uc_sigmask, ¤t->blocked)
|
||||
|| __put_user(to_user_ptr(mctx), &old_ctx->uc_regs))
|
||||
@@ -1128,7 +1128,7 @@ SYSCALL_DEFINE3(swapcontext, struct ucontext __user *, old_ctx,
|
||||
}
|
||||
if (new_ctx == NULL)
|
||||
return 0;
|
||||
if (!access_ok(VERIFY_READ, new_ctx, ctx_size) ||
|
||||
if (!access_ok(new_ctx, ctx_size) ||
|
||||
fault_in_pages_readable((u8 __user *)new_ctx, ctx_size))
|
||||
return -EFAULT;
|
||||
|
||||
@@ -1169,7 +1169,7 @@ SYSCALL_DEFINE0(rt_sigreturn)
|
||||
|
||||
rt_sf = (struct rt_sigframe __user *)
|
||||
(regs->gpr[1] + __SIGNAL_FRAMESIZE + 16);
|
||||
if (!access_ok(VERIFY_READ, rt_sf, sizeof(*rt_sf)))
|
||||
if (!access_ok(rt_sf, sizeof(*rt_sf)))
|
||||
goto bad;
|
||||
|
||||
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
||||
@@ -1315,7 +1315,7 @@ SYSCALL_DEFINE3(debug_setcontext, struct ucontext __user *, ctx,
|
||||
current->thread.debug.dbcr0 = new_dbcr0;
|
||||
#endif
|
||||
|
||||
if (!access_ok(VERIFY_READ, ctx, sizeof(*ctx)) ||
|
||||
if (!access_ok(ctx, sizeof(*ctx)) ||
|
||||
fault_in_pages_readable((u8 __user *)ctx, sizeof(*ctx)))
|
||||
return -EFAULT;
|
||||
|
||||
@@ -1500,7 +1500,7 @@ SYSCALL_DEFINE0(sigreturn)
|
||||
{
|
||||
sr = (struct mcontext __user *)from_user_ptr(sigctx.regs);
|
||||
addr = sr;
|
||||
if (!access_ok(VERIFY_READ, sr, sizeof(*sr))
|
||||
if (!access_ok(sr, sizeof(*sr))
|
||||
|| restore_user_regs(regs, sr, 1))
|
||||
goto badframe;
|
||||
}
|
||||
|
@@ -383,7 +383,7 @@ static long restore_sigcontext(struct task_struct *tsk, sigset_t *set, int sig,
|
||||
err |= __get_user(v_regs, &sc->v_regs);
|
||||
if (err)
|
||||
return err;
|
||||
if (v_regs && !access_ok(VERIFY_READ, v_regs, 34 * sizeof(vector128)))
|
||||
if (v_regs && !access_ok(v_regs, 34 * sizeof(vector128)))
|
||||
return -EFAULT;
|
||||
/* Copy 33 vec registers (vr0..31 and vscr) from the stack */
|
||||
if (v_regs != NULL && (msr & MSR_VEC) != 0) {
|
||||
@@ -502,10 +502,9 @@ static long restore_tm_sigcontexts(struct task_struct *tsk,
|
||||
err |= __get_user(tm_v_regs, &tm_sc->v_regs);
|
||||
if (err)
|
||||
return err;
|
||||
if (v_regs && !access_ok(VERIFY_READ, v_regs, 34 * sizeof(vector128)))
|
||||
if (v_regs && !access_ok(v_regs, 34 * sizeof(vector128)))
|
||||
return -EFAULT;
|
||||
if (tm_v_regs && !access_ok(VERIFY_READ,
|
||||
tm_v_regs, 34 * sizeof(vector128)))
|
||||
if (tm_v_regs && !access_ok(tm_v_regs, 34 * sizeof(vector128)))
|
||||
return -EFAULT;
|
||||
/* Copy 33 vec registers (vr0..31 and vscr) from the stack */
|
||||
if (v_regs != NULL && tm_v_regs != NULL && (msr & MSR_VEC) != 0) {
|
||||
@@ -671,7 +670,7 @@ SYSCALL_DEFINE3(swapcontext, struct ucontext __user *, old_ctx,
|
||||
ctx_has_vsx_region = 1;
|
||||
|
||||
if (old_ctx != NULL) {
|
||||
if (!access_ok(VERIFY_WRITE, old_ctx, ctx_size)
|
||||
if (!access_ok(old_ctx, ctx_size)
|
||||
|| setup_sigcontext(&old_ctx->uc_mcontext, current, 0, NULL, 0,
|
||||
ctx_has_vsx_region)
|
||||
|| __copy_to_user(&old_ctx->uc_sigmask,
|
||||
@@ -680,7 +679,7 @@ SYSCALL_DEFINE3(swapcontext, struct ucontext __user *, old_ctx,
|
||||
}
|
||||
if (new_ctx == NULL)
|
||||
return 0;
|
||||
if (!access_ok(VERIFY_READ, new_ctx, ctx_size)
|
||||
if (!access_ok(new_ctx, ctx_size)
|
||||
|| __get_user(tmp, (u8 __user *) new_ctx)
|
||||
|| __get_user(tmp, (u8 __user *) new_ctx + ctx_size - 1))
|
||||
return -EFAULT;
|
||||
@@ -725,7 +724,7 @@ SYSCALL_DEFINE0(rt_sigreturn)
|
||||
/* Always make any pending restarted system calls return -EINTR */
|
||||
current->restart_block.fn = do_no_restart_syscall;
|
||||
|
||||
if (!access_ok(VERIFY_READ, uc, sizeof(*uc)))
|
||||
if (!access_ok(uc, sizeof(*uc)))
|
||||
goto badframe;
|
||||
|
||||
if (__copy_from_user(&set, &uc->uc_sigmask, sizeof(set)))
|
||||
|
@@ -89,7 +89,7 @@ ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, s
|
||||
if ( (unsigned long)n >= 4096 )
|
||||
{
|
||||
unsigned long __user *buffer = (unsigned long __user *)n;
|
||||
if (!access_ok(VERIFY_READ, buffer, 5*sizeof(unsigned long))
|
||||
if (!access_ok(buffer, 5*sizeof(unsigned long))
|
||||
|| __get_user(n, buffer)
|
||||
|| __get_user(inp, ((fd_set __user * __user *)(buffer+1)))
|
||||
|| __get_user(outp, ((fd_set __user * __user *)(buffer+2)))
|
||||
|
@@ -837,7 +837,7 @@ static void p9_hmi_special_emu(struct pt_regs *regs)
|
||||
addr = (__force const void __user *)ea;
|
||||
|
||||
/* Check it */
|
||||
if (!access_ok(VERIFY_READ, addr, 16)) {
|
||||
if (!access_ok(addr, 16)) {
|
||||
pr_devel("HMI vec emu: bad access %i:%s[%d] nip=%016lx"
|
||||
" instr=%08x addr=%016lx\n",
|
||||
smp_processor_id(), current->comm, current->pid,
|
||||
|
@@ -1744,7 +1744,7 @@ static ssize_t kvm_htab_read(struct file *file, char __user *buf,
|
||||
int first_pass;
|
||||
unsigned long hpte[2];
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, buf, count))
|
||||
if (!access_ok(buf, count))
|
||||
return -EFAULT;
|
||||
if (kvm_is_radix(kvm))
|
||||
return 0;
|
||||
@@ -1844,7 +1844,7 @@ static ssize_t kvm_htab_write(struct file *file, const char __user *buf,
|
||||
int mmu_ready;
|
||||
int pshift;
|
||||
|
||||
if (!access_ok(VERIFY_READ, buf, count))
|
||||
if (!access_ok(buf, count))
|
||||
return -EFAULT;
|
||||
if (kvm_is_radix(kvm))
|
||||
return -EINVAL;
|
||||
|
@@ -37,7 +37,7 @@ __wsum csum_and_copy_from_user(const void __user *src, void *dst,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (unlikely((len < 0) || !access_ok(VERIFY_READ, src, len))) {
|
||||
if (unlikely((len < 0) || !access_ok(src, len))) {
|
||||
*err_ptr = -EFAULT;
|
||||
csum = (__force unsigned int)sum;
|
||||
goto out;
|
||||
@@ -78,7 +78,7 @@ __wsum csum_and_copy_to_user(const void *src, void __user *dst, int len,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (unlikely((len < 0) || !access_ok(VERIFY_WRITE, dst, len))) {
|
||||
if (unlikely((len < 0) || !access_ok(dst, len))) {
|
||||
*err_ptr = -EFAULT;
|
||||
csum = -1; /* invalid checksum */
|
||||
goto out;
|
||||
|
@@ -274,7 +274,7 @@ static bool bad_stack_expansion(struct pt_regs *regs, unsigned long address,
|
||||
return false;
|
||||
|
||||
if ((flags & FAULT_FLAG_WRITE) && (flags & FAULT_FLAG_USER) &&
|
||||
access_ok(VERIFY_READ, nip, sizeof(*nip))) {
|
||||
access_ok(nip, sizeof(*nip))) {
|
||||
unsigned int inst;
|
||||
int res;
|
||||
|
||||
|
@@ -214,7 +214,7 @@ SYSCALL_DEFINE3(subpage_prot, unsigned long, addr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!access_ok(VERIFY_READ, map, (len >> PAGE_SHIFT) * sizeof(u32)))
|
||||
if (!access_ok(map, (len >> PAGE_SHIFT) * sizeof(u32)))
|
||||
return -EFAULT;
|
||||
|
||||
down_write(&mm->mmap_sem);
|
||||
|
@@ -31,7 +31,7 @@ static unsigned int user_getsp32(unsigned int sp, int is_first)
|
||||
unsigned int stack_frame[2];
|
||||
void __user *p = compat_ptr(sp);
|
||||
|
||||
if (!access_ok(VERIFY_READ, p, sizeof(stack_frame)))
|
||||
if (!access_ok(p, sizeof(stack_frame)))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
@@ -57,7 +57,7 @@ static unsigned long user_getsp64(unsigned long sp, int is_first)
|
||||
{
|
||||
unsigned long stack_frame[3];
|
||||
|
||||
if (!access_ok(VERIFY_READ, (void __user *)sp, sizeof(stack_frame)))
|
||||
if (!access_ok((void __user *)sp, sizeof(stack_frame)))
|
||||
return 0;
|
||||
|
||||
if (__copy_from_user_inatomic(stack_frame, (void __user *)sp,
|
||||
|
@@ -609,7 +609,7 @@ static ssize_t spufs_mbox_read(struct file *file, char __user *buf,
|
||||
if (len < 4)
|
||||
return -EINVAL;
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, buf, len))
|
||||
if (!access_ok(buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
udata = (void __user *)buf;
|
||||
@@ -717,7 +717,7 @@ static ssize_t spufs_ibox_read(struct file *file, char __user *buf,
|
||||
if (len < 4)
|
||||
return -EINVAL;
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, buf, len))
|
||||
if (!access_ok(buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
udata = (void __user *)buf;
|
||||
@@ -856,7 +856,7 @@ static ssize_t spufs_wbox_write(struct file *file, const char __user *buf,
|
||||
return -EINVAL;
|
||||
|
||||
udata = (void __user *)buf;
|
||||
if (!access_ok(VERIFY_READ, buf, len))
|
||||
if (!access_ok(buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
if (__get_user(wbox_data, udata))
|
||||
@@ -1994,7 +1994,7 @@ static ssize_t spufs_mbox_info_read(struct file *file, char __user *buf,
|
||||
int ret;
|
||||
struct spu_context *ctx = file->private_data;
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, buf, len))
|
||||
if (!access_ok(buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
ret = spu_acquire_saved(ctx);
|
||||
@@ -2034,7 +2034,7 @@ static ssize_t spufs_ibox_info_read(struct file *file, char __user *buf,
|
||||
struct spu_context *ctx = file->private_data;
|
||||
int ret;
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, buf, len))
|
||||
if (!access_ok(buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
ret = spu_acquire_saved(ctx);
|
||||
@@ -2077,7 +2077,7 @@ static ssize_t spufs_wbox_info_read(struct file *file, char __user *buf,
|
||||
struct spu_context *ctx = file->private_data;
|
||||
int ret;
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, buf, len))
|
||||
if (!access_ok(buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
ret = spu_acquire_saved(ctx);
|
||||
@@ -2129,7 +2129,7 @@ static ssize_t spufs_dma_info_read(struct file *file, char __user *buf,
|
||||
struct spu_context *ctx = file->private_data;
|
||||
int ret;
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, buf, len))
|
||||
if (!access_ok(buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
ret = spu_acquire_saved(ctx);
|
||||
@@ -2160,7 +2160,7 @@ static ssize_t __spufs_proxydma_info_read(struct spu_context *ctx,
|
||||
if (len < ret)
|
||||
return -EINVAL;
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, buf, len))
|
||||
if (!access_ok(buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
info.proxydma_info_type = ctx->csa.prob.dma_querytype_RW;
|
||||
|
@@ -192,7 +192,7 @@ static ssize_t lpc_debug_read(struct file *filp, char __user *ubuf,
|
||||
u32 data, pos, len, todo;
|
||||
int rc;
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, ubuf, count))
|
||||
if (!access_ok(ubuf, count))
|
||||
return -EFAULT;
|
||||
|
||||
todo = count;
|
||||
@@ -283,7 +283,7 @@ static ssize_t lpc_debug_write(struct file *filp, const char __user *ubuf,
|
||||
u32 data, pos, len, todo;
|
||||
int rc;
|
||||
|
||||
if (!access_ok(VERIFY_READ, ubuf, count))
|
||||
if (!access_ok(ubuf, count))
|
||||
return -EFAULT;
|
||||
|
||||
todo = count;
|
||||
|
@@ -63,7 +63,7 @@ static ssize_t scanlog_read(struct file *file, char __user *buf,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, buf, count))
|
||||
if (!access_ok(buf, count))
|
||||
return -EFAULT;
|
||||
|
||||
for (;;) {
|
||||
|
Reference in New Issue
Block a user