diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/netfilter/nfnetlink_log.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c index 9f199f2e31f..4e210e0fd36 100644 --- a/net/netfilter/nfnetlink_log.c +++ b/net/netfilter/nfnetlink_log.c | |||
@@ -384,6 +384,7 @@ __build_packet_message(struct nfulnl_instance *inst, | |||
384 | struct nfgenmsg *nfmsg; | 384 | struct nfgenmsg *nfmsg; |
385 | sk_buff_data_t old_tail = inst->skb->tail; | 385 | sk_buff_data_t old_tail = inst->skb->tail; |
386 | struct sock *sk; | 386 | struct sock *sk; |
387 | const unsigned char *hwhdrp; | ||
387 | 388 | ||
388 | nlh = nlmsg_put(inst->skb, 0, 0, | 389 | nlh = nlmsg_put(inst->skb, 0, 0, |
389 | NFNL_SUBSYS_ULOG << 8 | NFULNL_MSG_PACKET, | 390 | NFNL_SUBSYS_ULOG << 8 | NFULNL_MSG_PACKET, |
@@ -485,9 +486,17 @@ __build_packet_message(struct nfulnl_instance *inst, | |||
485 | if (indev && skb_mac_header_was_set(skb)) { | 486 | if (indev && skb_mac_header_was_set(skb)) { |
486 | if (nla_put_be16(inst->skb, NFULA_HWTYPE, htons(skb->dev->type)) || | 487 | if (nla_put_be16(inst->skb, NFULA_HWTYPE, htons(skb->dev->type)) || |
487 | nla_put_be16(inst->skb, NFULA_HWLEN, | 488 | nla_put_be16(inst->skb, NFULA_HWLEN, |
488 | htons(skb->dev->hard_header_len)) || | 489 | htons(skb->dev->hard_header_len))) |
489 | nla_put(inst->skb, NFULA_HWHEADER, skb->dev->hard_header_len, | 490 | goto nla_put_failure; |
490 | skb_mac_header(skb))) | 491 | |
492 | hwhdrp = skb_mac_header(skb); | ||
493 | |||
494 | if (skb->dev->type == ARPHRD_SIT) | ||
495 | hwhdrp -= ETH_HLEN; | ||
496 | |||
497 | if (hwhdrp >= skb->head && | ||
498 | nla_put(inst->skb, NFULA_HWHEADER, | ||
499 | skb->dev->hard_header_len, hwhdrp)) | ||
491 | goto nla_put_failure; | 500 | goto nla_put_failure; |
492 | } | 501 | } |
493 | 502 | ||