Skip to content

Commit

Permalink
Merge branch 'work.uaccess-unaligned' of git://git.kernel.org/pub/scm…
Browse files Browse the repository at this point in the history
…/linux/kernel/git/viro/vfs

Pull uacess-unaligned removal from Al Viro:
 "That stuff had just one user, and an exotic one, at that - binfmt_flat
  on arm and m68k"

* 'work.uaccess-unaligned' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
  kill {__,}{get,put}_user_unaligned()
  binfmt_flat: flat_{get,put}_addr_from_rp() should be able to fail
  • Loading branch information
torvalds committed Jul 15, 2017
2 parents 2173bd0 + 3170d8d commit 89cbec7
Show file tree
Hide file tree
Showing 24 changed files with 168 additions and 450 deletions.
25 changes: 22 additions & 3 deletions arch/arm/include/asm/flat.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,31 @@
#ifndef __ARM_FLAT_H__
#define __ARM_FLAT_H__

#include <linux/uaccess.h>

#define flat_argvp_envp_on_stack() 1
#define flat_old_ram_flag(flags) (flags)
#define flat_reloc_valid(reloc, size) ((reloc) <= (size))
#define flat_get_addr_from_rp(rp, relval, flags, persistent) \
({ unsigned long __val; __get_user_unaligned(__val, rp); __val; })
#define flat_put_addr_at_rp(rp, val, relval) __put_user_unaligned(val, rp)

static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
u32 *addr, u32 *persistent)
{
#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
return copy_from_user(addr, rp, 4) ? -EFAULT : 0;
#else
return get_user(*addr, rp);
#endif
}

static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
{
#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
return copy_to_user(rp, &addr, 4) ? -EFAULT : 0;
#else
return put_user(addr, rp);
#endif
}

#define flat_get_relocate_addr(rel) (rel)
#define flat_set_persistent(relval, p) 0

Expand Down
7 changes: 0 additions & 7 deletions arch/arm/include/asm/uaccess.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,6 @@
#include <asm/unified.h>
#include <asm/compiler.h>

#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
#include <asm-generic/uaccess-unaligned.h>
#else
#define __get_user_unaligned __get_user
#define __put_user_unaligned __put_user
#endif

#include <asm/extable.h>

/*
Expand Down
4 changes: 0 additions & 4 deletions arch/arm64/include/asm/uaccess.h
Original file line number Diff line number Diff line change
Expand Up @@ -254,8 +254,6 @@ do { \
(void)0; \
})

#define __get_user_unaligned __get_user

#define get_user(x, ptr) \
({ \
__typeof__(*(ptr)) __user *__p = (ptr); \
Expand Down Expand Up @@ -320,8 +318,6 @@ do { \
(void)0; \
})

#define __put_user_unaligned __put_user

#define put_user(x, ptr) \
({ \
__typeof__(*(ptr)) __user *__p = (ptr); \
Expand Down
25 changes: 15 additions & 10 deletions arch/blackfin/include/asm/flat.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,28 @@
#define flat_argvp_envp_on_stack() 0
#define flat_old_ram_flag(flags) (flags)

extern unsigned long bfin_get_addr_from_rp (unsigned long *ptr,
unsigned long relval,
unsigned long flags,
unsigned long *persistent);
extern unsigned long bfin_get_addr_from_rp (u32 *ptr, u32 relval,
u32 flags, u32 *persistent);

extern void bfin_put_addr_at_rp(unsigned long *ptr, unsigned long addr,
unsigned long relval);
extern void bfin_put_addr_at_rp(u32 *ptr, u32 addr, u32 relval);

/* The amount by which a relocation can exceed the program image limits
without being regarded as an error. */

#define flat_reloc_valid(reloc, size) ((reloc) <= (size))

#define flat_get_addr_from_rp(rp, relval, flags, persistent) \
bfin_get_addr_from_rp(rp, relval, flags, persistent)
#define flat_put_addr_at_rp(rp, val, relval) \
bfin_put_addr_at_rp(rp, val, relval)
static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
u32 *addr, u32 *persistent)
{
*addr = bfin_get_addr_from_rp(rp, relval, flags, persistent);
return 0;
}

static inline int flat_put_addr_at_rp(u32 __user *rp, u32 val, u32 relval)
{
bfin_put_addr_at_rp(rp, val, relval);
return 0;
}

/* Convert a relocation entry into an address. */
static inline unsigned long
Expand Down
13 changes: 6 additions & 7 deletions arch/blackfin/kernel/flat.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@
#define FLAT_BFIN_RELOC_TYPE_16H_BIT 1
#define FLAT_BFIN_RELOC_TYPE_32_BIT 2

