Not sure about this, I guess if you're using 'network bulk add|del' you're supposed to know what you're doing and not shoot yourself in the foot, but here it goes:
echo | bgpctl network bulk del crashes bgpd. On 6.3 and current as of today at least. $ doas bgpd -dvf bgpd.conf startup rereading config route decision engine ready session engine ready myas = "64751" ktable_new: rdomain_0 for rtableid 0 listening on 127.0.0.1 SE reconfigured RDE reconfigured #### bgpd started, time to run 'echo | bgpctl network bulk del' fatal in RDE: pt_fill: unknown af peer closed imsg connection main: Lost connection to RDE peer closed imsg connection SE: Lost connection to parent session engine exiting kernel routing table 0 (Loc-RIB) decoupled ktable_destroy: freeing ktable Loc-RIB rtableid 0 waiting for children to terminate terminating This somewhat fixes the empty line issue, but it's still possible to crash with any other string not beeing an ip prefix. A better workaround would be parse prefixes beforehand, or maybe just don't be a moron and don't feed bgpctl with anything stupid. Index: bgpctl.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpctl/bgpctl.c,v retrieving revision 1.210 diff -u -p -r1.210 bgpctl.c --- bgpctl.c 29 Jul 2018 13:02:01 -0000 1.210 +++ bgpctl.c 6 Aug 2018 13:11:23 -0000 @@ -1978,6 +1978,9 @@ network_bulk(struct parse_result *res) /* Don't process commented entries */ if (strchr(b, '#') != NULL) break; + /* Don't process empty lines */ + if (strcmp(b, "\0") == 0) + break; bzero(&net, sizeof(net)); parse_prefix(b, strlen(b), &h, &len); net.prefix = h;