commit 639f168aee1f202c1cb580154710588c5f18654e Author: cjwatson Commit: cjwatson Fix another (large!) memory leak: parsed RFC822 stanzas were never freed. git-svn-id: svn+ssh://svn.debian.org/svn/d-i/trunk@47689 48c42b26-1dd6-0310-b98f-a58d8bce7237 diff --git a/packages/cdebconf/src/modules/db/http/http.c b/packages/cdebconf/src/modules/db/http/http.c index a867daa..3c87f39 100644 --- a/packages/cdebconf/src/modules/db/http/http.c +++ b/packages/cdebconf/src/modules/db/http/http.c @@ -359,7 +359,7 @@ static struct question *http_question_get(struct question_db *db, if (name == NULL || *name == 0) { INFO(INFO_ERROR, "Read a stanza without a name"); - DELETE(header); + rfc822_header_destroy(header); continue; } @@ -374,7 +374,7 @@ static struct question *http_question_get(struct question_db *db, tmp->template = template_new(name); db->tdb->methods.set(db->tdb, tmp->template); } - DELETE(header); + rfc822_header_destroy(header); } fclose(inf); diff --git a/packages/cdebconf/src/modules/db/rfc822db/rfc822db.c b/packages/cdebconf/src/modules/db/rfc822db/rfc822db.c index 353b578..e042b3b 100644 --- a/packages/cdebconf/src/modules/db/rfc822db/rfc822db.c +++ b/packages/cdebconf/src/modules/db/rfc822db/rfc822db.c @@ -198,7 +198,7 @@ static int rfc822db_template_load(struct template_db *db) if (name == NULL) { INFO(INFO_ERROR, "Read a stanza without a name"); - DELETE(header); + rfc822_header_destroy(header); continue; } @@ -209,6 +209,7 @@ static int rfc822db_template_load(struct template_db *db) tmp->next = NULL; tsearch(tmp, &dbdata->root, nodetemplatecomp); + rfc822_header_destroy(header); } fclose(inf); @@ -485,7 +486,7 @@ static int rfc822db_question_load(struct question_db *db) if (name == NULL || *name == 0) { INFO(INFO_ERROR, "Read a stanza without a name"); - DELETE(header); + rfc822_header_destroy(header); continue; } @@ -501,7 +502,7 @@ static int rfc822db_question_load(struct question_db *db) db->tdb->methods.set(db->tdb, tmp->template); } tsearch(tmp, &dbdata->root, nodequestioncomp); - DELETE(header); + rfc822_header_destroy(header); } fclose(inf); diff --git a/packages/cdebconf/src/rfc822.c b/packages/cdebconf/src/rfc822.c index 43ef47f..0ce8ad9 100644 --- a/packages/cdebconf/src/rfc822.c +++ b/packages/cdebconf/src/rfc822.c @@ -102,3 +102,17 @@ char *rfc822_header_lookup(struct rfc822_header *list, const char* key) /* fprintf(stderr,"rfc822_header_lookup returning: '%s'\n", list->value);*/ return list->value; } + + +void rfc822_header_destroy(struct rfc822_header *list) +{ + struct rfc822_header *cur = list, *next; + + while (cur) { + free(cur->header); + free(cur->value); + next = cur->next; + DELETE(cur); + cur = next; + } +} diff --git a/packages/cdebconf/src/rfc822.h b/packages/cdebconf/src/rfc822.h index f721286..0d23ee7 100644 --- a/packages/cdebconf/src/rfc822.h +++ b/packages/cdebconf/src/rfc822.h @@ -9,4 +9,5 @@ struct rfc822_header { struct rfc822_header *rfc822_parse_stanza(FILE *file); char *rfc822_header_lookup(struct rfc822_header *list, const char* key); +void rfc822_header_destroy(struct rfc822_header *list); #endif