diff options
Diffstat (limited to 'network/dsniff/patches/15_checksum_libnids.patch')
-rw-r--r-- | network/dsniff/patches/15_checksum_libnids.patch | 98 |
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, ¶m)) ++ 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(); + |