Commit 45ebf364 authored by Florian Westphal's avatar Florian Westphal Committed by Jiri Slaby

netfilter: nfnetlink_log: fix maximum packet length logged to userspace

commit c1e7dc91 upstream.

don't try to queue payloads > 0xffff - NLA_HDRLEN, it does not work.
The nla length includes the size of the nla struct, so anything larger
results in u16 integer overflow.

This patch is similar to
9cefbbc9 (netfilter: nfnetlink_queue: cleanup copy_range usage).
Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
parent 13117284
...@@ -45,7 +45,8 @@ ...@@ -45,7 +45,8 @@
#define NFULNL_NLBUFSIZ_DEFAULT NLMSG_GOODSIZE #define NFULNL_NLBUFSIZ_DEFAULT NLMSG_GOODSIZE
#define NFULNL_TIMEOUT_DEFAULT 100 /* every second */ #define NFULNL_TIMEOUT_DEFAULT 100 /* every second */
#define NFULNL_QTHRESH_DEFAULT 100 /* 100 packets */ #define NFULNL_QTHRESH_DEFAULT 100 /* 100 packets */
#define NFULNL_COPY_RANGE_MAX 0xFFFF /* max packet size is limited by 16-bit struct nfattr nfa_len field */ /* max packet size is limited by 16-bit struct nfattr nfa_len field */
#define NFULNL_COPY_RANGE_MAX (0xFFFF - NLA_HDRLEN)
#define PRINTR(x, args...) do { if (net_ratelimit()) \ #define PRINTR(x, args...) do { if (net_ratelimit()) \
printk(x, ## args); } while (0); printk(x, ## args); } while (0);
...@@ -255,6 +256,8 @@ nfulnl_set_mode(struct nfulnl_instance *inst, u_int8_t mode, ...@@ -255,6 +256,8 @@ nfulnl_set_mode(struct nfulnl_instance *inst, u_int8_t mode,
case NFULNL_COPY_PACKET: case NFULNL_COPY_PACKET:
inst->copy_mode = mode; inst->copy_mode = mode;
if (range == 0)
range = NFULNL_COPY_RANGE_MAX;
inst->copy_range = min_t(unsigned int, inst->copy_range = min_t(unsigned int,
range, NFULNL_COPY_RANGE_MAX); range, NFULNL_COPY_RANGE_MAX);
break; break;
...@@ -681,8 +684,7 @@ nfulnl_log_packet(struct net *net, ...@@ -681,8 +684,7 @@ nfulnl_log_packet(struct net *net,
break; break;
case NFULNL_COPY_PACKET: case NFULNL_COPY_PACKET:
if (inst->copy_range == 0 if (inst->copy_range > skb->len)
|| inst->copy_range > skb->len)
data_len = skb->len; data_len = skb->len;
else else
data_len = inst->copy_range; data_len = inst->copy_range;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment