[NETFILTER]: xt_hashlimit: fix mask calculation

Shifts larger than the data type are undefined, don't try to shift
an u32 by 32. Also remove some special-casing of bitmasks divisible
by 32.

Based on patch by Jan Engelhardt <jengelh@computergmbh.de>.

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by Patrick McHardy and committed by David S. Miller 1b9b70ea b41f5bff

+5 -18
+5 -18
net/netfilter/xt_hashlimit.c
··· 466 467 static inline __be32 maskl(__be32 a, unsigned int l) 468 { 469 - return htonl(ntohl(a) & ~(~(u_int32_t)0 >> l)); 470 } 471 472 #if defined(CONFIG_IP6_NF_IPTABLES) || defined(CONFIG_IP6_NF_IPTABLES_MODULE) 473 static void hashlimit_ipv6_mask(__be32 *i, unsigned int p) 474 { 475 switch (p) { 476 - case 0: 477 - i[0] = i[1] = 0; 478 - i[2] = i[3] = 0; 479 - break; 480 - case 1 ... 31: 481 i[0] = maskl(i[0], p); 482 i[1] = i[2] = i[3] = 0; 483 break; 484 - case 32: 485 - i[1] = i[2] = i[3] = 0; 486 - break; 487 - case 33 ... 63: 488 i[1] = maskl(i[1], p - 32); 489 i[2] = i[3] = 0; 490 break; 491 - case 64: 492 - i[2] = i[3] = 0; 493 - break; 494 - case 65 ... 95: 495 i[2] = maskl(i[2], p - 64); 496 i[3] = 0; 497 - case 96: 498 - i[3] = 0; 499 - break; 500 - case 97 ... 127: 501 i[3] = maskl(i[3], p - 96); 502 break; 503 case 128:
··· 466 467 static inline __be32 maskl(__be32 a, unsigned int l) 468 { 469 + return l ? htonl(ntohl(a) & ~0 << (32 - l)) : 0; 470 } 471 472 #if defined(CONFIG_IP6_NF_IPTABLES) || defined(CONFIG_IP6_NF_IPTABLES_MODULE) 473 static void hashlimit_ipv6_mask(__be32 *i, unsigned int p) 474 { 475 switch (p) { 476 + case 0 ... 31: 477 i[0] = maskl(i[0], p); 478 i[1] = i[2] = i[3] = 0; 479 break; 480 + case 32 ... 63: 481 i[1] = maskl(i[1], p - 32); 482 i[2] = i[3] = 0; 483 break; 484 + case 64 ... 95: 485 i[2] = maskl(i[2], p - 64); 486 i[3] = 0; 487 + case 96 ... 127: 488 i[3] = maskl(i[3], p - 96); 489 break; 490 case 128: