Skip to content

Commit 4b01285

Browse files
committed
Merge branch 'uaccess.csum' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull uaccess/csum updates from Al Viro: "Regularize the sitation with uaccess checksum primitives: - fold csum_partial_... into csum_and_copy_..._user() - on x86 collapse several access_ok()/stac()/clac() into user_access_begin()/user_access_end()" * 'uaccess.csum' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: default csum_and_copy_to_user(): don't bother with access_ok() take the dummy csum_and_copy_from_user() into net/checksum.h arm: switch to csum_and_copy_from_user() sh32: convert to csum_and_copy_from_user() m68k: convert to csum_and_copy_from_user() xtensa: switch to providing csum_and_copy_from_user() sparc: switch to providing csum_and_copy_from_user() parisc: turn csum_partial_copy_from_user() into csum_and_copy_from_user() alpha: turn csum_partial_copy_from_user() into csum_and_copy_from_user() ia64: turn csum_partial_copy_from_user() into csum_and_copy_from_user() ia64: csum_partial_copy_nocheck(): don't abuse csum_partial_copy_from_user() x86: switch 32bit csum_and_copy_to_user() to user_access_{begin,end}() x86: switch both 32bit and 64bit to providing csum_and_copy_from_user() x86_64: csum_..._copy_..._user(): switch to unsafe_..._user() get rid of csum_partial_copy_to_user()
2 parents b23c477 + 001c1a6 commit 4b01285

File tree

25 files changed

+88
-225
lines changed

25 files changed

+88
-225
lines changed

arch/alpha/include/asm/checksum.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ extern __wsum csum_partial(const void *buff, int len, __wsum sum);
4141
* here even more important to align src and dst on a 32-bit (or even
4242
* better 64-bit) boundary
4343
*/
44-
__wsum csum_partial_copy_from_user(const void __user *src, void *dst, int len, __wsum sum, int *errp);
44+
#define _HAVE_ARCH_COPY_AND_CSUM_FROM_USER
45+
__wsum csum_and_copy_from_user(const void __user *src, void *dst, int len, __wsum sum, int *errp);
4546

4647
__wsum csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum);
4748

arch/alpha/lib/csum_partial_copy.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ csum_partial_cfu_unaligned(const unsigned long __user * src,
325325
}
326326

327327
__wsum
328-
csum_partial_copy_from_user(const void __user *src, void *dst, int len,
328+
csum_and_copy_from_user(const void __user *src, void *dst, int len,
329329
__wsum sum, int *errp)
330330
{
331331
unsigned long checksum = (__force u32) sum;
@@ -369,15 +369,15 @@ csum_partial_copy_from_user(const void __user *src, void *dst, int len,
369369
}
370370
return (__force __wsum)checksum;
371371
}
372-
EXPORT_SYMBOL(csum_partial_copy_from_user);
372+
EXPORT_SYMBOL(csum_and_copy_from_user);
373373

374374
__wsum
375375
csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum)
376376
{
377377
__wsum checksum;
378378
mm_segment_t oldfs = get_fs();
379379
set_fs(KERNEL_DS);
380-
checksum = csum_partial_copy_from_user((__force const void __user *)src,
380+
checksum = csum_and_copy_from_user((__force const void __user *)src,
381381
dst, len, sum, NULL);
382382
set_fs(oldfs);
383383
return checksum;

arch/arm/include/asm/checksum.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,20 @@ csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum);
4040
__wsum
4141
csum_partial_copy_from_user(const void __user *src, void *dst, int len, __wsum sum, int *err_ptr);
4242

43+
#define _HAVE_ARCH_COPY_AND_CSUM_FROM_USER
44+
static inline
45+
__wsum csum_and_copy_from_user (const void __user *src, void *dst,
46+
int len, __wsum sum, int *err_ptr)
47+
{
48+
if (access_ok(src, len))
49+
return csum_partial_copy_from_user(src, dst, len, sum, err_ptr);
50+
51+
if (len)
52+
*err_ptr = -EFAULT;
53+
54+
return sum;
55+
}
56+
4357
/*
4458
* Fold a partial checksum without adding pseudo headers
4559
*/

arch/c6x/lib/checksum.c

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,6 @@
44
#include <linux/module.h>
55
#include <net/checksum.h>
66

7-
#include <asm/byteorder.h>
8-
9-
/*
10-
* copy from fs while checksumming, otherwise like csum_partial
11-
*/
12-
__wsum
13-
csum_partial_copy_from_user(const void __user *src, void *dst, int len,
14-
__wsum sum, int *csum_err)
15-
{
16-
int missing;
17-
18-
missing = __copy_from_user(dst, src, len);
19-
if (missing) {
20-
memset(dst + len - missing, 0, missing);
21-
*csum_err = -EFAULT;
22-
} else
23-
*csum_err = 0;
24-
25-
return csum_partial(dst, len, sum);
26-
}
27-
EXPORT_SYMBOL(csum_partial_copy_from_user);
28-
297
/* These are from csum_64plus.S */
308
EXPORT_SYMBOL(csum_partial);
319
EXPORT_SYMBOL(csum_partial_copy);

arch/ia64/include/asm/checksum.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,6 @@ extern __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
3737
*/
3838
extern __wsum csum_partial(const void *buff, int len, __wsum sum);
3939

40-
/*
41-
* Same as csum_partial, but copies from src while it checksums.
42-
*
43-
* Here it is even more important to align src and dst on a 32-bit (or
44-
* even better 64-bit) boundary.
45-
*/
46-
extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst,
47-
int len, __wsum sum,
48-
int *errp);
49-
5040
extern __wsum csum_partial_copy_nocheck(const void *src, void *dst,
5141
int len, __wsum sum);
5242

