--- a/gencode.c +++ b/gencode.c @@ -439,20 +439,6 @@ pcap_compile_nopcap(int snaplen_arg, int } /* - * Clean up a "struct bpf_program" by freeing all the memory allocated - * in it. - */ -void -pcap_freecode(struct bpf_program *program) -{ - program->bf_len = 0; - if (program->bf_insns != NULL) { - free((char *)program->bf_insns); - program->bf_insns = NULL; - } -} - -/* * Backpatch the blocks in 'list' to 'target'. The 'sense' field indicates * which of the jt and jf fields has been resolved and which is a pointer * back to another unresolved block (or nil). At least one of the fields --- a/pcap.c +++ b/pcap.c @@ -698,6 +698,59 @@ static const u_char charmap[] = { (u_char)'\374', (u_char)'\375', (u_char)'\376', (u_char)'\377', }; +/* + * Clean up a "struct bpf_program" by freeing all the memory allocated + * in it. + */ +void +pcap_freecode(struct bpf_program *program) +{ + program->bf_len = 0; + if (program->bf_insns != NULL) { + free((char *)program->bf_insns); + program->bf_insns = NULL; + } +} + +/* + * Make a copy of a BPF program and put it in the "fcode" member of + * a "pcap_t". + * + * If we fail to allocate memory for the copy, fill in the "errbuf" + * member of the "pcap_t" with an error message, and return -1; + * otherwise, return 0. + */ +int +install_bpf_program(pcap_t *p, struct bpf_program *fp) +{ + size_t prog_size; + + /* + * Validate the program. + */ + if (!bpf_validate(fp->bf_insns, fp->bf_len)) { + snprintf(p->errbuf, sizeof(p->errbuf), + "BPF program is not valid"); + return (-1); + } + + /* + * Free up any already installed program. + */ + pcap_freecode(&p->fcode); + + prog_size = sizeof(*fp->bf_insns) * fp->bf_len; + p->fcode.bf_len = fp->bf_len; + p->fcode.bf_insns = (struct bpf_insn *)malloc(prog_size); + if (p->fcode.bf_insns == NULL) { + snprintf(p->errbuf, sizeof(p->errbuf), + "malloc: %s", pcap_strerror(errno)); + return (-1); + } + memcpy(p->fcode.bf_insns, fp->bf_insns, prog_size); + return (0); +} + int pcap_strcasecmp(const char *s1, const char *s2) { --- a/optimize.c +++ b/optimize.c @@ -2278,45 +2278,6 @@ icode_to_fcode(root, lenp) return fp; } -/* - * Make a copy of a BPF program and put it in the "fcode" member of - * a "pcap_t". - * - * If we fail to allocate memory for the copy, fill in the "errbuf" - * member of the "pcap_t" with an error message, and return -1; - * otherwise, return 0. - */ -int -install_bpf_program(pcap_t *p, struct bpf_program *fp) -{ - size_t prog_size; - - /* - * Validate the program. - */ - if (!bpf_validate(fp->bf_insns, fp->bf_len)) { - snprintf(p->errbuf, sizeof(p->errbuf), - "BPF program is not valid"); - return (-1); - } - - /* - * Free up any already installed program. - */ - pcap_freecode(&p->fcode); - - prog_size = sizeof(*fp->bf_insns) * fp->bf_len; - p->fcode.bf_len = fp->bf_len; - p->fcode.bf_insns = (struct bpf_insn *)malloc(prog_size); - if (p->fcode.bf_insns == NULL) { - snprintf(p->errbuf, sizeof(p->errbuf), - "malloc: %s", pcap_strerror(errno)); - return (-1); - } - memcpy(p->fcode.bf_insns, fp->bf_insns, prog_size); - return (0); -} - #ifdef BDEBUG static void opt_dump(root)