Skip to content

Commit 89cbec7

Browse files
committed
Merge branch 'work.uaccess-unaligned' of git://git.kernel.org/pub/scm/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
2 parents 2173bd0 + 3170d8d commit 89cbec7

File tree

24 files changed

+168
-450
lines changed

24 files changed

+168
-450
lines changed

arch/arm/include/asm/flat.h

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,31 @@
55
#ifndef __ARM_FLAT_H__
66
#define __ARM_FLAT_H__
77

8+
#include <linux/uaccess.h>
9+
810
#define flat_argvp_envp_on_stack() 1
911
#define flat_old_ram_flag(flags) (flags)
1012
#define flat_reloc_valid(reloc, size) ((reloc) <= (size))
11-
#define flat_get_addr_from_rp(rp, relval, flags, persistent) \
12-
({ unsigned long __val; __get_user_unaligned(__val, rp); __val; })
13-
#define flat_put_addr_at_rp(rp, val, relval) __put_user_unaligned(val, rp)
13+
14+
static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
15+
u32 *addr, u32 *persistent)
16+
{
17+
#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
18+
return copy_from_user(addr, rp, 4) ? -EFAULT : 0;
19+
#else
20+
return get_user(*addr, rp);
21+
#endif
22+
}
23+
24+
static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
25+
{
26+
#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
27+
return copy_to_user(rp, &addr, 4) ? -EFAULT : 0;
28+
#else
29+
return put_user(addr, rp);
30+
#endif
31+
}
32+
1433
#define flat_get_relocate_addr(rel) (rel)
1534
#define flat_set_persistent(relval, p) 0
1635

arch/arm/include/asm/uaccess.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,6 @@
1717
#include <asm/unified.h>
1818
#include <asm/compiler.h>
1919

20-
#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
21-
#include <asm-generic/uaccess-unaligned.h>
22-
#else
23-
#define __get_user_unaligned __get_user
24-
#define __put_user_unaligned __put_user
25-
#endif
26-
2720
#include <asm/extable.h>
2821

2922
/*

arch/arm64/include/asm/uaccess.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,6 @@ do { \
254254
(void)0; \
255255
})
256256

257-
#define __get_user_unaligned __get_user
258-
259257
#define get_user(x, ptr) \
260258
({ \
261259
__typeof__(*(ptr)) __user *__p = (ptr); \
@@ -320,8 +318,6 @@ do { \
320318
(void)0; \
321319
})
322320

323-
#define __put_user_unaligned __put_user
324-
325321
#define put_user(x, ptr) \
326322
({ \
327323
__typeof__(*(ptr)) __user *__p = (ptr); \

arch/blackfin/include/asm/flat.h

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,28 @@
1414
#define flat_argvp_envp_on_stack() 0
1515
#define flat_old_ram_flag(flags) (flags)
1616

17-
extern unsigned long bfin_get_addr_from_rp (unsigned long *ptr,
18-
unsigned long relval,
19-
unsigned long flags,
20-
unsigned long *persistent);
17+
extern unsigned long bfin_get_addr_from_rp (u32 *ptr, u32 relval,
18+
u32 flags, u32 *persistent);
2119

22-
extern void bfin_put_addr_at_rp(unsigned long *ptr, unsigned long addr,
23-
unsigned long relval);
20+
extern void bfin_put_addr_at_rp(u32 *ptr, u32 addr, u32 relval);
2421

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

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

30-
#define flat_get_addr_from_rp(rp, relval, flags, persistent) \
31-
bfin_get_addr_from_rp(rp, relval, flags, persistent)
32-
#define flat_put_addr_at_rp(rp, val, relval) \
33-
bfin_put_addr_at_rp(rp, val, relval)
27+
static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
28+
u32 *addr, u32 *persistent)
29+
{
30+
*addr = bfin_get_addr_from_rp(rp, relval, flags, persistent);
31+
return 0;
32+
}
33+
34+
static inline int flat_put_addr_at_rp(u32 __user *rp, u32 val, u32 relval)
35+
{
36+
bfin_put_addr_at_rp(rp, val, relval);
37+
return 0;
38+
}
3439

3540
/* Convert a relocation entry into an address. */
3641
static inline unsigned long

arch/blackfin/kernel/flat.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@
1313
#define FLAT_BFIN_RELOC_TYPE_16H_BIT 1
1414
#define FLAT_BFIN_RELOC_TYPE_32_BIT 2
1515

