diff options
Diffstat (limited to 'include/asm-mips')
-rw-r--r-- | include/asm-mips/checksum.h | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/include/asm-mips/checksum.h b/include/asm-mips/checksum.h index 9b768c3b96b3..24cdcc6eaab8 100644 --- a/include/asm-mips/checksum.h +++ b/include/asm-mips/checksum.h | |||
@@ -29,31 +29,38 @@ | |||
29 | */ | 29 | */ |
30 | __wsum csum_partial(const void *buff, int len, __wsum sum); | 30 | __wsum csum_partial(const void *buff, int len, __wsum sum); |
31 | 31 | ||
32 | __wsum __csum_partial_copy_user(const void *src, void *dst, | ||
33 | int len, __wsum sum, int *err_ptr); | ||
34 | |||
32 | /* | 35 | /* |
33 | * this is a new version of the above that records errors it finds in *errp, | 36 | * this is a new version of the above that records errors it finds in *errp, |
34 | * but continues and zeros the rest of the buffer. | 37 | * but continues and zeros the rest of the buffer. |
35 | */ | 38 | */ |
36 | __wsum csum_partial_copy_from_user(const void __user *src, | 39 | static inline |
37 | void *dst, int len, | 40 | __wsum csum_partial_copy_from_user(const void __user *src, void *dst, int len, |
38 | __wsum sum, int *errp); | 41 | __wsum sum, int *err_ptr) |
42 | { | ||
43 | might_sleep(); | ||
44 | return __csum_partial_copy_user((__force void *)src, dst, | ||
45 | len, sum, err_ptr); | ||
46 | } | ||
39 | 47 | ||
40 | /* | 48 | /* |
41 | * Copy and checksum to user | 49 | * Copy and checksum to user |
42 | */ | 50 | */ |
43 | #define HAVE_CSUM_COPY_USER | 51 | #define HAVE_CSUM_COPY_USER |
44 | static inline __wsum csum_and_copy_to_user (const void *src, void __user *dst, | 52 | static inline |
45 | int len, __wsum sum, | 53 | __wsum csum_and_copy_to_user(const void *src, void __user *dst, int len, |
46 | int *err_ptr) | 54 | __wsum sum, int *err_ptr) |
47 | { | 55 | { |
48 | might_sleep(); | 56 | might_sleep(); |
49 | sum = csum_partial(src, len, sum); | 57 | if (access_ok(VERIFY_WRITE, dst, len)) |
50 | 58 | return __csum_partial_copy_user(src, (__force void *)dst, | |
51 | if (copy_to_user(dst, src, len)) { | 59 | len, sum, err_ptr); |
60 | if (len) | ||
52 | *err_ptr = -EFAULT; | 61 | *err_ptr = -EFAULT; |
53 | return (__force __wsum)-1; | ||
54 | } | ||
55 | 62 | ||
56 | return sum; | 63 | return (__force __wsum)-1; /* invalid checksum */ |
57 | } | 64 | } |
58 | 65 | ||
59 | /* | 66 | /* |