File libnet-1.1.2.1-strict-aliasing-fix.diff of Package libnet
--- src/libnet_resolve.c
+++ src/libnet_resolve.c
@@ -370,7 +370,11 @@
int i;
int32_t l;
int8_t *pp;
-
+ union {
+ int8_t *ipp;
+ char *cpp;
+ } upp = { &pp };
+
while (isspace(*s))
{
s++;
@@ -390,7 +394,7 @@
/* expect len hex octets separated by ':' */
for (i = 0; i < *len + 1; i++)
{
- l = strtol(s, (char **)&pp, 16);
+ l = strtol(s, upp.cpp, 16);
if (pp == s || l > 0xff || l < 0)
{
*len = 0;
--- src/libnet_checksum.c
+++ src/libnet_checksum.c
@@ -58,6 +58,27 @@
return (sum);
}
+#include <assert.h>
+/* same as above, just takes *u_int32_t */
+int
+libnet_in_cksum32(u_int32_t *addr32, int len)
+{
+ int sum;
+
+ sum = 0;
+
+ while (len > 3)
+ {
+ sum += (*addr32) >> 16;
+ sum += (*addr32) & 0x0000ffff;
+ len -= 4;
+ addr32++;
+ }
+ assert(len == 0);
+
+ return (sum);
+}
+
int
libnet_toggle_checksum(libnet_t *l, libnet_ptag_t ptag, int mode)
{
@@ -173,7 +194,7 @@
}
else
{
- sum = libnet_in_cksum((u_int16_t *)&iph_p->ip_src, 8);
+ sum = libnet_in_cksum32((u_int32_t *)&iph_p->ip_src, 8);
}
sum += ntohs(IPPROTO_TCP + len);
sum += libnet_in_cksum((u_int16_t *)tcph_p, len);
@@ -191,7 +212,7 @@
}
else
{
- sum = libnet_in_cksum((u_int16_t *)&iph_p->ip_src, 8);
+ sum = libnet_in_cksum32((u_int32_t *)&iph_p->ip_src, 8);
}
sum += ntohs(IPPROTO_UDP + len);
sum += libnet_in_cksum((u_int16_t *)udph_p, len);