aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmit Pundir <amit.pundir@linaro.org>2014-11-24 09:49:27 +0530
committerAmit Pundir <amit.pundir@linaro.org>2014-11-24 09:49:27 +0530
commit604f5b50c1fcd45ffa6aaa331544dd689a1ac8a1 (patch)
treeffc777db60b65cd7f22da47d9b780177171b1f67
parent81a9e6025aee0fc52ee4995cc9f452a4dccee8b2 (diff)
parent4cbfc67a5b390c8d6c881ebc6e67b0473a8eb8ea (diff)
Signed-off-by: Amit Pundir <amit.pundir@linaro.org> Conflicts: kernel/futex.c net/bridge/br_device.c
-rw-r--r--net/bridge/br_device.c11
-rw-r--r--net/netfilter/xt_qtaguid.c11
2 files changed, 12 insertions, 10 deletions
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c
index ffd379db5938..cd577aca202f 100644
--- a/net/bridge/br_device.c
+++ b/net/bridge/br_device.c
@@ -44,11 +44,6 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
}
#endif
- u64_stats_update_begin(&brstats->syncp);
- brstats->tx_packets++;
- brstats->tx_bytes += skb->len;
- u64_stats_update_end(&brstats->syncp);
-
BR_INPUT_SKB_CB(skb)->brdev = dev;
skb_reset_mac_header(skb);
@@ -57,6 +52,12 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
if (!br_allowed_ingress(br, br_get_vlan_info(br), skb, &vid))
goto out;
+ u64_stats_update_begin(&brstats->syncp);
+ brstats->tx_packets++;
+ /* Exclude ETH_HLEN from byte stats for consistency with Rx chain */
+ brstats->tx_bytes += skb->len;
+ u64_stats_update_end(&brstats->syncp);
+
if (is_broadcast_ether_addr(dest))
br_flood_deliver(br, skb, false);
else if (is_multicast_ether_addr(dest)) {
diff --git a/net/netfilter/xt_qtaguid.c b/net/netfilter/xt_qtaguid.c
index fcd2d8125954..f0a670aa9864 100644
--- a/net/netfilter/xt_qtaguid.c
+++ b/net/netfilter/xt_qtaguid.c
@@ -1605,7 +1605,8 @@ static struct sock *qtaguid_find_sk(const struct sk_buff *skb,
* "struct inet_timewait_sock" which is missing fields.
*/
if (sk->sk_state == TCP_TIME_WAIT) {
- sock_gen_put(sk);
+ if (sk != skb->sk)
+ sock_gen_put(sk);
sk = NULL;
}
}
@@ -1773,8 +1774,8 @@ static bool qtaguid_mt(const struct sk_buff *skb, struct xt_action_param *par)
kuid_t uid_min = make_kuid(&init_user_ns, info->uid_min);
kuid_t uid_max = make_kuid(&init_user_ns, info->uid_max);
- if (uid_gte(filp->f_cred->fsuid, uid_min) &&
- uid_lte(filp->f_cred->fsuid, uid_max) ^
+ if ((uid_gte(filp->f_cred->fsuid, uid_min) &&
+ uid_lte(filp->f_cred->fsuid, uid_max)) ^
!(info->invert & XT_QTAGUID_UID)) {
MT_DEBUG("qtaguid[%d]: leaving uid not matching\n",
par->hooknum);
@@ -1786,8 +1787,8 @@ static bool qtaguid_mt(const struct sk_buff *skb, struct xt_action_param *par)
kgid_t gid_min = make_kgid(&init_user_ns, info->gid_min);
kgid_t gid_max = make_kgid(&init_user_ns, info->gid_max);
- if (gid_gte(filp->f_cred->fsgid, gid_min) &&
- gid_lte(filp->f_cred->fsgid, gid_max) ^
+ if ((gid_gte(filp->f_cred->fsgid, gid_min) &&
+ gid_lte(filp->f_cred->fsgid, gid_max)) ^
!(info->invert & XT_QTAGUID_GID)) {
MT_DEBUG("qtaguid[%d]: leaving gid not matching\n",
par->hooknum);