| .. | .. |
|---|
| 34 | 34 | */ |
|---|
| 35 | 35 | __wsum csum_partial(const void *buff, int len, __wsum sum); |
|---|
| 36 | 36 | |
|---|
| 37 | | -__wsum __csum_partial_copy_kernel(const void *src, void *dst, |
|---|
| 38 | | - int len, __wsum sum, int *err_ptr); |
|---|
| 39 | | - |
|---|
| 40 | | -__wsum __csum_partial_copy_from_user(const void *src, void *dst, |
|---|
| 41 | | - int len, __wsum sum, int *err_ptr); |
|---|
| 42 | | -__wsum __csum_partial_copy_to_user(const void *src, void *dst, |
|---|
| 43 | | - int len, __wsum sum, int *err_ptr); |
|---|
| 44 | | -/* |
|---|
| 45 | | - * this is a new version of the above that records errors it finds in *errp, |
|---|
| 46 | | - * but continues and zeros the rest of the buffer. |
|---|
| 47 | | - */ |
|---|
| 48 | | -static inline |
|---|
| 49 | | -__wsum csum_partial_copy_from_user(const void __user *src, void *dst, int len, |
|---|
| 50 | | - __wsum sum, int *err_ptr) |
|---|
| 51 | | -{ |
|---|
| 52 | | - might_fault(); |
|---|
| 53 | | - if (uaccess_kernel()) |
|---|
| 54 | | - return __csum_partial_copy_kernel((__force void *)src, dst, |
|---|
| 55 | | - len, sum, err_ptr); |
|---|
| 56 | | - else |
|---|
| 57 | | - return __csum_partial_copy_from_user((__force void *)src, dst, |
|---|
| 58 | | - len, sum, err_ptr); |
|---|
| 59 | | -} |
|---|
| 37 | +__wsum __csum_partial_copy_from_user(const void __user *src, void *dst, int len); |
|---|
| 38 | +__wsum __csum_partial_copy_to_user(const void *src, void __user *dst, int len); |
|---|
| 60 | 39 | |
|---|
| 61 | 40 | #define _HAVE_ARCH_COPY_AND_CSUM_FROM_USER |
|---|
| 62 | 41 | static inline |
|---|
| 63 | | -__wsum csum_and_copy_from_user(const void __user *src, void *dst, |
|---|
| 64 | | - int len, __wsum sum, int *err_ptr) |
|---|
| 42 | +__wsum csum_and_copy_from_user(const void __user *src, void *dst, int len) |
|---|
| 65 | 43 | { |
|---|
| 66 | | - if (access_ok(VERIFY_READ, src, len)) |
|---|
| 67 | | - return csum_partial_copy_from_user(src, dst, len, sum, |
|---|
| 68 | | - err_ptr); |
|---|
| 69 | | - if (len) |
|---|
| 70 | | - *err_ptr = -EFAULT; |
|---|
| 71 | | - |
|---|
| 72 | | - return sum; |
|---|
| 44 | + might_fault(); |
|---|
| 45 | + if (!access_ok(src, len)) |
|---|
| 46 | + return 0; |
|---|
| 47 | + return __csum_partial_copy_from_user(src, dst, len); |
|---|
| 73 | 48 | } |
|---|
| 74 | 49 | |
|---|
| 75 | 50 | /* |
|---|
| .. | .. |
|---|
| 77 | 52 | */ |
|---|
| 78 | 53 | #define HAVE_CSUM_COPY_USER |
|---|
| 79 | 54 | static inline |
|---|
| 80 | | -__wsum csum_and_copy_to_user(const void *src, void __user *dst, int len, |
|---|
| 81 | | - __wsum sum, int *err_ptr) |
|---|
| 55 | +__wsum csum_and_copy_to_user(const void *src, void __user *dst, int len) |
|---|
| 82 | 56 | { |
|---|
| 83 | 57 | might_fault(); |
|---|
| 84 | | - if (access_ok(VERIFY_WRITE, dst, len)) { |
|---|
| 85 | | - if (uaccess_kernel()) |
|---|
| 86 | | - return __csum_partial_copy_kernel(src, |
|---|
| 87 | | - (__force void *)dst, |
|---|
| 88 | | - len, sum, err_ptr); |
|---|
| 89 | | - else |
|---|
| 90 | | - return __csum_partial_copy_to_user(src, |
|---|
| 91 | | - (__force void *)dst, |
|---|
| 92 | | - len, sum, err_ptr); |
|---|
| 93 | | - } |
|---|
| 94 | | - if (len) |
|---|
| 95 | | - *err_ptr = -EFAULT; |
|---|
| 96 | | - |
|---|
| 97 | | - return (__force __wsum)-1; /* invalid checksum */ |
|---|
| 58 | + if (!access_ok(dst, len)) |
|---|
| 59 | + return 0; |
|---|
| 60 | + return __csum_partial_copy_to_user(src, dst, len); |
|---|
| 98 | 61 | } |
|---|
| 99 | 62 | |
|---|
| 100 | 63 | /* |
|---|
| 101 | 64 | * the same as csum_partial, but copies from user space (but on MIPS |
|---|
| 102 | 65 | * we have just one address space, so this is identical to the above) |
|---|
| 103 | 66 | */ |
|---|
| 104 | | -__wsum csum_partial_copy_nocheck(const void *src, void *dst, |
|---|
| 105 | | - int len, __wsum sum); |
|---|
| 106 | | -#define csum_partial_copy_nocheck csum_partial_copy_nocheck |
|---|
| 67 | +#define _HAVE_ARCH_CSUM_AND_COPY |
|---|
| 68 | +__wsum __csum_partial_copy_nocheck(const void *src, void *dst, int len); |
|---|
| 69 | +static inline __wsum csum_partial_copy_nocheck(const void *src, void *dst, int len) |
|---|
| 70 | +{ |
|---|
| 71 | + return __csum_partial_copy_nocheck(src, dst, len); |
|---|
| 72 | +} |
|---|
| 107 | 73 | |
|---|
| 108 | 74 | /* |
|---|
| 109 | 75 | * Fold a partial checksum without adding pseudo headers |
|---|
| .. | .. |
|---|
| 113 | 79 | u32 sum = (__force u32)csum; |
|---|
| 114 | 80 | |
|---|
| 115 | 81 | sum += (sum << 16); |
|---|
| 116 | | - csum = (sum < csum); |
|---|
| 82 | + csum = (__force __wsum)(sum < (__force u32)csum); |
|---|
| 117 | 83 | sum >>= 16; |
|---|
| 118 | | - sum += csum; |
|---|
| 84 | + sum += (__force u32)csum; |
|---|
| 119 | 85 | |
|---|
| 120 | 86 | return (__force __sum16)~sum; |
|---|
| 121 | 87 | } |
|---|