summaryrefslogtreecommitdiffstats
path: root/network/dsniff/patches/15_checksum_libnids.patch
diff options
context:
space:
mode:
Diffstat (limited to 'network/dsniff/patches/15_checksum_libnids.patch')
-rw-r--r--network/dsniff/patches/15_checksum_libnids.patch98
1 files changed, 98 insertions, 0 deletions
diff --git a/network/dsniff/patches/15_checksum_libnids.patch b/network/dsniff/patches/15_checksum_libnids.patch
new file mode 100644
index 0000000000..47fbbe1d58
--- /dev/null
+++ b/network/dsniff/patches/15_checksum_libnids.patch
@@ -0,0 +1,98 @@
+Author: Gleb Paharenko <gpaharenko@gmail.com>
+Description: Workaround to this Debian bug
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=420129
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+
+--- a/dsniff.c
++++ b/dsniff.c
+@@ -70,6 +70,80 @@
+ {
+ }
+
++
++static int get_all_ifaces(struct ifreq **, int *);
++static unsigned int get_addr_from_ifreq(struct ifreq *);
++
++int all_local_ipaddrs_chksum_disable()
++{
++ struct ifreq *ifaces;
++ int ifaces_count;
++ int i, ind = 0;
++ struct nids_chksum_ctl *ctlp;
++ unsigned int tmp;
++
++ if (!get_all_ifaces(&ifaces, &ifaces_count))
++ return -1;
++ ctlp =
++ (struct nids_chksum_ctl *) malloc(ifaces_count *
++ sizeof(struct
++ nids_chksum_ctl));
++ if (!ctlp)
++ return -1;
++ for (i = 0; i < ifaces_count; i++) {
++ tmp = get_addr_from_ifreq(ifaces + i);
++ if (tmp) {
++ ctlp[ind].netaddr = tmp;
++ ctlp[ind].mask = inet_addr("255.255.255.255");
++ ctlp[ind].action = NIDS_DONT_CHKSUM;
++ ind++;
++ }
++ }
++ free(ifaces);
++ nids_register_chksum_ctl(ctlp, ind);
++}
++
++/* helper functions for Example 2 */
++unsigned int get_addr_from_ifreq(struct ifreq *iface)
++{
++ if (iface->ifr_addr.sa_family == AF_INET)
++ return ((struct sockaddr_in *) &(iface->ifr_addr))->
++ sin_addr.s_addr;
++ return 0;
++}
++
++static int get_all_ifaces(struct ifreq **ifaces, int *count)
++{
++ int ifaces_size = 8 * sizeof(struct ifreq);
++ struct ifconf param;
++ int sock;
++ unsigned int i;
++
++ *ifaces = malloc(ifaces_size);
++ sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
++ if (sock <= 0)
++ return 0;
++ for (;;) {
++ param.ifc_len = ifaces_size;
++ param.ifc_req = *ifaces;
++ if (ioctl(sock, SIOCGIFCONF, &param))
++ goto err;
++ if (param.ifc_len < ifaces_size)
++ break;
++ free(*ifaces);
++ ifaces_size *= 2;
++ ifaces = malloc(ifaces_size);
++ }
++ *count = param.ifc_len / sizeof(struct ifreq);
++ close(sock);
++ return 1;
++ err:
++ close(sock);
++ return 0;
++}
++
++
++
+ int
+ main(int argc, char *argv[])
+ {
+@@ -189,6 +263,8 @@
+ warnx("using %s", nids_params.filename);
+ }
+ }
++
++ all_local_ipaddrs_chksum_disable();
+
+ nids_run();
+