aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/netdevice.h
diff options
context:
space:
mode:
authorMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>2016-04-25 14:13:17 -0400
committerDavid S. Miller <davem@davemloft.net>2016-04-28 15:53:17 -0400
commit7b7483409f09c15f30ac43242ead1ab3061e1f59 (patch)
tree8f57c8a87aff3b662bb8146b0f5bf0f56fe5f177 /include/linux/netdevice.h
parent62522ef3c399996f6c8120bfd14b94280bc9f490 (diff)
net: fix net_gso_ok for new GSO types.
Fix casting in net_gso_ok. Otherwise the shift on gso_type << NETIF_F_GSO_SHIFT may hit the 32th bit and make it look like a INT_MIN, which is then promoted from signed to uint64 which is 0xffffffff80000000, resulting in wrong behavior when it is and'ed with the feature itself, as in: This test app: #include <stdio.h> #include <stdint.h> int main(int argc, char **argv) { uint64_t feature1; uint64_t feature2; int gso_type = 1 << 15; feature1 = gso_type << 16; feature2 = (uint64_t)gso_type << 16; printf("%lx %lx\n", feature1, feature2); return 0; } Gives: ffffffff80000000 80000000 So that this: return (features & feature) == feature; Actually works on more bits than expected and invalid ones. Fix is to promote it earlier. Issue noted while rebasing SCTP GSO patch but posting separetely as someone else may experience this meanwhile. Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/netdevice.h')
-rw-r--r--include/linux/netdevice.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 8395308a2445..b3c46b019ac1 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -4004,7 +4004,7 @@ netdev_features_t netif_skb_features(struct sk_buff *skb);
4004 4004
4005static inline bool net_gso_ok(netdev_features_t features, int gso_type) 4005static inline bool net_gso_ok(netdev_features_t features, int gso_type)
4006{ 4006{
4007 netdev_features_t feature = gso_type << NETIF_F_GSO_SHIFT; 4007 netdev_features_t feature = (netdev_features_t)gso_type << NETIF_F_GSO_SHIFT;
4008 4008
4009 /* check flags correspondence */ 4009 /* check flags correspondence */
4010 BUILD_BUG_ON(SKB_GSO_TCPV4 != (NETIF_F_TSO >> NETIF_F_GSO_SHIFT)); 4010 BUILD_BUG_ON(SKB_GSO_TCPV4 != (NETIF_F_TSO >> NETIF_F_GSO_SHIFT));