mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 06:04:23 +08:00
netfilter: nf_ct_h323: cap packet size at 64k
With BIG TCP, packets generated by tcp stack may exceed 64kb. Cap datalen at 64kb. The internal message format uses 16bit fields, so no embedded message can exceed 64k size. Multiple h323 messages in a single superpacket may now result in a message to get treated as incomplete/truncated, but thats better than scribbling past h323_buffer. Another alternative suitable for net tree would be a switch to skb_linearize(). Fixes:7c4e983c4f
("net: allow gso_max_size to exceed 65536") Fixes:0fe79f28bf
("net: allow gro_max_size to exceed 65536") Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
a664375da7
commit
f3e124c36f
@ -34,6 +34,8 @@
|
|||||||
#include <net/netfilter/nf_conntrack_zones.h>
|
#include <net/netfilter/nf_conntrack_zones.h>
|
||||||
#include <linux/netfilter/nf_conntrack_h323.h>
|
#include <linux/netfilter/nf_conntrack_h323.h>
|
||||||
|
|
||||||
|
#define H323_MAX_SIZE 65535
|
||||||
|
|
||||||
/* Parameters */
|
/* Parameters */
|
||||||
static unsigned int default_rrq_ttl __read_mostly = 300;
|
static unsigned int default_rrq_ttl __read_mostly = 300;
|
||||||
module_param(default_rrq_ttl, uint, 0600);
|
module_param(default_rrq_ttl, uint, 0600);
|
||||||
@ -86,6 +88,9 @@ static int get_tpkt_data(struct sk_buff *skb, unsigned int protoff,
|
|||||||
if (tcpdatalen <= 0) /* No TCP data */
|
if (tcpdatalen <= 0) /* No TCP data */
|
||||||
goto clear_out;
|
goto clear_out;
|
||||||
|
|
||||||
|
if (tcpdatalen > H323_MAX_SIZE)
|
||||||
|
tcpdatalen = H323_MAX_SIZE;
|
||||||
|
|
||||||
if (*data == NULL) { /* first TPKT */
|
if (*data == NULL) { /* first TPKT */
|
||||||
/* Get first TPKT pointer */
|
/* Get first TPKT pointer */
|
||||||
tpkt = skb_header_pointer(skb, tcpdataoff, tcpdatalen,
|
tpkt = skb_header_pointer(skb, tcpdataoff, tcpdatalen,
|
||||||
@ -1169,6 +1174,9 @@ static unsigned char *get_udp_data(struct sk_buff *skb, unsigned int protoff,
|
|||||||
if (dataoff >= skb->len)
|
if (dataoff >= skb->len)
|
||||||
return NULL;
|
return NULL;
|
||||||
*datalen = skb->len - dataoff;
|
*datalen = skb->len - dataoff;
|
||||||
|
if (*datalen > H323_MAX_SIZE)
|
||||||
|
*datalen = H323_MAX_SIZE;
|
||||||
|
|
||||||
return skb_header_pointer(skb, dataoff, *datalen, h323_buffer);
|
return skb_header_pointer(skb, dataoff, *datalen, h323_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1770,7 +1778,7 @@ static int __init nf_conntrack_h323_init(void)
|
|||||||
|
|
||||||
NF_CT_HELPER_BUILD_BUG_ON(sizeof(struct nf_ct_h323_master));
|
NF_CT_HELPER_BUILD_BUG_ON(sizeof(struct nf_ct_h323_master));
|
||||||
|
|
||||||
h323_buffer = kmalloc(65536, GFP_KERNEL);
|
h323_buffer = kmalloc(H323_MAX_SIZE + 1, GFP_KERNEL);
|
||||||
if (!h323_buffer)
|
if (!h323_buffer)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
ret = h323_helper_init();
|
ret = h323_helper_init();
|
||||||
|
Loading…
Reference in New Issue
Block a user