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); |