diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/can/raw.c | 3 | ||||
| -rw-r--r-- | net/core/ethtool.c | 5 | ||||
| -rw-r--r-- | net/dccp/probe.c | 2 | ||||
| -rw-r--r-- | net/ipv4/tcp_probe.c | 9 | ||||
| -rw-r--r-- | net/ipv6/Kconfig | 2 | ||||
| -rw-r--r-- | net/ipv6/raw.c | 18 | ||||
| -rw-r--r-- | net/key/af_key.c | 5 | ||||
| -rw-r--r-- | net/tipc/socket.c | 4 |
8 files changed, 35 insertions, 13 deletions
diff --git a/net/can/raw.c b/net/can/raw.c index ead50c7c0d40..201cbfc6b9ec 100644 --- a/net/can/raw.c +++ b/net/can/raw.c | |||
| @@ -573,7 +573,8 @@ static int raw_getsockopt(struct socket *sock, int level, int optname, | |||
| 573 | int fsize = ro->count * sizeof(struct can_filter); | 573 | int fsize = ro->count * sizeof(struct can_filter); |
| 574 | if (len > fsize) | 574 | if (len > fsize) |
| 575 | len = fsize; | 575 | len = fsize; |
| 576 | err = copy_to_user(optval, ro->filter, len); | 576 | if (copy_to_user(optval, ro->filter, len)) |
| 577 | err = -EFAULT; | ||
| 577 | } else | 578 | } else |
| 578 | len = 0; | 579 | len = 0; |
| 579 | release_sock(sk); | 580 | release_sock(sk); |
diff --git a/net/core/ethtool.c b/net/core/ethtool.c index a29b43d0b450..0133b5ebd545 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c | |||
| @@ -323,6 +323,11 @@ static int ethtool_get_eeprom(struct net_device *dev, void __user *useraddr) | |||
| 323 | bytes_remaining -= eeprom.len; | 323 | bytes_remaining -= eeprom.len; |
| 324 | } | 324 | } |
| 325 | 325 | ||
| 326 | eeprom.len = userbuf - (useraddr + sizeof(eeprom)); | ||
| 327 | eeprom.offset -= eeprom.len; | ||
| 328 | if (copy_to_user(useraddr, &eeprom, sizeof(eeprom))) | ||
| 329 | ret = -EFAULT; | ||
| 330 | |||
| 326 | kfree(data); | 331 | kfree(data); |
| 327 | return ret; | 332 | return ret; |
| 328 | } | 333 | } |
diff --git a/net/dccp/probe.c b/net/dccp/probe.c index 6e1df62bd7c9..0bcdc9250279 100644 --- a/net/dccp/probe.c +++ b/net/dccp/probe.c | |||
| @@ -140,7 +140,7 @@ static ssize_t dccpprobe_read(struct file *file, char __user *buf, | |||
| 140 | goto out_free; | 140 | goto out_free; |
| 141 | 141 | ||
| 142 | cnt = kfifo_get(dccpw.fifo, tbuf, len); | 142 | cnt = kfifo_get(dccpw.fifo, tbuf, len); |
| 143 | error = copy_to_user(buf, tbuf, cnt); | 143 | error = copy_to_user(buf, tbuf, cnt) ? -EFAULT : 0; |
| 144 | 144 | ||
| 145 | out_free: | 145 | out_free: |
| 146 | vfree(tbuf); | 146 | vfree(tbuf); |
diff --git a/net/ipv4/tcp_probe.c b/net/ipv4/tcp_probe.c index 1c509592574a..5ff0ce6e9d39 100644 --- a/net/ipv4/tcp_probe.c +++ b/net/ipv4/tcp_probe.c | |||
| @@ -190,19 +190,18 @@ static ssize_t tcpprobe_read(struct file *file, char __user *buf, | |||
| 190 | 190 | ||
| 191 | width = tcpprobe_sprint(tbuf, sizeof(tbuf)); | 191 | width = tcpprobe_sprint(tbuf, sizeof(tbuf)); |
| 192 | 192 | ||
| 193 | if (width < len) | 193 | if (cnt + width < len) |
| 194 | tcp_probe.tail = (tcp_probe.tail + 1) % bufsize; | 194 | tcp_probe.tail = (tcp_probe.tail + 1) % bufsize; |
| 195 | 195 | ||
| 196 | spin_unlock_bh(&tcp_probe.lock); | 196 | spin_unlock_bh(&tcp_probe.lock); |
| 197 | 197 | ||
| 198 | /* if record greater than space available | 198 | /* if record greater than space available |
| 199 | return partial buffer (so far) */ | 199 | return partial buffer (so far) */ |
| 200 | if (width >= len) | 200 | if (cnt + width >= len) |
| 201 | break; | 201 | break; |
| 202 | 202 | ||
| 203 | error = copy_to_user(buf + cnt, tbuf, width); | 203 | if (copy_to_user(buf + cnt, tbuf, width)) |
| 204 | if (error) | 204 | return -EFAULT; |
| 205 | break; | ||
| 206 | cnt += width; | 205 | cnt += width; |
| 207 | } | 206 | } |
| 208 | 207 | ||
diff --git a/net/ipv6/Kconfig b/net/ipv6/Kconfig index 42814a2ec9d7..b2c9becc02e8 100644 --- a/net/ipv6/Kconfig +++ b/net/ipv6/Kconfig | |||
| @@ -167,7 +167,7 @@ config IPV6_SIT | |||
| 167 | Tunneling means encapsulating data of one protocol type within | 167 | Tunneling means encapsulating data of one protocol type within |
| 168 | another protocol and sending it over a channel that understands the | 168 | another protocol and sending it over a channel that understands the |
| 169 | encapsulating protocol. This driver implements encapsulation of IPv6 | 169 | encapsulating protocol. This driver implements encapsulation of IPv6 |
| 170 | into IPv4 packets. This is useful if you want to connect two IPv6 | 170 | into IPv4 packets. This is useful if you want to connect to IPv6 |
| 171 | networks over an IPv4-only path. | 171 | networks over an IPv4-only path. |
| 172 | 172 | ||
| 173 | Saying M here will produce a module called sit.ko. If unsure, say Y. | 173 | Saying M here will produce a module called sit.ko. If unsure, say Y. |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 6193b124cbc7..396f0ea11090 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
| @@ -971,6 +971,19 @@ static int do_rawv6_setsockopt(struct sock *sk, int level, int optname, | |||
| 971 | 971 | ||
| 972 | switch (optname) { | 972 | switch (optname) { |
| 973 | case IPV6_CHECKSUM: | 973 | case IPV6_CHECKSUM: |
| 974 | if (inet_sk(sk)->num == IPPROTO_ICMPV6 && | ||
| 975 | level == IPPROTO_IPV6) { | ||
| 976 | /* | ||
| 977 | * RFC3542 tells that IPV6_CHECKSUM socket | ||
| 978 | * option in the IPPROTO_IPV6 level is not | ||
| 979 | * allowed on ICMPv6 sockets. | ||
| 980 | * If you want to set it, use IPPROTO_RAW | ||
| 981 | * level IPV6_CHECKSUM socket option | ||
| 982 | * (Linux extension). | ||
| 983 | */ | ||
| 984 | return -EINVAL; | ||
| 985 | } | ||
| 986 | |||
| 974 | /* You may get strange result with a positive odd offset; | 987 | /* You may get strange result with a positive odd offset; |
| 975 | RFC2292bis agrees with me. */ | 988 | RFC2292bis agrees with me. */ |
| 976 | if (val > 0 && (val&1)) | 989 | if (val > 0 && (val&1)) |
| @@ -1046,6 +1059,11 @@ static int do_rawv6_getsockopt(struct sock *sk, int level, int optname, | |||
| 1046 | 1059 | ||
| 1047 | switch (optname) { | 1060 | switch (optname) { |
| 1048 | case IPV6_CHECKSUM: | 1061 | case IPV6_CHECKSUM: |
| 1062 | /* | ||
| 1063 | * We allow getsockopt() for IPPROTO_IPV6-level | ||
| 1064 | * IPV6_CHECKSUM socket option on ICMPv6 sockets | ||
| 1065 | * since RFC3542 is silent about it. | ||
| 1066 | */ | ||
| 1049 | if (rp->checksum == 0) | 1067 | if (rp->checksum == 0) |
| 1050 | val = -1; | 1068 | val = -1; |
| 1051 | else | 1069 | else |
diff --git a/net/key/af_key.c b/net/key/af_key.c index 81a8e5297ad1..2403a31fe0f6 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
| @@ -2356,7 +2356,7 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, struct sadb_msg | |||
| 2356 | struct xfrm_selector sel; | 2356 | struct xfrm_selector sel; |
| 2357 | struct km_event c; | 2357 | struct km_event c; |
| 2358 | struct sadb_x_sec_ctx *sec_ctx; | 2358 | struct sadb_x_sec_ctx *sec_ctx; |
| 2359 | struct xfrm_sec_ctx *pol_ctx; | 2359 | struct xfrm_sec_ctx *pol_ctx = NULL; |
| 2360 | 2360 | ||
| 2361 | if (!present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1], | 2361 | if (!present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1], |
| 2362 | ext_hdrs[SADB_EXT_ADDRESS_DST-1]) || | 2362 | ext_hdrs[SADB_EXT_ADDRESS_DST-1]) || |
| @@ -2396,8 +2396,7 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, struct sadb_msg | |||
| 2396 | kfree(uctx); | 2396 | kfree(uctx); |
| 2397 | if (err) | 2397 | if (err) |
| 2398 | return err; | 2398 | return err; |
| 2399 | } else | 2399 | } |
| 2400 | pol_ctx = NULL; | ||
| 2401 | 2400 | ||
| 2402 | xp = xfrm_policy_bysel_ctx(XFRM_POLICY_TYPE_MAIN, | 2401 | xp = xfrm_policy_bysel_ctx(XFRM_POLICY_TYPE_MAIN, |
| 2403 | pol->sadb_x_policy_dir - 1, &sel, pol_ctx, | 2402 | pol->sadb_x_policy_dir - 1, &sel, pol_ctx, |
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 05853159536a..230f9ca2ad6b 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
| @@ -1756,8 +1756,8 @@ static int getsockopt(struct socket *sock, | |||
| 1756 | else if (len < sizeof(value)) { | 1756 | else if (len < sizeof(value)) { |
| 1757 | res = -EINVAL; | 1757 | res = -EINVAL; |
| 1758 | } | 1758 | } |
| 1759 | else if ((res = copy_to_user(ov, &value, sizeof(value)))) { | 1759 | else if (copy_to_user(ov, &value, sizeof(value))) { |
| 1760 | /* couldn't return value */ | 1760 | res = -EFAULT; |
| 1761 | } | 1761 | } |
| 1762 | else { | 1762 | else { |
| 1763 | res = put_user(sizeof(value), ol); | 1763 | res = put_user(sizeof(value), ol); |
