From 6321f828d53e99141642b7d6353c79f1ca762523 Mon Sep 17 00:00:00 2001 From: Marius Halden Date: Tue, 12 Jan 2016 02:38:25 +0100 Subject: Update datastructures and remove addr8 --- data_structures | 2 - spamd-setup.patch | 132 +++++++++++++++++++++++++----------------------------- 2 files changed, 61 insertions(+), 73 deletions(-) diff --git a/data_structures b/data_structures index ea1f74b..369e582 100644 --- a/data_structures +++ b/data_structures @@ -2,10 +2,8 @@ struct sda6 { union { struct in6_addr addr; - u_int8_t addr8[16]; // To be removed (I hope) u_int32_t addr32[4]; } _sda6; -#define addr8 _sda6.addr8 #define addr32 _sda6.addr32 }; diff --git a/spamd-setup.patch b/spamd-setup.patch index 403fc19..a791b49 100644 --- a/spamd-setup.patch +++ b/spamd-setup.patch @@ -5,7 +5,7 @@ RCS file: /cvs/src/libexec/spamd-setup/spamd-setup.c,v retrieving revision 1.47 diff -u -p -u -r1.47 spamd-setup.c --- spamd-setup.c 12 Dec 2015 20:09:28 -0000 1.47 -+++ spamd-setup.c 10 Jan 2016 22:08:43 -0000 ++++ spamd-setup.c 12 Jan 2016 01:37:04 -0000 @@ -30,6 +30,7 @@ #include #include @@ -14,39 +14,41 @@ diff -u -p -u -r1.47 spamd-setup.c #include #include #include -@@ -42,13 +43,29 @@ +@@ -42,22 +43,40 @@ #define PATH_SPAMD_CONF "/etc/mail/spamd.conf" #define SPAMD_ARG_MAX 256 /* max # of args to an exec */ -+struct ipv6 { ++struct sda6 { + union { -+ u_int8_t addr8[16]; -+ u_int16_t addr16[8]; -+ u_int32_t addr32[4]; -+ }; ++ struct in6_addr addr; ++ u_int32_t addr32[4]; ++ } _sda6; ++#define addr32 _sda6.addr32 +}; + struct cidr { - u_int32_t addr; -+ //sa_family_t ai_family; + union { + u_int32_t addr4; -+ struct ipv6 addr6; -+ }; ++ struct sda6 addr6; ++ } _addr; u_int8_t bits; }; struct bl { - u_int32_t addr; -+ //sa_family_t ai_family; + union { + u_int32_t addr4; -+ struct ipv6 addr6; -+ }; ++ struct sda6 addr6; ++ } _addr; int8_t b; int8_t w; }; -@@ -58,6 +75,8 @@ struct blacklist { ++#define addr4 _addr.addr4 ++#define addr6 _addr.addr6 + + struct blacklist { + char *name; char *message; struct bl *bl; size_t blc, bls; @@ -59,10 +61,10 @@ diff -u -p -u -r1.47 spamd-setup.c u_int8_t maxdiff(u_int32_t, u_int32_t); struct cidr *range2cidrlist(struct cidr *, u_int *, u_int *, u_int32_t, u_int32_t); -+struct cidr *range2cidrlist6(struct cidr *, u_int *, u_int *, struct ipv6 *, -+ struct ipv6 *); ++struct cidr *range2cidrlist6(struct cidr *, u_int *, u_int *, struct sda6 *, ++ struct sda6 *); void cidr2range(struct cidr, u_int32_t *, u_int32_t *); -+void cidr2range6(struct cidr, struct ipv6 *, struct ipv6 *); ++void cidr2range6(struct cidr, struct sda6 *, struct sda6 *); char *atop(u_int32_t); -int parse_netblock(char *, struct bl *, struct bl *, int); +int parse_netblock(char *, struct bl *, struct bl *, struct bl*, @@ -75,7 +77,7 @@ diff -u -p -u -r1.47 spamd-setup.c -struct bl *add_blacklist(struct bl *, size_t *, size_t *, gzFile, int); +int add_blacklist(struct bl **, size_t *, size_t *, struct bl **, + size_t *, size_t *, gzFile, int); -+int cmp_ipv6(const struct ipv6 *, const struct ipv6 *); ++int cmp_ipv6(const struct sda6 *, const struct sda6 *); int cmpbl(const void *, const void *); -struct cidr *collapse_blacklist(struct bl *, size_t, u_int *); -int configure_spamd(u_short, char *, char *, struct cidr *, u_int); @@ -98,7 +100,7 @@ diff -u -p -u -r1.47 spamd-setup.c +#define MINIMUM(a,b) (((a)<(b))?(a):(b)) + +void -+ipv6_add(struct ipv6 *addr, u_int8_t num) ++ipv6_add(struct sda6 *addr, u_int8_t num) +{ + int i; + u_int8_t carry; @@ -120,7 +122,7 @@ diff -u -p -u -r1.47 spamd-setup.c +} + +void -+ipv6_add2(struct ipv6 *addr, struct ipv6 *src) ++ipv6_add2(struct sda6 *addr, struct sda6 *src) +{ + int i, j; + u_int8_t carry; @@ -146,7 +148,7 @@ diff -u -p -u -r1.47 spamd-setup.c +} + +void -+ipv6_sub(struct ipv6 *addr, u_int8_t num) ++ipv6_sub(struct sda6 *addr, u_int8_t num) +{ + int i; + u_int8_t carry; @@ -174,11 +176,11 @@ diff -u -p -u -r1.47 spamd-setup.c } +void -+imask6(struct ipv6 *m, u_int8_t b) ++imask6(struct sda6 *m, u_int8_t b) +{ + int i; + u_int8_t tmp; -+ memset(m, 0, sizeof(struct ipv6)); ++ memset(m, 0, sizeof(struct sda6)); + + for (i = 0; i < 4; i++) { + if (b == 0) @@ -198,9 +200,9 @@ diff -u -p -u -r1.47 spamd-setup.c } u_int8_t -+maxblock6(struct ipv6 *addr, u_int8_t bits) ++maxblock6(struct sda6 *addr, u_int8_t bits) +{ -+ struct ipv6 m; ++ struct sda6 m; + int i; + + while (bits > 0) { @@ -226,10 +228,10 @@ diff -u -p -u -r1.47 spamd-setup.c } +u_int8_t -+maxdiff6(struct ipv6 *a, struct ipv6 *b) ++maxdiff6(struct sda6 *a, struct sda6 *b) +{ + u_int8_t bits = 0; -+ struct ipv6 m, tmp; ++ struct sda6 m, tmp; + int i; + + memcpy(&tmp, b, sizeof(tmp)); @@ -264,12 +266,12 @@ diff -u -p -u -r1.47 spamd-setup.c } +struct cidr * -+range2cidrlist6(struct cidr *list, u_int *cli, u_int *cls, struct ipv6 *start, -+ struct ipv6 *end) ++range2cidrlist6(struct cidr *list, u_int *cli, u_int *cls, struct sda6 *start, ++ struct sda6 *end) +{ + u_int8_t maxsize, diff, btmp; + struct cidr *tmp; -+ struct ipv6 mask; ++ struct sda6 mask; + int i; + + while (cmp_ipv6(end, start) >= 0) { @@ -293,14 +295,14 @@ diff -u -p -u -r1.47 spamd-setup.c + maxsize = 128 - maxsize; + + memset(&mask, 0, sizeof(mask)); -+ for (i = 15; i >= 0; i--) { -+ btmp = MINIMUM(maxsize, 8); -+ maxsize -= btmp; -+ -+ mask.addr8[i] = ((1 << btmp) - 1); -+ ++ for (i = 3; i >= 0; i--) { + if (maxsize == 0) + break; ++ ++ btmp = MINIMUM(maxsize, 32); ++ maxsize -= btmp; ++ ++ mask.addr32[i] = htonl(0xffffffffU >> (32 - btmp)); + } + + ipv6_add(&mask, 1); @@ -320,23 +322,23 @@ diff -u -p -u -r1.47 spamd-setup.c +} + +void -+cidr2range6(struct cidr cidr, struct ipv6 *start, struct ipv6 *end) ++cidr2range6(struct cidr cidr, struct sda6 *start, struct sda6 *end) +{ + int i; + u_int8_t tmp, bits = 128 - cidr.bits; -+ struct ipv6 mask; ++ struct sda6 mask; + memset(&mask, 0, sizeof(mask)); + + memcpy(start, &cidr.addr6, sizeof(cidr.addr6)); + memcpy(end, &cidr.addr6, sizeof(cidr.addr6)); + -+ for (i = 15; i >= 0; i--) { ++ for (i = 3; i >= 0; i--) { + if (bits == 0) + break; + -+ tmp = MINIMUM(bits, 8); ++ tmp = MINIMUM(bits, 32); + bits -= tmp; -+ mask.addr8[i] = ((1 << tmp) - 1); ++ mask.addr32[i] = htonl(0xffffffffU >> (32 - tmp)); + } + + ipv6_add2(end, &mask); @@ -359,7 +361,7 @@ diff -u -p -u -r1.47 spamd-setup.c /* skip leading spaces */ while (*buf == ' ') -@@ -189,56 +422,130 @@ parse_netblock(char *buf, struct bl *sta +@@ -189,56 +422,118 @@ parse_netblock(char *buf, struct bl *sta if (*buf == '#') return (0); /* otherwise, look for a netblock of some sort */ @@ -375,7 +377,6 @@ diff -u -p -u -r1.47 spamd-setup.c + sizeof(c.addr4)) == -1) return (0); - c.addr = ntohl(c.addr); -+ //c.ai_family = AF_INET; + c.addr4 = ntohl(c.addr4); if (maskbits > 32) return (0); @@ -383,7 +384,6 @@ diff -u -p -u -r1.47 spamd-setup.c - cidr2range(c, &start->addr, &end->addr); - end->addr += 1; + cidr2range(c, &start->addr4, &end->addr4); -+ //start->ai_family = end->ai_family = AF_INET; + end->addr4 += 1; + + ret = AF_INET; @@ -394,12 +394,10 @@ diff -u -p -u -r1.47 spamd-setup.c + if (inet_net_pton(AF_INET6, astring, &c.addr6, + sizeof(c.addr6)) == -1) + return (0); -+ //c.ai_family = AF_INET6; + if (maskbits > 128) + return (0); + c.bits = maskbits; + cidr2range6(c, &start6->addr6, &end6->addr6); -+ //start6->ai_family = end6->ai_family = AF_INET6; + ipv6_add(&end6->addr6, 1); + + ret = AF_INET6; @@ -421,12 +419,10 @@ diff -u -p -u -r1.47 spamd-setup.c + sizeof(start->addr4)) == -1) return (0); - end->addr = ntohl(end->addr) + 1; -+ //start->ai_family = AF_INET; + start->addr4 = ntohl(start->addr4); + if (inet_net_pton(AF_INET, astring2, &end->addr4, + sizeof(end->addr4)) == -1) + return (0); -+ //end->ai_family = AF_INET; + end->addr4 = ntohl(end->addr4) + 1; if (start > end) return (0); @@ -440,11 +436,9 @@ diff -u -p -u -r1.47 spamd-setup.c + if (inet_net_pton(AF_INET6, astring, &start6->addr6, + sizeof(start6->addr6)) == -1) + return (0); -+ //start6->ai_family = AF_INET6; + if (inet_net_pton(AF_INET6, astring2, &end6->addr6, + sizeof(end6->addr6)) == -1) + return (0); -+ //end6->ai_family = AF_INET6; + ipv6_add(&end6->addr6, 1); + if (start6 > end6) + return (0); @@ -462,8 +456,6 @@ diff -u -p -u -r1.47 spamd-setup.c return (0); - start->addr = ntohl(start->addr); - end->addr = start->addr + 1; -+ //start->ai_family = AF_INET; -+ //end->ai_family = AF_INET; + start->addr4 = ntohl(start->addr4); + end->addr4 = start->addr4 + 1; + @@ -474,8 +466,6 @@ diff -u -p -u -r1.47 spamd-setup.c + if (inet_net_pton(AF_INET6, astring, &start6->addr6, + sizeof(start6->addr6)) == -1) + return (0); -+ //start6->ai_family = AF_INET6; -+ //end6->ai_family = AF_INET6; + memcpy(&end6->addr6, &start6->addr6, + sizeof(start6->addr6)); + @@ -523,7 +513,7 @@ diff -u -p -u -r1.47 spamd-setup.c } int -@@ -445,8 +752,9 @@ do_message(FILE *sdc, char *msg) +@@ -445,8 +740,9 @@ do_message(FILE *sdc, char *msg) } /* retrieve a list from fd. add to blacklist bl */ @@ -535,7 +525,7 @@ diff -u -p -u -r1.47 spamd-setup.c { int i, n, start, bu = 0, bs = 0, serrno = 0; char *buf = NULL, *tmp; -@@ -481,30 +789,55 @@ add_blacklist(struct bl *bl, size_t *blc +@@ -481,30 +777,55 @@ add_blacklist(struct bl *bl, size_t *blc /* we assume that there is an IP for every 14 bytes */ if (*blc + bu / 7 >= *bls) { *bls += bu / 7; @@ -597,7 +587,7 @@ diff -u -p -u -r1.47 spamd-setup.c start = i + 1; } } -@@ -512,29 +845,83 @@ add_blacklist(struct bl *bl, size_t *blc +@@ -512,29 +833,83 @@ add_blacklist(struct bl *bl, size_t *blc errno = EIO; bldone: free(buf); @@ -611,7 +601,7 @@ diff -u -p -u -r1.47 spamd-setup.c +} + +int -+cmp_ipv6(const struct ipv6 *a, const struct ipv6 *b) ++cmp_ipv6(const struct sda6 *a, const struct sda6 *b) +{ + int i; + u_int32_t atmp, btmp; @@ -643,7 +633,7 @@ diff -u -p -u -r1.47 spamd-setup.c +int +cmpbl6(const void *a, const void *b) +{ -+ struct ipv6 *addr1, *addr2; ++ struct sda6 *addr1, *addr2; + + addr1 = &((struct bl *)a)->addr6; + addr2 = &((struct bl *)b)->addr6; @@ -686,7 +676,7 @@ diff -u -p -u -r1.47 spamd-setup.c { int bs = 0, ws = 0, state=0; u_int cli, cls, i; -@@ -558,13 +945,13 @@ collapse_blacklist(struct bl *bl, size_t +@@ -558,13 +933,13 @@ collapse_blacklist(struct bl *bl, size_t qsort(bl, blc, sizeof(struct bl), cmpbl); for (i = 0; i < blc;) { laststate = state; @@ -702,7 +692,7 @@ diff -u -p -u -r1.47 spamd-setup.c if (state == 1 && bs == 0) state = 0; else if (state == 0 && bs > 0) -@@ -581,18 +968,73 @@ collapse_blacklist(struct bl *bl, size_t +@@ -581,18 +956,73 @@ collapse_blacklist(struct bl *bl, size_t } laststate = state; } @@ -719,7 +709,7 @@ diff -u -p -u -r1.47 spamd-setup.c + u_int cli, cls, i; + struct cidr *cl; + int laststate; -+ struct ipv6 bstart, addr; ++ struct sda6 bstart, addr; + + memset(&bstart, 0, sizeof(bstart)); + @@ -779,7 +769,7 @@ diff -u -p -u -r1.47 spamd-setup.c s = rresvport(&lport); if (s == -1) -@@ -612,10 +1054,14 @@ configure_spamd(u_short dport, char *nam +@@ -612,10 +1042,14 @@ configure_spamd(u_short dport, char *nam fputs(name, sdc); do_message(sdc, message); fprintf(sdc, ";inet;%u", count); @@ -798,7 +788,7 @@ diff -u -p -u -r1.47 spamd-setup.c } fputc('\n', sdc); fclose(sdc); -@@ -625,12 +1071,14 @@ configure_spamd(u_short dport, char *nam +@@ -625,12 +1059,14 @@ configure_spamd(u_short dport, char *nam int @@ -815,7 +805,7 @@ diff -u -p -u -r1.47 spamd-setup.c if (pf == NULL) { if (pipe(pdes) != 0) -@@ -659,10 +1107,13 @@ configure_pf(struct cidr *blacklists) +@@ -659,10 +1095,13 @@ configure_pf(struct cidr *blacklists) return (-1); } } @@ -833,7 +823,7 @@ diff -u -p -u -r1.47 spamd-setup.c } return (0); } -@@ -672,9 +1123,10 @@ getlist(char ** db_array, char *name, st +@@ -672,9 +1111,10 @@ getlist(char ** db_array, char *name, st struct blacklist *blistnew) { char *buf, *method, *file, *message; @@ -846,7 +836,7 @@ diff -u -p -u -r1.47 spamd-setup.c gzFile gzf; if (cgetent(&buf, db_array, name) != 0) -@@ -686,12 +1138,18 @@ getlist(char ** db_array, char *name, st +@@ -686,12 +1126,18 @@ getlist(char ** db_array, char *name, st blc = blistnew->blc; bls = blistnew->bls; bl = blistnew->bl; @@ -865,7 +855,7 @@ diff -u -p -u -r1.47 spamd-setup.c } else errx(1, "Must have \"black\" or \"white\" in %s", name); -@@ -730,10 +1188,10 @@ getlist(char ** db_array, char *name, st +@@ -730,10 +1176,10 @@ getlist(char ** db_array, char *name, st errx(1, "gzdopen"); } free(buf); @@ -878,7 +868,7 @@ diff -u -p -u -r1.47 spamd-setup.c errno = serror; warn("Could not add %slist %s", black ? "black" : "white", name); -@@ -742,13 +1200,16 @@ getlist(char ** db_array, char *name, st +@@ -742,13 +1188,16 @@ getlist(char ** db_array, char *name, st if (black) { if (debug) fprintf(stderr, "blacklist %s %zu entries\n", @@ -896,7 +886,7 @@ diff -u -p -u -r1.47 spamd-setup.c } else { /* whitelist applied to last active blacklist */ if (debug) -@@ -757,6 +1218,9 @@ getlist(char ** db_array, char *name, st +@@ -757,6 +1206,9 @@ getlist(char ** db_array, char *name, st blist->bl = bl; blist->blc = blc; blist->bls = bls; @@ -906,7 +896,7 @@ diff -u -p -u -r1.47 spamd-setup.c } return (black); } -@@ -764,22 +1228,24 @@ getlist(char ** db_array, char *name, st +@@ -764,22 +1216,24 @@ getlist(char ** db_array, char *name, st void send_blacklist(struct blacklist *blist, in_port_t port) { -- cgit v1.2.3