From: Larry Moore Subject: [ PATCH ] sysutils/pftop To: OpenBSD Ports Date: Sat, 8 Aug 2026 11:02:56 +0800 Attached is a patch for pftop to resolve SIGSEGV's when certain filters are used. The SIGSEGV is induced when sysctl vm.malloc_conf=CFGJRS. The fix was taken from https://github.com/grembo/pftop/commit/04cde25f077b026802777c38e25550a06b0539eb. Tested on OpenBSD 7.9-current (amd64). diff -Nurp ../../../sysutils/pftop/Makefile ./Makefile --- ../../../sysutils/pftop/Makefile Thu Sep 28 01:16:32 2023 +++ ./Makefile Sat Aug 8 09:50:51 2026 @@ -3,7 +3,7 @@ COMMENT= curses-based real time state and rule display for pf DISTNAME= pftop-0.7 -REVISION= 19 +REVISION= 20 CATEGORIES= sysutils HOMEPAGE= http://www.eee.metu.edu.tr/~canacar/pftop/ diff -Nurp ../../../sysutils/pftop/patches/patch-pftop_c ./patches/patch-pftop_c --- ../../../sysutils/pftop/patches/patch-pftop_c Sat Mar 12 03:57:49 2022 +++ ./patches/patch-pftop_c Sat Aug 8 08:57:16 2026 @@ -1,5 +1,5 @@ ---- pftop.c.orig Wed Nov 7 07:36:46 2007 -+++ pftop.c Mon Apr 24 03:44:14 2017 +--- pftop.c.orig Wed Nov 7 15:36:46 2007 ++++ pftop.c Sat Aug 8 08:46:47 2026 @@ -55,6 +55,7 @@ #include #include @@ -223,7 +223,27 @@ int sort_sp_callback(const void *p1, const void *p2) { -@@ -865,7 +985,48 @@ tb_print_addr(struct pf_addr * addr, struct pf_addr * +@@ -670,6 +790,7 @@ void + alloc_buf(int ns) + { + int len; ++ int old_len = state_buf_len; + + if (ns < MIN_NUM_STATES) + ns = MIN_NUM_STATES; +@@ -686,6 +807,11 @@ alloc_buf(int ns) + state_cache == NULL) + err(1, "realloc"); + state_buf_len = len; ++ for (int i = old_len; i < len; i++) { ++ bzero(&state_buf[i], sizeof(pf_state_t)); ++ state_ord[i] = 0; ++ state_cache[i] = 0; ++ } + } + } + +@@ -865,7 +993,48 @@ tb_print_addr(struct pf_addr * addr, struct pf_addr * tbprintf("/%u", unmask(mask, af)); } } @@ -272,7 +292,7 @@ void print_fld_host(field_def *fld, pf_state_host_t * h, int af) { -@@ -889,6 +1050,7 @@ print_fld_host(field_def *fld, pf_state_host_t * h, in +@@ -889,6 +1058,7 @@ print_fld_host(field_def *fld, pf_state_host_t * h, in print_fld_tb(fld); } @@ -280,7 +300,7 @@ void print_fld_state(field_def *fld, unsigned int proto, -@@ -960,7 +1122,20 @@ print_state(pf_state_t * s, struct sc_ent * ent) +@@ -960,7 +1130,20 @@ print_state(pf_state_t * s, struct sc_ent * ent) else print_fld_uint(FLD_PROTO, s->proto); @@ -301,7 +321,7 @@ print_fld_host(FLD_SRC, &s->lan, s->af); print_fld_host(FLD_DEST, &s->ext, s->af); } else { -@@ -972,6 +1147,7 @@ print_state(pf_state_t * s, struct sc_ent * ent) +@@ -972,6 +1155,7 @@ print_state(pf_state_t * s, struct sc_ent * ent) (s->lan.port != s->gwy.port)) { print_fld_host(FLD_GW, &s->gwy, s->af); } @@ -309,7 +329,7 @@ if (s->direction == PF_OUT) print_fld_str(FLD_DIR, "Out"); -@@ -979,8 +1155,8 @@ print_state(pf_state_t * s, struct sc_ent * ent) +@@ -979,8 +1163,8 @@ print_state(pf_state_t * s, struct sc_ent * ent) print_fld_str(FLD_DIR, "In"); print_fld_state(FLD_STATE, s->proto, src->state, dst->state); @@ -320,7 +340,7 @@ #ifdef HAVE_INOUT_COUNT { u_int64_t sz = COUNTER(s->bytes[0]) + COUNTER(s->bytes[1]); -@@ -988,18 +1164,18 @@ print_state(pf_state_t * s, struct sc_ent * ent) +@@ -988,18 +1172,18 @@ print_state(pf_state_t * s, struct sc_ent * ent) print_fld_size(FLD_PKTS, COUNTER(s->packets[0]) + COUNTER(s->packets[1])); print_fld_size(FLD_BYTES, sz); @@ -344,7 +364,7 @@ #else #ifdef HAVE_RULE_NUMBER print_fld_uint(FLD_RULE, s->rule.nr); -@@ -1112,7 +1288,7 @@ read_anchor_rules(char *anchor) +@@ -1112,7 +1296,7 @@ read_anchor_rules(char *anchor) #ifdef HAVE_RULESETS struct anchor_name { @@ -353,7 +373,7 @@ struct anchor_name *next; u_int32_t ref; }; -@@ -1458,8 +1634,9 @@ tb_print_flags(u_int8_t f) +@@ -1458,8 +1642,9 @@ tb_print_flags(u_int8_t f) void print_rule(struct pf_rule *pr) { @@ -365,7 +385,7 @@ int numact = sizeof(actiontypes) / sizeof(char *); #ifdef HAVE_PF_ROUTE -@@ -1475,8 +1652,12 @@ print_rule(struct pf_rule *pr) +@@ -1475,8 +1660,12 @@ print_rule(struct pf_rule *pr) print_fld_str(FLD_LABEL, pr->label); #endif #ifdef HAVE_RULE_STATES @@ -378,7 +398,7 @@ #ifdef HAVE_INOUT_COUNT_RULES print_fld_size(FLD_PKTS, pr->packets[0] + pr->packets[1]); -@@ -1486,7 +1667,13 @@ print_rule(struct pf_rule *pr) +@@ -1486,7 +1675,13 @@ print_rule(struct pf_rule *pr) print_fld_size(FLD_BYTES, pr->bytes); #endif print_fld_uint(FLD_RULE, pr->nr); @@ -393,7 +413,7 @@ if (pr->quick) print_fld_str(FLD_QUICK, "Quick"); -@@ -1555,7 +1742,9 @@ print_rule(struct pf_rule *pr) +@@ -1555,7 +1750,9 @@ print_rule(struct pf_rule *pr) #ifdef HAVE_PF_ROUTE if (pr->rt > 0 && pr->rt < numroute) { tbprintf("%s ", routetypes[pr->rt]); @@ -403,7 +423,7 @@ tbprintf("... "); } #endif -@@ -1729,12 +1918,19 @@ pfctl_insert_altq_node(struct pf_altq_node **root, +@@ -1729,12 +1926,19 @@ pfctl_insert_altq_node(struct pf_altq_node **root, prev->next = node; } } @@ -429,7 +449,7 @@ } } -@@ -1743,10 +1939,11 @@ pfctl_update_qstats(struct pf_altq_node **root, int *i +@@ -1743,10 +1947,11 @@ pfctl_update_qstats(struct pf_altq_node **root, int *i { struct pf_altq_node *node; struct pfioc_altq pa; @@ -442,7 +462,7 @@ *inserts = 0; memset(&pa, 0, sizeof(pa)); -@@ -1757,13 +1954,15 @@ pfctl_update_qstats(struct pf_altq_node **root, int *i +@@ -1757,13 +1962,15 @@ pfctl_update_qstats(struct pf_altq_node **root, int *i strerror(errno)); return (-1); } @@ -459,7 +479,7 @@ } if (pa.altq.qid > 0) { pq.nr = nr; -@@ -1773,7 +1972,8 @@ pfctl_update_qstats(struct pf_altq_node **root, int *i +@@ -1773,7 +1980,8 @@ pfctl_update_qstats(struct pf_altq_node **root, int *i if (ioctl(pf_dev, DIOCGETQSTATS, &pq)) { msgprintf("Error Reading Queue (DIOCGETQSTATS): %s", strerror(errno)); @@ -469,7 +489,7 @@ } qstats.valid = 1; gettimeofday(&qstats.timestamp, NULL); -@@ -1794,7 +1994,10 @@ pfctl_update_qstats(struct pf_altq_node **root, int *i +@@ -1794,7 +2002,10 @@ pfctl_update_qstats(struct pf_altq_node **root, int *i else --num_queues; }