16-
unsigned long bfin_get_addr_from_rp(unsigned long *ptr,
17-
unsigned long relval,
18-
unsigned long flags,
19-
unsigned long *persistent)
16+
unsigned long bfin_get_addr_from_rp(u32 *ptr,
17+
u32 relval,
18+
u32 flags,
19+
u32 *persistent)
2020
{
2121
unsigned short *usptr = (unsigned short *)ptr;
2222
int type = (relval >> 26) & 7;
23-
unsigned long val;
23+
u32 val;
2424

2525
switch (type) {
2626
case FLAT_BFIN_RELOC_TYPE_16_BIT:
@@ -59,8 +59,7 @@ EXPORT_SYMBOL(bfin_get_addr_from_rp);
5959
* Insert the address ADDR into the symbol reference at RP;
6060
* RELVAL is the raw relocation-table entry from which RP is derived
6161
*/
62-
void bfin_put_addr_at_rp(unsigned long *ptr, unsigned long addr,
63-
unsigned long relval)
62+
void bfin_put_addr_at_rp(u32 *ptr, u32 addr, u32 relval)
6463
{
6564
unsigned short *usptr = (unsigned short *)ptr;
6665
int type = (relval >> 26) & 7;

arch/c6x/include/asm/flat.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,22 @@
11
#ifndef __ASM_C6X_FLAT_H
22
#define __ASM_C6X_FLAT_H
33

4+
#include <asm/unaligned.h>
5+
46
#define flat_argvp_envp_on_stack() 0
57
#define flat_old_ram_flag(flags) (flags)
68
#define flat_reloc_valid(reloc, size) ((reloc) <= (size))
7-
#define flat_get_addr_from_rp(rp, relval, flags, p) get_unaligned(rp)
8-
#define flat_put_addr_at_rp(rp, val, relval) put_unaligned(val, rp)
9+
static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
10+
u32 *addr, u32 *persistent)
11+
{
12+
*addr = get_unaligned((__force u32 *)rp);
13+
return 0;
14+
}
15+
static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
16+
{
17+
put_unaligned(addr, (__force u32 *)rp);
18+
return 0;
19+
}
920
#define flat_get_relocate_addr(rel) (rel)
1021
#define flat_set_persistent(relval, p) 0
1122

arch/h8300/include/asm/flat.h

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
#ifndef __H8300_FLAT_H__
66
#define __H8300_FLAT_H__
77

8+
#include <asm/unaligned.h>
9+
810
#define flat_argvp_envp_on_stack() 1
911
#define flat_old_ram_flag(flags) 1
1012
#define flat_reloc_valid(reloc, size) ((reloc) <= (size))
@@ -18,11 +20,21 @@
1820
*/
1921

2022
#define flat_get_relocate_addr(rel) (rel & ~0x00000001)
21-
#define flat_get_addr_from_rp(rp, relval, flags, persistent) \
22-
({(void)persistent; \
23-
get_unaligned(rp) & (((flags) & FLAT_FLAG_GOTPIC) ? \
24-
0xffffffff : 0x00ffffff); })
25-
#define flat_put_addr_at_rp(rp, addr, rel) \
26-
put_unaligned(((*(char *)(rp)) << 24) | ((addr) & 0x00ffffff), (rp))
23+
static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
24+
u32 *addr, u32 *persistent)
25+
{
26+
u32 val = get_unaligned((__force u32 *)rp);
27+
if (!(flags & FLAT_FLAG_GOTPIC)
28+
val &= 0x00ffffff;
29+
*addr = val;
30+
return 0;
31+
}
32+
33+
static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
34+
{
35+
u32 *p = (__force u32 *)rp;
36+
put_unaligned((addr & 0x00ffffff) | (*(char *)p << 24), p);
37+
return 0;
38+
}
2739

2840
#endif /* __H8300_FLAT_H__ */

arch/ia64/include/asm/uaccess.h

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -87,42 +87,6 @@ static inline int __access_ok(const void __user *p, unsigned long size)
8787
#define __put_user(x, ptr) __put_user_nocheck((__typeof__(*(ptr))) (x), (ptr), sizeof(*(ptr)))
8888
#define __get_user(x, ptr) __get_user_nocheck((x), (ptr), sizeof(*(ptr)))
8989

90-
extern long __put_user_unaligned_unknown (void);
91-
92-
#define __put_user_unaligned(x, ptr) \
93-
({ \
94-
long __ret; \
95-
switch (sizeof(*(ptr))) { \
96-
case 1: __ret = __put_user((x), (ptr)); break; \
97-
case 2: __ret = (__put_user((x), (u8 __user *)(ptr))) \
98-
| (__put_user((x) >> 8, ((u8 __user *)(ptr) + 1))); break; \
99-
case 4: __ret = (__put_user((x), (u16 __user *)(ptr))) \
100-
| (__put_user((x) >> 16, ((u16 __user *)(ptr) + 1))); break; \
101-
case 8: __ret = (__put_user((x), (u32 __user *)(ptr))) \
102-
| (__put_user((x) >> 32, ((u32 __user *)(ptr) + 1))); break; \
103-
default: __ret = __put_user_unaligned_unknown(); \
104-
} \
105-
__ret; \
106-
})
107-
108-
extern long __get_user_unaligned_unknown (void);
109-
110-
#define __get_user_unaligned(x, ptr) \
111-
({ \
112-
long __ret; \
113-
switch (sizeof(*(ptr))) { \
114-
case 1: __ret = __get_user((x), (ptr)); break; \
115-
case 2: __ret = (__get_user((x), (u8 __user *)(ptr))) \
116-
| (__get_user((x) >> 8, ((u8 __user *)(ptr) + 1))); break; \
117-
case 4: __ret = (__get_user((x), (u16 __user *)(ptr))) \
118-
| (__get_user((x) >> 16, ((u16 __user *)(ptr) + 1))); break; \
119-
case 8: __ret = (__get_user((x), (u32 __user *)(ptr))) \
120-
| (__get_user((x) >> 32, ((u32 __user *)(ptr) + 1))); break; \
121-
default: __ret = __get_user_unaligned_unknown(); \
122-
} \
123-
__ret; \
124-
})
125-
12690
#ifdef ASM_SUPPORTED
12791
struct __large_struct { unsigned long buf[100]; };
12892
# define __m(x) (*(struct __large_struct __user *)(x))

arch/m32r/include/asm/flat.h

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,6 @@
1717
#define flat_set_persistent(relval, p) 0
1818
#define flat_reloc_valid(reloc, size) \
1919
(((reloc) - textlen_for_m32r_lo16_data) <= (size))
20-
#define flat_get_addr_from_rp(rp, relval, flags, persistent) \
21-
m32r_flat_get_addr_from_rp(rp, relval, (text_len) )
22-
23-
#define flat_put_addr_at_rp(rp, addr, relval) \
24-
m32r_flat_put_addr_at_rp(rp, addr, relval)
2520

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

5853
static unsigned long textlen_for_m32r_lo16_data = 0;
5954

60-
static inline unsigned long m32r_flat_get_addr_from_rp (unsigned long *rp,
61-
unsigned long relval,
62-
unsigned long textlen)
55+
static inline unsigned long m32r_flat_get_addr_from_rp (u32 *rp,
56+
u32 relval,
57+
u32 textlen)
6358
{
6459
unsigned int reloc = flat_m32r_get_reloc_type (relval);
6560
textlen_for_m32r_lo16_data = 0;
@@ -100,9 +95,7 @@ static inline unsigned long m32r_flat_get_addr_from_rp (unsigned long *rp,
10095
return ~0; /* bogus value */
10196
}
10297

103-
static inline void m32r_flat_put_addr_at_rp (unsigned long *rp,
104-
unsigned long addr,
105-
unsigned long relval)
98+
static inline void flat_put_addr_at_rp(u32 *rp, u32 addr, u32 relval)
10699
{
107100
unsigned int reloc = flat_m32r_get_reloc_type (relval);
108101
if (reloc & 0xf0) {
@@ -142,4 +135,8 @@ static inline void m32r_flat_put_addr_at_rp (unsigned long *rp,
142135
}
143136
}
144137

138+
// kludge - text_len is a local variable in the only user.
139+
#define flat_get_addr_from_rp(rp, relval, flags, addr, persistent) \
140+
(m32r_flat_get_addr_from_rp(rp, relval, text_len), 0)
141+
145142
#endif /* __ASM_M32R_FLAT_H */

arch/m68k/include/asm/flat.h

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,29 @@
55
#ifndef __M68KNOMMU_FLAT_H__
66
#define __M68KNOMMU_FLAT_H__
77

8+
#include <linux/uaccess.h>
9+
810
#define flat_argvp_envp_on_stack() 1
911
#define flat_old_ram_flag(flags) (flags)
1012
#define flat_reloc_valid(reloc, size) ((reloc) <= (size))
11-
#define flat_get_addr_from_rp(rp, relval, flags, p) \
12-
({ unsigned long __val; __get_user_unaligned(__val, rp); __val; })
13-
#define flat_put_addr_at_rp(rp, val, relval) __put_user_unaligned(val, rp)
13+
static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
14+
u32 *addr, u32 *persistent)
15+
{
16+
#ifdef CONFIG_CPU_HAS_NO_UNALIGNED
17+
return copy_from_user(addr, rp, 4) ? -EFAULT : 0;
18+
#else
19+
return get_user(*addr, rp);
20+
#endif
21+
}
22+
23+
static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
24+
{
25+
#ifdef CONFIG_CPU_HAS_NO_UNALIGNED
26+
return copy_to_user(rp, &addr, 4) ? -EFAULT : 0;
27+
#else
28+
return put_user(addr, rp);
29+
#endif
30+
}
1431
#define flat_get_relocate_addr(rel) (rel)
1532

1633
static inline int flat_set_persistent(unsigned long relval,

arch/m68k/include/asm/uaccess.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,4 @@
33
#else
44
#include <asm/uaccess_mm.h>
55
#endif
6-
76
#include <asm/extable.h>
8-
#ifdef CONFIG_CPU_HAS_NO_UNALIGNED
9-
#include <asm-generic/uaccess-unaligned.h>
10-
#else
11-
#define __get_user_unaligned(x, ptr) __get_user((x), (ptr))
12-
#define __put_user_unaligned(x, ptr) __put_user((x), (ptr))
13-
#endif

0 commit comments

Comments
 (0)