ip_queue and fragments
Subsystems (2)
PATCH 1/1 ip_queue and fragments
Hi,
I've tracing ip_queue source code and I think that it's not fragment aware. Am I missing anything?
regards,
Pablo
net/ipv4/netfilter/ip_queue.c +4 -3
@@ -255,9 +255,10 @@ entry->skb->dev->hard_header_parse (entry->skb, pmsg->hw_addr); } - -if (data_len) -memcpy (pmsg->payload, entry->skb->data, data_len); + +if (data_len) +if (skb_copy_bits (entry->skb,0 , pmsg->payload, data_len) !=0 ) + goto nlmsg_failure; nlh->nlmsg_len = skb->tail - old_tail;return skb;
Quoted 3 lines · Pablo Neira
Hi,
I've tracing
ip_queuesource code and I think that it's not fragment aware. Am I missing anything?
This check prevents copying data outside of skb->data:
case IPQ_COPY_PACKET:
if (copy_range == 0 || copy_range > entry->skb->len)
data_len = entry->skb->len;
else
data_len = copy_range;skb_copy_bits always stays inside limits if len is positive, so you can do something like this:
if (copy_range == 0)
data_len = ~0UL;
else
data_len = copy_range;
but you have to remove the jump to nlmsg_failure when skb_copy_bits fails.
Regards
Patrick
Quoted 21 lines
------------------------------------------------------------------------
diff -u -r1.1.1.1
ip_queue.cnet/ipv4/netfilter/ip_queue.c +4
-3@@ -255,9 +255,10 @@ entry->skb->dev->hard_header_parse (entry->skb, pmsg->hw_addr); } - -if (data_len) -memcpy (pmsg->payload, entry->skb->data, data_len); + +if (data_len) +if (skb_copy_bits (entry->skb,0 , pmsg->payload, data_len) !=0 ) + goto nlmsg_failure; nlh->nlmsg_len = skb->tail - old_tail;return skb;
Hi Patrick,
Quoted 9 lines · Patrick McHardy
skb_copy_bitsalways stays inside limits if len is positive, so you can do something like this:if (
copy_range== 0)
data_len= ~0UL;
else
data_len=copy_range;but you have to remove the jump to
nlmsg_failurewhenskb_copy_bitsfails.
thanks for your suggestions, I've applied them to my patch.
regards,
Pablo
net/ipv4/netfilter/ip_queue.c +3 -3
@@ -205,8 +205,8 @@break ;case IPQ_COPY_PACKET : -if (copy_range ==0 || copy_range > entry->skb->len) - data_len = entry->skb->len; +if (copy_range ==0 ) + data_len = ~0UL ;else data_len = copy_range;
@@ -257,7 +257,7 @@ }if (data_len) -memcpy (pmsg->payload, entry->skb->data, data_len); +skb_copy_bits (entry->skb,0 , pmsg->payload, data_len); nlh->nlmsg_len = skb->tail - old_tail;return skb;
Quoted 1 line · Pablo Neira
thanks for your suggestions, I've applied them to my patch.
Actually your first patch was fine and my suggestion was stupid ;) I'm going to put it in pom-ng later tonight.
Regards
Patrick