arch/ia64/lib/csum_partial_copy.c

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -103,39 +103,11 @@ unsigned long do_csum_c(const unsigned char * buff, int len, unsigned int psum)
103103
* This is very ugly but temporary. THIS NEEDS SERIOUS ENHANCEMENTS.
104104
* But it's very tricky to get right even in C.
105105
*/
106-
extern unsigned long do_csum(const unsigned char *, long);
107-
108-
__wsum
109-
csum_partial_copy_from_user(const void __user *src, void *dst,
110-
int len, __wsum psum, int *errp)
111-
{
112-
unsigned long result;
113-
114-
/* XXX Fixme
115-
* for now we separate the copy from checksum for obvious
116-
* alignment difficulties. Look at the Alpha code and you'll be
117-
* scared.
118-
*/
119-
120-
if (__copy_from_user(dst, src, len) != 0 && errp)
121-
*errp = -EFAULT;
122-
123-
result = do_csum(dst, len);
124-
125-
/* add in old sum, and carry.. */
126-
result += (__force u32)psum;
127-
/* 32+c bits -> 32 bits */
128-
result = (result & 0xffffffff) + (result >> 32);
129-
return (__force __wsum)result;
130-
}
131-
132-
EXPORT_SYMBOL(csum_partial_copy_from_user);
133-
134106
__wsum
135107
csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum)
136108
{
137-
return csum_partial_copy_from_user((__force const void __user *)src,
138-
dst, len, sum, NULL);
109+
memcpy(dst, src, len);
110+
return csum_partial(dst, len, sum);
139111
}
140112

141113
EXPORT_SYMBOL(csum_partial_copy_nocheck);

arch/m68k/include/asm/checksum.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ __wsum csum_partial(const void *buff, int len, __wsum sum);
3030
* better 64-bit) boundary
3131
*/
3232

33-
extern __wsum csum_partial_copy_from_user(const void __user *src,
33+
#define _HAVE_ARCH_COPY_AND_CSUM_FROM_USER
34+
extern __wsum csum_and_copy_from_user(const void __user *src,
3435
void *dst,
3536
int len, __wsum sum,
3637
int *csum_err);

arch/m68k/lib/checksum.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ EXPORT_SYMBOL(csum_partial);
129129
*/
130130

131131
__wsum
132-
csum_partial_copy_from_user(const void __user *src, void *dst,
132+
csum_and_copy_from_user(const void __user *src, void *dst,
133133
int len, __wsum sum, int *csum_err)
134134
{
135135
/*
@@ -316,7 +316,7 @@ csum_partial_copy_from_user(const void __user *src, void *dst,
316316
return(sum);
317317
}
318318

319-
EXPORT_SYMBOL(csum_partial_copy_from_user);
319+
EXPORT_SYMBOL(csum_and_copy_from_user);
320320

321321

322322
/*

arch/nios2/include/asm/checksum.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
extern __wsum csum_partial(const void *buff, int len, __wsum sum);
1515
extern __wsum csum_partial_copy(const void *src, void *dst, int len,
1616
__wsum sum);
17-
extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst,
18-
int len, __wsum sum, int *csum_err);
1917
#define csum_partial_copy_nocheck(src, dst, len, sum) \
2018
csum_partial_copy((src), (dst), (len), (sum))
2119

arch/parisc/include/asm/checksum.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,6 @@ extern __wsum csum_partial(const void *, int, __wsum);
2626
*/
2727
extern __wsum csum_partial_copy_nocheck(const void *, void *, int, __wsum);
2828

29-
/*
30-
* this is a new version of the above that records errors it finds in *errp,
31-
* but continues and zeros the rest of the buffer.
32-
*/
33-
extern __wsum csum_partial_copy_from_user(const void __user *src,
34-
void *dst, int len, __wsum sum, int *errp);
35-
3629
/*
3730
* Optimized for IP headers, which always checksum on 4 octet boundaries.
3831
*

0 commit comments

Comments
 (0)