]> git.baikalelectronics.ru Git - kernel.git/commit
net: fix net_gso_ok for new GSO types.
authorMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Mon, 25 Apr 2016 18:13:17 +0000 (15:13 -0300)
committerDavid S. Miller <davem@davemloft.net>
Thu, 28 Apr 2016 19:53:17 +0000 (15:53 -0400)
commitb5f5930f5ff6386367f940d3e7983ce81b341ea0
tree8f57c8a87aff3b662bb8146b0f5bf0f56fe5f177
parent74fd739e852d92f60117f6d87eb52c5b0a69eba4
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>
include/linux/netdevice.h