Free memory allocated in asn1c_read_file_dependencies() and asn1c_deps_makelist()
diff --git a/libasn1compiler/asn1c_fdeps.c b/libasn1compiler/asn1c_fdeps.c
index 231a47c..1ecc313 100644
--- a/libasn1compiler/asn1c_fdeps.c
+++ b/libasn1compiler/asn1c_fdeps.c
@@ -140,6 +140,16 @@
return d;
}
+static void
+asn1c_free_dep(asn1c_fdeps_t *d) {
+
+ if(d) {
+ if(d->filename) free(d->filename);
+ d->filename = 0;
+ free(d);
+ }
+}
+
static int
asn1c_dep_add(asn1c_fdeps_t *deps, asn1c_fdeps_t *d) {
int n;
@@ -180,7 +190,9 @@
if(deps->filename && deps->usage != FDEP_NOTUSED) {
d = asn1c_new_dep(deps->filename);
d->usage = deps->usage;
- asn1c_dep_add(dlist, d);
+ if(!asn1c_dep_add(dlist, d)) {
+ asn1c_free_dep(d);
+ }
}
for(i = 0; i < deps->el_count; i++) {
@@ -188,10 +200,28 @@
d = asn1c_deps_makelist(deps->elements[i]);
assert(!d->filename);
for(j = 0; j < d->el_count; j++) {
- asn1c_dep_add(dlist, d->elements[j]);
+ if(asn1c_dep_add(dlist, d->elements[j])) {
+ d->elements[j] = 0;
+ }
}
+ asn1c_deps_freelist(d);
}
return dlist;
}
+void
+asn1c_deps_freelist(asn1c_fdeps_t *deps) {
+ if(deps) {
+ int i;
+ if(deps->elements) {
+ for(i = 0; i < deps->el_count; i++) {
+ asn1c_deps_freelist(deps->elements[i]);
+ deps->elements[i] = 0;
+ }
+ free(deps->elements);
+ deps->elements = 0;
+ }
+ asn1c_free_dep(deps);
+ }
+}
diff --git a/libasn1compiler/asn1c_fdeps.h b/libasn1compiler/asn1c_fdeps.h
index 7986e34..cb5b12c 100644
--- a/libasn1compiler/asn1c_fdeps.h
+++ b/libasn1compiler/asn1c_fdeps.h
@@ -25,5 +25,6 @@
const char *data);
asn1c_fdeps_t *asn1c_deps_makelist(asn1c_fdeps_t *deps);
+void asn1c_deps_freelist(asn1c_fdeps_t *deps);
#endif /* ASN1C_FDEPS_H */
diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c
index f8348cc..4a422b5 100644
--- a/libasn1compiler/asn1c_save.c
+++ b/libasn1compiler/asn1c_save.c
@@ -149,6 +149,9 @@
safe_fprintf(mkf, "ASN_%s_%s+=%s\n",
what_class, what_kind, fname);
}
+
+ asn1c_deps_freelist(deps);
+ asn1c_deps_freelist(dlist);
}
if(need_to_generate_pdu_collection(arg)) {