• M
    net: fix net_gso_ok for new GSO types. · 7b748340
    Marcelo Ricardo Leitner 提交于
    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: NMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    7b748340
netdevice.h 131.8 KB