unsigned long bfin_get_addr_from_rp(unsigned long *ptr,
unsigned long relval,
unsigned long flags,
unsigned long *persistent)
unsigned long bfin_get_addr_from_rp(u32 *ptr,
u32 relval,
u32 flags,
u32 *persistent)
{
unsigned short *usptr = (unsigned short *)ptr;
int type = (relval >> 26) & 7;
unsigned long val;
u32 val;

switch (type) {
case FLAT_BFIN_RELOC_TYPE_16_BIT:
Expand Down Expand Up @@ -59,8 +59,7 @@ EXPORT_SYMBOL(bfin_get_addr_from_rp);
* Insert the address ADDR into the symbol reference at RP;
* RELVAL is the raw relocation-table entry from which RP is derived
*/
void bfin_put_addr_at_rp(unsigned long *ptr, unsigned long addr,
unsigned long relval)
void bfin_put_addr_at_rp(u32 *ptr, u32 addr, u32 relval)
{
unsigned short *usptr = (unsigned short *)ptr;
int type = (relval >> 26) & 7;
Expand Down
15 changes: 13 additions & 2 deletions arch/c6x/include/asm/flat.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,22 @@
#ifndef __ASM_C6X_FLAT_H
#define __ASM_C6X_FLAT_H

#include <asm/unaligned.h>

#define flat_argvp_envp_on_stack() 0
#define flat_old_ram_flag(flags) (flags)
#define flat_reloc_valid(reloc, size) ((reloc) <= (size))
#define flat_get_addr_from_rp(rp, relval, flags, p) get_unaligned(rp)
#define flat_put_addr_at_rp(rp, val, relval) put_unaligned(val, rp)
static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
u32 *addr, u32 *persistent)
{
*addr = get_unaligned((__force u32 *)rp);
return 0;
}
static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
{
put_unaligned(addr, (__force u32 *)rp);
return 0;
}
#define flat_get_relocate_addr(rel) (rel)
#define flat_set_persistent(relval, p) 0

Expand Down
24 changes: 18 additions & 6 deletions arch/h8300/include/asm/flat.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
#ifndef __H8300_FLAT_H__
#define __H8300_FLAT_H__

#include <asm/unaligned.h>

#define flat_argvp_envp_on_stack() 1
#define flat_old_ram_flag(flags) 1
#define flat_reloc_valid(reloc, size) ((reloc) <= (size))
Expand All @@ -18,11 +20,21 @@
*/

#define flat_get_relocate_addr(rel) (rel & ~0x00000001)
#define flat_get_addr_from_rp(rp, relval, flags, persistent) \
({(void)persistent; \
get_unaligned(rp) & (((flags) & FLAT_FLAG_GOTPIC) ? \
0xffffffff : 0x00ffffff); })
#define flat_put_addr_at_rp(rp, addr, rel) \
put_unaligned(((*(char *)(rp)) << 24) | ((addr) & 0x00ffffff), (rp))
static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
u32 *addr, u32 *persistent)
{
u32 val = get_unaligned((__force u32 *)rp);
if (!(flags & FLAT_FLAG_GOTPIC)
val &= 0x00ffffff;
*addr = val;
return 0;
}

static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
{
u32 *p = (__force u32 *)rp;
put_unaligned((addr & 0x00ffffff) | (*(char *)p << 24), p);
return 0;
}

#endif /* __H8300_FLAT_H__ */
36 changes: 0 additions & 36 deletions arch/ia64/include/asm/uaccess.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,42 +87,6 @@ static inline int __access_ok(const void __user *p, unsigned long size)
#define __put_user(x, ptr) __put_user_nocheck((__typeof__(*(ptr))) (x), (ptr), sizeof(*(ptr)))
#define __get_user(x, ptr) __get_user_nocheck((x), (ptr), sizeof(*(ptr)))

extern long __put_user_unaligned_unknown (void);

#define __put_user_unaligned(x, ptr) \
({ \
long __ret; \
switch (sizeof(*(ptr))) { \
case 1: __ret = __put_user((x), (ptr)); break; \
case 2: __ret = (__put_user((x), (u8 __user *)(ptr))) \
| (__put_user((x) >> 8, ((u8 __user *)(ptr) + 1))); break; \
case 4: __ret = (__put_user((x), (u16 __user *)(ptr))) \
| (__put_user((x) >> 16, ((u16 __user *)(ptr) + 1))); break; \
case 8: __ret = (__put_user((x), (u32 __user *)(ptr))) \
| (__put_user((x) >> 32, ((u32 __user *)(ptr) + 1))); break; \
default: __ret = __put_user_unaligned_unknown(); \
} \
__ret; \
})

extern long __get_user_unaligned_unknown (void);

#define __get_user_unaligned(x, ptr) \
({ \
long __ret; \
switch (sizeof(*(ptr))) { \
case 1: __ret = __get_user((x), (ptr)); break; \
case 2: __ret = (__get_user((x), (u8 __user *)(ptr))) \
| (__get_user((x) >> 8, ((u8 __user *)(ptr) + 1))); break; \
case 4: __ret = (__get_user((x), (u16 __user *)(ptr))) \
| (__get_user((x) >> 16, ((u16 __user *)(ptr) + 1))); break; \
case 8: __ret = (__get_user((x), (u32 __user *)(ptr))) \
| (__get_user((x) >> 32, ((u32 __user *)(ptr) + 1))); break; \
default: __ret = __get_user_unaligned_unknown(); \
} \
__ret; \
})

#ifdef ASM_SUPPORTED
struct __large_struct { unsigned long buf[100]; };
# define __m(x) (*(struct __large_struct __user *)(x))
Expand Down
19 changes: 8 additions & 11 deletions arch/m32r/include/asm/flat.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,6 @@
#define flat_set_persistent(relval, p) 0
#define flat_reloc_valid(reloc, size) \
(((reloc) - textlen_for_m32r_lo16_data) <= (size))
#define flat_get_addr_from_rp(rp, relval, flags, persistent) \
m32r_flat_get_addr_from_rp(rp, relval, (text_len) )

#define flat_put_addr_at_rp(rp, addr, relval) \
m32r_flat_put_addr_at_rp(rp, addr, relval)

/* Convert a relocation entry into an address. */
static inline unsigned long
Expand Down Expand Up @@ -57,9 +52,9 @@ flat_get_relocate_addr (unsigned long relval)

static unsigned long textlen_for_m32r_lo16_data = 0;

static inline unsigned long m32r_flat_get_addr_from_rp (unsigned long *rp,
unsigned long relval,
unsigned long textlen)
static inline unsigned long m32r_flat_get_addr_from_rp (u32 *rp,
u32 relval,
u32 textlen)
{
unsigned int reloc = flat_m32r_get_reloc_type (relval);
textlen_for_m32r_lo16_data = 0;
Expand Down Expand Up @@ -100,9 +95,7 @@ static inline unsigned long m32r_flat_get_addr_from_rp (unsigned long *rp,
return ~0; /* bogus value */
}

static inline void m32r_flat_put_addr_at_rp (unsigned long *rp,
unsigned long addr,
unsigned long relval)
static inline void flat_put_addr_at_rp(u32 *rp, u32 addr, u32 relval)
{
unsigned int reloc = flat_m32r_get_reloc_type (relval);
if (reloc & 0xf0) {
Expand Down Expand Up @@ -142,4 +135,8 @@ static inline void m32r_flat_put_addr_at_rp (unsigned long *rp,
}
}

// kludge - text_len is a local variable in the only user.
#define flat_get_addr_from_rp(rp, relval, flags, addr, persistent) \
(m32r_flat_get_addr_from_rp(rp, relval, text_len), 0)

#endif /* __ASM_M32R_FLAT_H */
23 changes: 20 additions & 3 deletions arch/m68k/include/asm/flat.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,29 @@
#ifndef __M68KNOMMU_FLAT_H__
#define __M68KNOMMU_FLAT_H__

#include <linux/uaccess.h>

#define flat_argvp_envp_on_stack() 1
#define flat_old_ram_flag(flags) (flags)
#define flat_reloc_valid(reloc, size) ((reloc) <= (size))
#define flat_get_addr_from_rp(rp, relval, flags, p) \
({ unsigned long __val; __get_user_unaligned(__val, rp); __val; })
#define flat_put_addr_at_rp(rp, val, relval) __put_user_unaligned(val, rp)
static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
u32 *addr, u32 *persistent)
{
#ifdef CONFIG_CPU_HAS_NO_UNALIGNED
return copy_from_user(addr, rp, 4) ? -EFAULT : 0;
#else
return get_user(*addr, rp);
#endif
}

static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
{
#ifdef CONFIG_CPU_HAS_NO_UNALIGNED
return copy_to_user(rp, &addr, 4) ? -EFAULT : 0;
#else
return put_user(addr, rp);
#endif
}
#define flat_get_relocate_addr(rel) (rel)

static inline int flat_set_persistent(unsigned long relval,
Expand Down
7 changes: 0 additions & 7 deletions arch/m68k/include/asm/uaccess.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,4 @@
#else
#include <asm/uaccess_mm.h>
#endif

#include <asm/extable.h>
#ifdef CONFIG_CPU_HAS_NO_UNALIGNED
#include <asm-generic/uaccess-unaligned.h>
#else
#define __get_user_unaligned(x, ptr) __get_user((x), (ptr))
#define __put_user_unaligned(x, ptr) __put_user((x), (ptr))
#endif
Loading

0 comments on commit 89cbec7

Please sign in to comment.