summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Roberts <vieuxtech@gmail.com>2009-03-30 17:57:41 -0700
committerSam Roberts <vieuxtech@gmail.com>2009-03-30 17:57:41 -0700
commit2fe8da3a8e01ecc8697e529de5cbba5a502473b5 (patch)
tree62aa73970257b2ef653d414ef0939f8cf4882971
parent14f67cc09cf7c98a871a5e07d699a0d57b2d7747 (diff)
downloadlibnet-2fe8da3a8e01ecc8697e529de5cbba5a502473b5.tar.gz
Fix for debian bug# 418975, IPv6 wasn't updating ip_offset.
See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=418975 and sample test_ipv6_icmpv4.c for more information, and reproduction.
-rw-r--r--libnet/sample/Makefile.am3
-rw-r--r--libnet/sample/test_ipv6_icmpv4.c (renamed from unmerged/test_ipv6_icmpv4.c)0
-rw-r--r--libnet/src/libnet_build_ip.c9
-rw-r--r--libnet/src/libnet_pblock.c2
4 files changed, 10 insertions, 4 deletions
diff --git a/libnet/sample/Makefile.am b/libnet/sample/Makefile.am
index 3186f5d..87b76a7 100644
--- a/libnet/sample/Makefile.am
+++ b/libnet/sample/Makefile.am
@@ -14,7 +14,7 @@ noinst_PROGRAMS = arp cdp dhcp_discover get_addr icmp_timestamp icmp_unreach \
smurf dot1x dns rpc_tcp rpc_udp mpls icmp_timeexceed \
fddi_tcp1 fddi_tcp2 tring_tcp1 tring_tcp2 icmp_redirect \
bgp4_hdr bgp4_open bgp4_update bgp4_notification gre \
- synflood6_frag tftp ip_link ip_raw sebek test_ipv4
+ synflood6_frag tftp ip_link ip_raw sebek test_ipv4 test_ipv6_icmpv4
arp_SOURCES = arp.c
cdp_SOURCES = cdp.c
@@ -60,5 +60,6 @@ ip_raw_SOURCES = ip_raw.c
ip_link_SOURCES = ip_link.c
sebek_SOURCES = sebek.c
test_ipv4_SOURCES = test_ipv4.c
+test_ipv6_icmpv4_SOURCES = test_ipv6_icmpv4.c
LDADD = $(top_srcdir)/src/libnet.la
diff --git a/unmerged/test_ipv6_icmpv4.c b/libnet/sample/test_ipv6_icmpv4.c
index b3dcd67..b3dcd67 100644
--- a/unmerged/test_ipv6_icmpv4.c
+++ b/libnet/sample/test_ipv6_icmpv4.c
diff --git a/libnet/src/libnet_build_ip.c b/libnet/src/libnet_build_ip.c
index e0e760d..c23c296 100644
--- a/libnet/src/libnet_build_ip.c
+++ b/libnet/src/libnet_build_ip.c
@@ -557,8 +557,13 @@ u_int8_t *payload, u_int32_t payload_s, libnet_t *l, libnet_ptag_t ptag)
}
/* no checksum for IPv6 */
- return (ptag ? ptag : libnet_pblock_update(l, p, LIBNET_IPV6_H,
- LIBNET_PBLOCK_IPV6_H));
+ ptag = ptag ? ptag : libnet_pblock_update(l, p, LIBNET_IPV6_H,
+ LIBNET_PBLOCK_IPV6_H);
+
+ libnet_pblock_record_ip_offset(l, p);
+
+ return ptag;
+
bad:
libnet_pblock_delete(l, p);
return (-1);
diff --git a/libnet/src/libnet_pblock.c b/libnet/src/libnet_pblock.c
index b213b1d..5530c02 100644
--- a/libnet/src/libnet_pblock.c
+++ b/libnet/src/libnet_pblock.c
@@ -506,7 +506,7 @@ libnet_pblock_record_ip_offset(libnet_t *l, libnet_pblock_t *p)
libnet_pblock_t *c;
u_int32_t ip_offset = 0;
- assert(p->type == LIBNET_PBLOCK_IPV4_H);
+ assert(p->type == LIBNET_PBLOCK_IPV4_H || p->type == LIBNET_PBLOCK_IPV6_H);
for(c = p; c; c = c->prev)
ip_offset += c->b_len;