diff options
author | Travis Kemen <thepeople@openwrt.org> | 2010-03-08 14:21:32 +0000 |
---|---|---|
committer | Travis Kemen <thepeople@openwrt.org> | 2010-03-08 14:21:32 +0000 |
commit | b9ef0e4fd0a07ac89eeb5da5137970ef30cf5f6d (patch) | |
tree | a32dbecd989cd9b5d3fd7dfa3c056bfe903d37f7 /package/libpcap/patches/201-space_optimization.patch | |
parent | ce81c03f0e47881ef957885f9e9eeb0b2d19ed1e (diff) | |
download | upstream-b9ef0e4fd0a07ac89eeb5da5137970ef30cf5f6d.tar.gz upstream-b9ef0e4fd0a07ac89eeb5da5137970ef30cf5f6d.tar.bz2 upstream-b9ef0e4fd0a07ac89eeb5da5137970ef30cf5f6d.zip |
fix missing parts of r19997.
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@20057 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/libpcap/patches/201-space_optimization.patch')
-rw-r--r-- | package/libpcap/patches/201-space_optimization.patch | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/package/libpcap/patches/201-space_optimization.patch b/package/libpcap/patches/201-space_optimization.patch new file mode 100644 index 0000000000..29c293b623 --- /dev/null +++ b/package/libpcap/patches/201-space_optimization.patch @@ -0,0 +1,133 @@ +--- 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) |