diff options
Diffstat (limited to 'net/ipv4')
| -rw-r--r-- | net/ipv4/devinet.c | 3 | ||||
| -rw-r--r-- | net/ipv4/esp4.c | 5 | ||||
| -rw-r--r-- | net/ipv4/ipconfig.c | 20 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ip_tables.c | 57 | ||||
| -rw-r--r-- | net/ipv4/tcp_input.c | 2 |
5 files changed, 20 insertions, 67 deletions
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 55d199e4ae..3168c3de49 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
| @@ -516,8 +516,6 @@ static struct in_ifaddr *rtm_to_ifaddr(struct nlmsghdr *nlh) | |||
| 516 | goto errout; | 516 | goto errout; |
| 517 | } | 517 | } |
| 518 | 518 | ||
| 519 | ipv4_devconf_setall(in_dev); | ||
| 520 | |||
| 521 | ifa = inet_alloc_ifa(); | 519 | ifa = inet_alloc_ifa(); |
| 522 | if (ifa == NULL) { | 520 | if (ifa == NULL) { |
| 523 | /* | 521 | /* |
| @@ -528,6 +526,7 @@ static struct in_ifaddr *rtm_to_ifaddr(struct nlmsghdr *nlh) | |||
| 528 | goto errout; | 526 | goto errout; |
| 529 | } | 527 | } |
| 530 | 528 | ||
| 529 | ipv4_devconf_setall(in_dev); | ||
| 531 | in_dev_hold(in_dev); | 530 | in_dev_hold(in_dev); |
| 532 | 531 | ||
| 533 | if (tb[IFA_ADDRESS] == NULL) | 532 | if (tb[IFA_ADDRESS] == NULL) |
diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c index c31bccb9b5..1738113268 100644 --- a/net/ipv4/esp4.c +++ b/net/ipv4/esp4.c | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include <linux/pfkeyv2.h> | 9 | #include <linux/pfkeyv2.h> |
| 10 | #include <linux/random.h> | 10 | #include <linux/random.h> |
| 11 | #include <linux/spinlock.h> | 11 | #include <linux/spinlock.h> |
| 12 | #include <linux/in6.h> | ||
| 12 | #include <net/icmp.h> | 13 | #include <net/icmp.h> |
| 13 | #include <net/protocol.h> | 14 | #include <net/protocol.h> |
| 14 | #include <net/udp.h> | 15 | #include <net/udp.h> |
| @@ -224,6 +225,10 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb) | |||
| 224 | 225 | ||
| 225 | /* ... check padding bits here. Silly. :-) */ | 226 | /* ... check padding bits here. Silly. :-) */ |
| 226 | 227 | ||
| 228 | /* RFC4303: Drop dummy packets without any error */ | ||
| 229 | if (nexthdr[1] == IPPROTO_NONE) | ||
| 230 | goto out; | ||
| 231 | |||
| 227 | iph = ip_hdr(skb); | 232 | iph = ip_hdr(skb); |
| 228 | ihl = iph->ihl * 4; | 233 | ihl = iph->ihl * 4; |
| 229 | 234 | ||
diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c index c5c107a018..96400b0bd0 100644 --- a/net/ipv4/ipconfig.c +++ b/net/ipv4/ipconfig.c | |||
| @@ -1396,25 +1396,7 @@ late_initcall(ip_auto_config); | |||
| 1396 | 1396 | ||
| 1397 | /* | 1397 | /* |
| 1398 | * Decode any IP configuration options in the "ip=" or "nfsaddrs=" kernel | 1398 | * Decode any IP configuration options in the "ip=" or "nfsaddrs=" kernel |
| 1399 | * command line parameter. It consists of option fields separated by colons in | 1399 | * command line parameter. See Documentation/nfsroot.txt. |
| 1400 | * the following order: | ||
| 1401 | * | ||
| 1402 | * <client-ip>:<server-ip>:<gw-ip>:<netmask>:<host name>:<device>:<PROTO> | ||
| 1403 | * | ||
| 1404 | * Any of the fields can be empty which means to use a default value: | ||
| 1405 | * <client-ip> - address given by BOOTP or RARP | ||
| 1406 | * <server-ip> - address of host returning BOOTP or RARP packet | ||
| 1407 | * <gw-ip> - none, or the address returned by BOOTP | ||
| 1408 | * <netmask> - automatically determined from <client-ip>, or the | ||
| 1409 | * one returned by BOOTP | ||
| 1410 | * <host name> - <client-ip> in ASCII notation, or the name returned | ||
| 1411 | * by BOOTP | ||
| 1412 | * <device> - use all available devices | ||
| 1413 | * <PROTO>: | ||
| 1414 | * off|none - don't do autoconfig at all (DEFAULT) | ||
| 1415 | * on|any - use any configured protocol | ||
| 1416 | * dhcp|bootp|rarp - use only the specified protocol | ||
| 1417 | * both - use both BOOTP and RARP (not DHCP) | ||
| 1418 | */ | 1400 | */ |
| 1419 | static int __init ic_proto_name(char *name) | 1401 | static int __init ic_proto_name(char *name) |
| 1420 | { | 1402 | { |
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index 4b10b98640..b9b189c262 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c | |||
| @@ -1492,8 +1492,10 @@ static inline int compat_copy_match_to_user(struct ipt_entry_match *m, | |||
| 1492 | return xt_compat_match_to_user(m, dstptr, size); | 1492 | return xt_compat_match_to_user(m, dstptr, size); |
| 1493 | } | 1493 | } |
| 1494 | 1494 | ||
| 1495 | static int compat_copy_entry_to_user(struct ipt_entry *e, | 1495 | static int |
| 1496 | void __user **dstptr, compat_uint_t *size) | 1496 | compat_copy_entry_to_user(struct ipt_entry *e, void __user **dstptr, |
| 1497 | compat_uint_t *size, struct xt_counters *counters, | ||
| 1498 | unsigned int *i) | ||
| 1497 | { | 1499 | { |
| 1498 | struct ipt_entry_target *t; | 1500 | struct ipt_entry_target *t; |
| 1499 | struct compat_ipt_entry __user *ce; | 1501 | struct compat_ipt_entry __user *ce; |
| @@ -1507,6 +1509,9 @@ static int compat_copy_entry_to_user(struct ipt_entry *e, | |||
| 1507 | if (copy_to_user(ce, e, sizeof(struct ipt_entry))) | 1509 | if (copy_to_user(ce, e, sizeof(struct ipt_entry))) |
| 1508 | goto out; | 1510 | goto out; |
| 1509 | 1511 | ||
| 1512 | if (copy_to_user(&ce->counters, &counters[*i], sizeof(counters[*i]))) | ||
| 1513 | goto out; | ||
| 1514 | |||
| 1510 | *dstptr += sizeof(struct compat_ipt_entry); | 1515 | *dstptr += sizeof(struct compat_ipt_entry); |
| 1511 | ret = IPT_MATCH_ITERATE(e, compat_copy_match_to_user, dstptr, size); | 1516 | ret = IPT_MATCH_ITERATE(e, compat_copy_match_to_user, dstptr, size); |
| 1512 | target_offset = e->target_offset - (origsize - *size); | 1517 | target_offset = e->target_offset - (origsize - *size); |
| @@ -1522,6 +1527,8 @@ static int compat_copy_entry_to_user(struct ipt_entry *e, | |||
| 1522 | goto out; | 1527 | goto out; |
| 1523 | if (put_user(next_offset, &ce->next_offset)) | 1528 | if (put_user(next_offset, &ce->next_offset)) |
| 1524 | goto out; | 1529 | goto out; |
| 1530 | |||
| 1531 | (*i)++; | ||
| 1525 | return 0; | 1532 | return 0; |
| 1526 | out: | 1533 | out: |
| 1527 | return ret; | 1534 | return ret; |
| @@ -1937,14 +1944,13 @@ struct compat_ipt_get_entries | |||
| 1937 | static int compat_copy_entries_to_user(unsigned int total_size, | 1944 | static int compat_copy_entries_to_user(unsigned int total_size, |
| 1938 | struct xt_table *table, void __user *userptr) | 1945 | struct xt_table *table, void __user *userptr) |
| 1939 | { | 1946 | { |
| 1940 | unsigned int off, num; | ||
| 1941 | struct compat_ipt_entry e; | ||
| 1942 | struct xt_counters *counters; | 1947 | struct xt_counters *counters; |
| 1943 | struct xt_table_info *private = table->private; | 1948 | struct xt_table_info *private = table->private; |
| 1944 | void __user *pos; | 1949 | void __user *pos; |
| 1945 | unsigned int size; | 1950 | unsigned int size; |
| 1946 | int ret = 0; | 1951 | int ret = 0; |
| 1947 | void *loc_cpu_entry; | 1952 | void *loc_cpu_entry; |
| 1953 | unsigned int i = 0; | ||
| 1948 | 1954 | ||
| 1949 | counters = alloc_counters(table); | 1955 | counters = alloc_counters(table); |
| 1950 | if (IS_ERR(counters)) | 1956 | if (IS_ERR(counters)) |
| @@ -1958,48 +1964,9 @@ static int compat_copy_entries_to_user(unsigned int total_size, | |||
| 1958 | pos = userptr; | 1964 | pos = userptr; |
| 1959 | size = total_size; | 1965 | size = total_size; |
| 1960 | ret = IPT_ENTRY_ITERATE(loc_cpu_entry, total_size, | 1966 | ret = IPT_ENTRY_ITERATE(loc_cpu_entry, total_size, |
| 1961 | compat_copy_entry_to_user, &pos, &size); | 1967 | compat_copy_entry_to_user, |
| 1962 | if (ret) | 1968 | &pos, &size, counters, &i); |
| 1963 | goto free_counters; | ||
| 1964 | |||
| 1965 | /* ... then go back and fix counters and names */ | ||
| 1966 | for (off = 0, num = 0; off < size; off += e.next_offset, num++) { | ||
| 1967 | unsigned int i; | ||
| 1968 | struct ipt_entry_match m; | ||
| 1969 | struct ipt_entry_target t; | ||
| 1970 | 1969 | ||
| 1971 | ret = -EFAULT; | ||
| 1972 | if (copy_from_user(&e, userptr + off, | ||
| 1973 | sizeof(struct compat_ipt_entry))) | ||
| 1974 | goto free_counters; | ||
| 1975 | if (copy_to_user(userptr + off + | ||
| 1976 | offsetof(struct compat_ipt_entry, counters), | ||
| 1977 | &counters[num], sizeof(counters[num]))) | ||
| 1978 | goto free_counters; | ||
| 1979 | |||
| 1980 | for (i = sizeof(struct compat_ipt_entry); | ||
| 1981 | i < e.target_offset; i += m.u.match_size) { | ||
| 1982 | if (copy_from_user(&m, userptr + off + i, | ||
| 1983 | sizeof(struct ipt_entry_match))) | ||
| 1984 | goto free_counters; | ||
| 1985 | if (copy_to_user(userptr + off + i + | ||
| 1986 | offsetof(struct ipt_entry_match, u.user.name), | ||
| 1987 | m.u.kernel.match->name, | ||
| 1988 | strlen(m.u.kernel.match->name) + 1)) | ||
| 1989 | goto free_counters; | ||
| 1990 | } | ||
| 1991 | |||
| 1992 | if (copy_from_user(&t, userptr + off + e.target_offset, | ||
| 1993 | sizeof(struct ipt_entry_target))) | ||
| 1994 | goto free_counters; | ||
| 1995 | if (copy_to_user(userptr + off + e.target_offset + | ||
| 1996 | offsetof(struct ipt_entry_target, u.user.name), | ||
| 1997 | t.u.kernel.target->name, | ||
| 1998 | strlen(t.u.kernel.target->name) + 1)) | ||
| 1999 | goto free_counters; | ||
| 2000 | } | ||
| 2001 | ret = 0; | ||
| 2002 | free_counters: | ||
| 2003 | vfree(counters); | 1970 | vfree(counters); |
| 2004 | return ret; | 1971 | return ret; |
| 2005 | } | 1972 | } |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index b9e429d2d1..889c89362b 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -923,7 +923,7 @@ static void tcp_init_metrics(struct sock *sk) | |||
| 923 | } | 923 | } |
| 924 | if (dst_metric(dst, RTAX_RTTVAR) > tp->mdev) { | 924 | if (dst_metric(dst, RTAX_RTTVAR) > tp->mdev) { |
| 925 | tp->mdev = dst_metric(dst, RTAX_RTTVAR); | 925 | tp->mdev = dst_metric(dst, RTAX_RTTVAR); |
| 926 | tp->mdev_max = tp->rttvar = max(tp->mdev, TCP_RTO_MIN); | 926 | tp->mdev_max = tp->rttvar = max(tp->mdev, tcp_rto_min(sk)); |
| 927 | } | 927 | } |
| 928 | tcp_set_rto(sk); | 928 | tcp_set_rto(sk); |
| 929 | tcp_bound_rto(sk); | 929 | tcp_bound_rto(sk); |
