summaryrefslogtreecommitdiff
path: root/tools/net/bpf_exp.y
diff options
context:
space:
mode:
Diffstat (limited to 'tools/net/bpf_exp.y')
-rw-r--r--tools/net/bpf_exp.y27
1 files changed, 20 insertions, 7 deletions
diff --git a/tools/net/bpf_exp.y b/tools/net/bpf_exp.y
index f524110643bb..d15efc989ef5 100644
--- a/tools/net/bpf_exp.y
+++ b/tools/net/bpf_exp.y
@@ -40,8 +40,8 @@ extern void yyerror(const char *str);
extern void bpf_asm_compile(FILE *fp, bool cstyle);
static void bpf_set_curr_instr(uint16_t op, uint8_t jt, uint8_t jf, uint32_t k);
-static void bpf_set_curr_label(const char *label);
-static void bpf_set_jmp_label(const char *label, enum jmp_type type);
+static void bpf_set_curr_label(char *label);
+static void bpf_set_jmp_label(char *label, enum jmp_type type);
%}
@@ -573,7 +573,7 @@ txa
static int curr_instr = 0;
static struct sock_filter out[BPF_MAXINSNS];
-static const char **labels, **labels_jt, **labels_jf, **labels_k;
+static char **labels, **labels_jt, **labels_jf, **labels_k;
static void bpf_assert_max(void)
{
@@ -594,13 +594,13 @@ static void bpf_set_curr_instr(uint16_t code, uint8_t jt, uint8_t jf,
curr_instr++;
}
-static void bpf_set_curr_label(const char *label)
+static void bpf_set_curr_label(char *label)
{
bpf_assert_max();
- labels[curr_instr] = label;
+ labels[curr_instr] = label;
}
-static void bpf_set_jmp_label(const char *label, enum jmp_type type)
+static void bpf_set_jmp_label(char *label, enum jmp_type type)
{
bpf_assert_max();
switch (type) {
@@ -717,12 +717,25 @@ static void bpf_init(void)
assert(labels_k);
}
+static void bpf_destroy_labels(void)
+{
+ int i;
+
+ for (i = 0; i < curr_instr; i++) {
+ free(labels_jf[i]);
+ free(labels_jt[i]);
+ free(labels_k[i]);
+ free(labels[i]);
+ }
+}
+
static void bpf_destroy(void)
{
- free(labels);
+ bpf_destroy_labels();
free(labels_jt);
free(labels_jf);
free(labels_k);
+ free(labels);
}
void bpf_asm_compile(FILE *fp, bool cstyle)