]> Pileus Git - ~andy/linux/blobdiff - tools/net/bpf_exp.y
bpf_exp: free duplicated labels at exit time
[~andy/linux] / tools / net / bpf_exp.y
index f524110643bbc2a9500fd7869002edac2683fe02..d15efc989ef500ac3f9998cf660d8e2bd22627e7 100644 (file)
@@ -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)