mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 04:01:48 -04:00
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: (48 commits) [NETFILTER]: Fix non-ANSI func. decl. [TG3]: Identify Serdes devices more clearly. [TG3]: Use msleep. [TG3]: Use netif_msg_*. [TG3]: Allow partial speed advertisement. [TG3]: Add TG3_FLG2_IS_NIC flag. [TG3]: Add 5787F device ID. [TG3]: Fix Phy loopback. [WANROUTER]: Kill kmalloc debugging code. [TCP] inet_twdr_hangman: Delete unnecessary memory barrier(). [NET]: Memory barrier cleanups [IPSEC]: Fix inetpeer leak in ipv4 xfrm dst entries. audit: disable ipsec auditing when CONFIG_AUDITSYSCALL=n audit: Add auditing to ipsec [IRDA] irlan: Fix compile warning when CONFIG_PROC_FS=n [IrDA]: Incorrect TTP header reservation [IrDA]: PXA FIR code device model conversion [GENETLINK]: Fix misplaced command flags. [NETLIK]: Add a pointer to the Generic Netlink wiki page. [IPV6] RAW: Don't release unlocked sock. ...
This commit is contained in:
commit
2685b267bc
55 changed files with 3208 additions and 462 deletions
|
|
@ -178,7 +178,6 @@ void inet_twdr_hangman(unsigned long data)
|
|||
need_timer = 0;
|
||||
if (inet_twdr_do_twkill_work(twdr, twdr->slot)) {
|
||||
twdr->thread_slots |= (1 << twdr->slot);
|
||||
mb();
|
||||
schedule_work(&twdr->twkill_work);
|
||||
need_timer = 1;
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -375,6 +375,13 @@ static int mark_source_chains(struct xt_table_info *newinfo,
|
|||
&& unconditional(&e->arp)) {
|
||||
unsigned int oldpos, size;
|
||||
|
||||
if (t->verdict < -NF_MAX_VERDICT - 1) {
|
||||
duprintf("mark_source_chains: bad "
|
||||
"negative verdict (%i)\n",
|
||||
t->verdict);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Return: backtrack through the last
|
||||
* big jump.
|
||||
*/
|
||||
|
|
@ -404,6 +411,14 @@ static int mark_source_chains(struct xt_table_info *newinfo,
|
|||
if (strcmp(t->target.u.user.name,
|
||||
ARPT_STANDARD_TARGET) == 0
|
||||
&& newpos >= 0) {
|
||||
if (newpos > newinfo->size -
|
||||
sizeof(struct arpt_entry)) {
|
||||
duprintf("mark_source_chains: "
|
||||
"bad verdict (%i)\n",
|
||||
newpos);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* This a jump; chase it. */
|
||||
duprintf("Jump rule %u -> %u\n",
|
||||
pos, newpos);
|
||||
|
|
@ -426,8 +441,6 @@ static int mark_source_chains(struct xt_table_info *newinfo,
|
|||
static inline int standard_check(const struct arpt_entry_target *t,
|
||||
unsigned int max_offset)
|
||||
{
|
||||
struct arpt_standard_target *targ = (void *)t;
|
||||
|
||||
/* Check standard info. */
|
||||
if (t->u.target_size
|
||||
!= ARPT_ALIGN(sizeof(struct arpt_standard_target))) {
|
||||
|
|
@ -437,18 +450,6 @@ static inline int standard_check(const struct arpt_entry_target *t,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (targ->verdict >= 0
|
||||
&& targ->verdict > max_offset - sizeof(struct arpt_entry)) {
|
||||
duprintf("arpt_standard_check: bad verdict (%i)\n",
|
||||
targ->verdict);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (targ->verdict < -NF_MAX_VERDICT - 1) {
|
||||
duprintf("arpt_standard_check: bad negative verdict (%i)\n",
|
||||
targ->verdict);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -627,18 +628,20 @@ static int translate_table(const char *name,
|
|||
}
|
||||
}
|
||||
|
||||
if (!mark_source_chains(newinfo, valid_hooks, entry0)) {
|
||||
duprintf("Looping hook\n");
|
||||
return -ELOOP;
|
||||
}
|
||||
|
||||
/* Finally, each sanity check must pass */
|
||||
i = 0;
|
||||
ret = ARPT_ENTRY_ITERATE(entry0, newinfo->size,
|
||||
check_entry, name, size, &i);
|
||||
|
||||
if (ret != 0)
|
||||
goto cleanup;
|
||||
|
||||
ret = -ELOOP;
|
||||
if (!mark_source_chains(newinfo, valid_hooks, entry0)) {
|
||||
duprintf("Looping hook\n");
|
||||
goto cleanup;
|
||||
if (ret != 0) {
|
||||
ARPT_ENTRY_ITERATE(entry0, newinfo->size,
|
||||
cleanup_entry, &i);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* And one copy for every other CPU */
|
||||
|
|
@ -647,9 +650,6 @@ static int translate_table(const char *name,
|
|||
memcpy(newinfo->entries[i], entry0, newinfo->size);
|
||||
}
|
||||
|
||||
return 0;
|
||||
cleanup:
|
||||
ARPT_ENTRY_ITERATE(entry0, newinfo->size, cleanup_entry, &i);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -401,6 +401,13 @@ mark_source_chains(struct xt_table_info *newinfo,
|
|||
&& unconditional(&e->ip)) {
|
||||
unsigned int oldpos, size;
|
||||
|
||||
if (t->verdict < -NF_MAX_VERDICT - 1) {
|
||||
duprintf("mark_source_chains: bad "
|
||||
"negative verdict (%i)\n",
|
||||
t->verdict);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Return: backtrack through the last
|
||||
big jump. */
|
||||
do {
|
||||
|
|
@ -438,6 +445,13 @@ mark_source_chains(struct xt_table_info *newinfo,
|
|||
if (strcmp(t->target.u.user.name,
|
||||
IPT_STANDARD_TARGET) == 0
|
||||
&& newpos >= 0) {
|
||||
if (newpos > newinfo->size -
|
||||
sizeof(struct ipt_entry)) {
|
||||
duprintf("mark_source_chains: "
|
||||
"bad verdict (%i)\n",
|
||||
newpos);
|
||||
return 0;
|
||||
}
|
||||
/* This a jump; chase it. */
|
||||
duprintf("Jump rule %u -> %u\n",
|
||||
pos, newpos);
|
||||
|
|
@ -469,27 +483,6 @@ cleanup_match(struct ipt_entry_match *m, unsigned int *i)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
standard_check(const struct ipt_entry_target *t,
|
||||
unsigned int max_offset)
|
||||
{
|
||||
struct ipt_standard_target *targ = (void *)t;
|
||||
|
||||
/* Check standard info. */
|
||||
if (targ->verdict >= 0
|
||||
&& targ->verdict > max_offset - sizeof(struct ipt_entry)) {
|
||||
duprintf("ipt_standard_check: bad verdict (%i)\n",
|
||||
targ->verdict);
|
||||
return 0;
|
||||
}
|
||||
if (targ->verdict < -NF_MAX_VERDICT - 1) {
|
||||
duprintf("ipt_standard_check: bad negative verdict (%i)\n",
|
||||
targ->verdict);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int
|
||||
check_match(struct ipt_entry_match *m,
|
||||
const char *name,
|
||||
|
|
@ -576,12 +569,7 @@ check_entry(struct ipt_entry *e, const char *name, unsigned int size,
|
|||
if (ret)
|
||||
goto err;
|
||||
|
||||
if (t->u.kernel.target == &ipt_standard_target) {
|
||||
if (!standard_check(t, size)) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
} else if (t->u.kernel.target->checkentry
|
||||
if (t->u.kernel.target->checkentry
|
||||
&& !t->u.kernel.target->checkentry(name, e, target, t->data,
|
||||
e->comefrom)) {
|
||||
duprintf("ip_tables: check failed for `%s'.\n",
|
||||
|
|
@ -718,17 +706,19 @@ translate_table(const char *name,
|
|||
}
|
||||
}
|
||||
|
||||
if (!mark_source_chains(newinfo, valid_hooks, entry0))
|
||||
return -ELOOP;
|
||||
|
||||
/* Finally, each sanity check must pass */
|
||||
i = 0;
|
||||
ret = IPT_ENTRY_ITERATE(entry0, newinfo->size,
|
||||
check_entry, name, size, &i);
|
||||
|
||||
if (ret != 0)
|
||||
goto cleanup;
|
||||
|
||||
ret = -ELOOP;
|
||||
if (!mark_source_chains(newinfo, valid_hooks, entry0))
|
||||
goto cleanup;
|
||||
if (ret != 0) {
|
||||
IPT_ENTRY_ITERATE(entry0, newinfo->size,
|
||||
cleanup_entry, &i);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* And one copy for every other CPU */
|
||||
for_each_possible_cpu(i) {
|
||||
|
|
@ -736,9 +726,6 @@ translate_table(const char *name,
|
|||
memcpy(newinfo->entries[i], entry0, newinfo->size);
|
||||
}
|
||||
|
||||
return 0;
|
||||
cleanup:
|
||||
IPT_ENTRY_ITERATE(entry0, newinfo->size, cleanup_entry, &i);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -1529,25 +1516,8 @@ static inline int compat_copy_match_from_user(struct ipt_entry_match *m,
|
|||
void **dstptr, compat_uint_t *size, const char *name,
|
||||
const struct ipt_ip *ip, unsigned int hookmask)
|
||||
{
|
||||
struct ipt_entry_match *dm;
|
||||
struct ipt_match *match;
|
||||
int ret;
|
||||
|
||||
dm = (struct ipt_entry_match *)*dstptr;
|
||||
match = m->u.kernel.match;
|
||||
xt_compat_match_from_user(m, dstptr, size);
|
||||
|
||||
ret = xt_check_match(match, AF_INET, dm->u.match_size - sizeof(*dm),
|
||||
name, hookmask, ip->proto,
|
||||
ip->invflags & IPT_INV_PROTO);
|
||||
if (!ret && m->u.kernel.match->checkentry
|
||||
&& !m->u.kernel.match->checkentry(name, ip, match, dm->data,
|
||||
hookmask)) {
|
||||
duprintf("ip_tables: check failed for `%s'.\n",
|
||||
m->u.kernel.match->name);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int compat_copy_entry_from_user(struct ipt_entry *e, void **dstptr,
|
||||
|
|
@ -1569,7 +1539,7 @@ static int compat_copy_entry_from_user(struct ipt_entry *e, void **dstptr,
|
|||
ret = IPT_MATCH_ITERATE(e, compat_copy_match_from_user, dstptr, size,
|
||||
name, &de->ip, de->comefrom);
|
||||
if (ret)
|
||||
goto err;
|
||||
return ret;
|
||||
de->target_offset = e->target_offset - (origsize - *size);
|
||||
t = ipt_get_target(e);
|
||||
target = t->u.kernel.target;
|
||||
|
|
@ -1582,31 +1552,62 @@ static int compat_copy_entry_from_user(struct ipt_entry *e, void **dstptr,
|
|||
if ((unsigned char *)de - base < newinfo->underflow[h])
|
||||
newinfo->underflow[h] -= origsize - *size;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
t = ipt_get_target(de);
|
||||
static inline int compat_check_match(struct ipt_entry_match *m, const char *name,
|
||||
const struct ipt_ip *ip, unsigned int hookmask)
|
||||
{
|
||||
struct ipt_match *match;
|
||||
int ret;
|
||||
|
||||
match = m->u.kernel.match;
|
||||
ret = xt_check_match(match, AF_INET, m->u.match_size - sizeof(*m),
|
||||
name, hookmask, ip->proto,
|
||||
ip->invflags & IPT_INV_PROTO);
|
||||
if (!ret && m->u.kernel.match->checkentry
|
||||
&& !m->u.kernel.match->checkentry(name, ip, match, m->data,
|
||||
hookmask)) {
|
||||
duprintf("ip_tables: compat: check failed for `%s'.\n",
|
||||
m->u.kernel.match->name);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int compat_check_target(struct ipt_entry *e, const char *name)
|
||||
{
|
||||
struct ipt_entry_target *t;
|
||||
struct ipt_target *target;
|
||||
int ret;
|
||||
|
||||
t = ipt_get_target(e);
|
||||
target = t->u.kernel.target;
|
||||
ret = xt_check_target(target, AF_INET, t->u.target_size - sizeof(*t),
|
||||
name, e->comefrom, e->ip.proto,
|
||||
e->ip.invflags & IPT_INV_PROTO);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
ret = -EINVAL;
|
||||
if (t->u.kernel.target == &ipt_standard_target) {
|
||||
if (!standard_check(t, *size))
|
||||
goto err;
|
||||
} else if (t->u.kernel.target->checkentry
|
||||
&& !t->u.kernel.target->checkentry(name, de, target,
|
||||
t->data, de->comefrom)) {
|
||||
if (!ret && t->u.kernel.target->checkentry
|
||||
&& !t->u.kernel.target->checkentry(name, e, target,
|
||||
t->data, e->comefrom)) {
|
||||
duprintf("ip_tables: compat: check failed for `%s'.\n",
|
||||
t->u.kernel.target->name);
|
||||
goto err;
|
||||
ret = -EINVAL;
|
||||
}
|
||||
ret = 0;
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int compat_check_entry(struct ipt_entry *e, const char *name)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = IPT_MATCH_ITERATE(e, compat_check_match, name, &e->ip,
|
||||
e->comefrom);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return compat_check_target(e, name);
|
||||
}
|
||||
|
||||
static int
|
||||
translate_compat_table(const char *name,
|
||||
unsigned int valid_hooks,
|
||||
|
|
@ -1695,6 +1696,11 @@ translate_compat_table(const char *name,
|
|||
if (!mark_source_chains(newinfo, valid_hooks, entry1))
|
||||
goto free_newinfo;
|
||||
|
||||
ret = IPT_ENTRY_ITERATE(entry1, newinfo->size, compat_check_entry,
|
||||
name);
|
||||
if (ret)
|
||||
goto free_newinfo;
|
||||
|
||||
/* And one copy for every other CPU */
|
||||
for_each_possible_cpu(i)
|
||||
if (newinfo->entries[i] && newinfo->entries[i] != entry1)
|
||||
|
|
|
|||
|
|
@ -1780,7 +1780,7 @@ static inline int __mkroute_input(struct sk_buff *skb,
|
|||
#endif
|
||||
if (in_dev->cnf.no_policy)
|
||||
rth->u.dst.flags |= DST_NOPOLICY;
|
||||
if (in_dev->cnf.no_xfrm)
|
||||
if (out_dev->cnf.no_xfrm)
|
||||
rth->u.dst.flags |= DST_NOXFRM;
|
||||
rth->fl.fl4_dst = daddr;
|
||||
rth->rt_dst = daddr;
|
||||
|
|
|
|||
|
|
@ -4235,7 +4235,7 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
|
|||
* Change state from SYN-SENT only after copied_seq
|
||||
* is initialized. */
|
||||
tp->copied_seq = tp->rcv_nxt;
|
||||
mb();
|
||||
smp_mb();
|
||||
tcp_set_state(sk, TCP_ESTABLISHED);
|
||||
|
||||
security_inet_conn_established(sk, skb);
|
||||
|
|
@ -4483,7 +4483,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
|
|||
case TCP_SYN_RECV:
|
||||
if (acceptable) {
|
||||
tp->copied_seq = tp->rcv_nxt;
|
||||
mb();
|
||||
smp_mb();
|
||||
tcp_set_state(sk, TCP_ESTABLISHED);
|
||||
sk->sk_state_change(sk);
|
||||
|
||||
|
|
|
|||
|
|
@ -274,6 +274,8 @@ static void xfrm4_dst_destroy(struct dst_entry *dst)
|
|||
|
||||
if (likely(xdst->u.rt.idev))
|
||||
in_dev_put(xdst->u.rt.idev);
|
||||
if (likely(xdst->u.rt.peer))
|
||||
inet_putpeer(xdst->u.rt.peer);
|
||||
xfrm_dst_destroy(xdst);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue