On Wed, Sep 12, 2007 at 06:13:43PM +0200, Martin Zobel-Helas wrote: > I heared from Otavio, that there was a testing image was produced and > reported to work fine, so please go ahead.
Attached is the proposed patch updating cdebconf to version 0.114etch1. With these changes, on a usual installation on amd64, I have observed a 12 Mb difference in memory usage at the end of the process. Cheers, -- Jérémy Bobbio .''`. [EMAIL PROTECTED] : :Ⓐ : # apt-get install anarchism `. `'` `-
diff -Nru /tmp/xwalyA0i1H/cdebconf-0.114/debian/changelog /tmp/DNEzBXmMOx/cdebconf-0.114etch1/debian/changelog --- /tmp/xwalyA0i1H/cdebconf-0.114/debian/changelog 2007-02-27 16:40:12.000000000 +0100 +++ /tmp/DNEzBXmMOx/cdebconf-0.114etch1/debian/changelog 2007-09-07 13:18:17.000000000 +0200 @@ -1,3 +1,13 @@ +cdebconf (0.114etch1) etch; urgency=low + + [ Colin Watson ] + * Fix off-by-one error reading from confmodule (thanks, Baruch Even; + closes: #430108). + * Fix a bunch of reference-counting bugs and other memory leaks. + * Fix another (large!) memory leak: parsed RFC822 stanzas were never freed. + + -- Jérémy Bobbio <[EMAIL PROTECTED]> Fri, 07 Sep 2007 13:08:17 +0200 + cdebconf (0.114) unstable; urgency=low [ Attilio Fiandrotti ] diff -Nru /tmp/xwalyA0i1H/cdebconf-0.114/src/commands.c /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/commands.c --- /tmp/xwalyA0i1H/cdebconf-0.114/src/commands.c 2006-09-23 15:23:29.000000000 +0200 +++ /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/commands.c 2007-09-07 13:16:53.000000000 +0200 @@ -395,8 +395,9 @@ } question_owner_add(q, mod->owner); q->template = t; - template_ref(t); + /* steal reference from mod->templates->methods.get above */ mod->questions->methods.set(mod->questions, q); + question_deref(q); asprintf(&out, "%u", CMDSTATUS_SUCCESS); return out; } @@ -418,6 +419,7 @@ return out; } question_owner_delete(q, mod->owner); + question_deref(q); asprintf(&out, "%u", CMDSTATUS_SUCCESS); return out; @@ -458,6 +460,8 @@ asprintf(&out, "%u %s", CMDSTATUS_SUCCESS, value); free(value); + question_deref(q); + return out; } @@ -596,6 +600,7 @@ if (*argv[1]) question_owner_add(q, argv[1]); mod->questions->methods.set(mod->questions, q); + question_deref(q); t = t->next; } asprintf(&out, "%u OK", CMDSTATUS_SUCCESS); @@ -638,6 +643,7 @@ return out; } value = question_get_field(q, "", "description"); + question_deref(q); if (value == NULL) { asprintf(&out, "%u %s description field does not exist", @@ -681,6 +687,7 @@ return out; } value = question_get_field(q, "", "description"); + question_deref(q); if (value == NULL) { asprintf(&out, "%u %s description field does not exist", @@ -723,6 +730,7 @@ return out; } value = question_get_field(q, "", "description"); + question_deref(q); if (value == NULL) { asprintf(&out, "%u %s description field does not exist", @@ -774,6 +782,7 @@ return out; } mod->frontend->methods.info(mod->frontend, q); + question_deref(q); asprintf(&out, "%u OK", CMDSTATUS_SUCCESS); return out; @@ -814,9 +823,11 @@ } t->lset(t, NULL, item, value); mod->questions->methods.set(mod->questions, q); + question_deref(q); } else t->lset(t, NULL, item, value); + template_deref(t); asprintf(&out, "%u OK", CMDSTATUS_SUCCESS); return out; diff -Nru /tmp/xwalyA0i1H/cdebconf-0.114/src/configuration.c /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/configuration.c --- /tmp/xwalyA0i1H/cdebconf-0.114/src/configuration.c 2006-07-26 00:50:03.000000000 +0200 +++ /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/configuration.c 2007-09-07 13:09:29.000000000 +0200 @@ -181,6 +181,7 @@ unsigned int stackpos = 0; int curline = 0, i; int incomment = 0, inquote = 0; + int ret = DC_OK; linebuf[0] = 0; parenttag[0] = 0; @@ -309,7 +310,8 @@ if (termchar == '{' && linebuf[0] == 0) { INFO(INFO_ERROR, "Syntax error %s:%u: block starts with no name", filename, curline); - return DC_NOTOK; + ret = DC_NOTOK; + goto out; } if (linebuf[0] == 0) @@ -331,7 +333,8 @@ && strparsequoteword(&q, tag, sizeof(tag)) == 0) { INFO(INFO_ERROR, "Syntax error %s:%u: Malformed tag", filename, curline); - return DC_NOTOK; + ret = DC_NOTOK; + goto out; } /* parse off the value */ @@ -350,15 +353,18 @@ if (strlen(q) != 0) { INFO(INFO_ERROR, "Syntax error %s:%u: Extra junk after tag", filename, curline); - return DC_NOTOK; + ret = DC_NOTOK; + goto out; } if (termchar == '{') { /* 99, not 100. 100 gives possible off-by-one error */ - if (stackpos <= 99) + if (stackpos <= 99) { + DELETE(stack[stackpos]); stack[stackpos++] = strdup(parenttag); + } if (value[0] != 0) { strvacat(tag, sizeof(tag), @@ -423,8 +429,11 @@ strvacat(linebuf, sizeof(linebuf), " ", (char *) 0); strcat(linebuf, buf); } +out: fclose(infp); - return DC_OK; + for (i = 0; i < DIM(stack); i++) + DELETE(stack[i]); + return ret; } static void config_dump(struct configuration *cfg) @@ -489,6 +498,8 @@ while (top != 0 && top->next == 0) { next = top->parent; + DELETE(top->tag); + DELETE(top->value); DELETE(top); top = next; } @@ -496,8 +507,12 @@ if (top != 0) { next = top->next; + DELETE(top->tag); + DELETE(top->value); DELETE(top); top = next; } } + + DELETE(config); } diff -Nru /tmp/xwalyA0i1H/cdebconf-0.114/src/confmodule.c /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/confmodule.c --- /tmp/xwalyA0i1H/cdebconf-0.114/src/confmodule.c 2006-07-26 00:50:03.000000000 +0200 +++ /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/confmodule.c 2007-09-07 13:08:04.000000000 +0200 @@ -84,7 +84,7 @@ return DC_OK; } - ret = read(mod->infd, buf, sizeof(buf)); + ret = read(mod->infd, buf, sizeof(buf) - 1); if (ret < 0) { if (errno == EINTR) continue; diff -Nru /tmp/xwalyA0i1H/cdebconf-0.114/src/database.c /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/database.c --- /tmp/xwalyA0i1H/cdebconf-0.114/src/database.c 2006-07-26 00:50:03.000000000 +0200 +++ /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/database.c 2007-09-07 13:14:42.000000000 +0200 @@ -132,7 +132,7 @@ const char *modpath, *modname, *driver; if (instance != NULL) { - modname = strdup(instance); + modname = instance; } else { modname = cfg->get(cfg, "global::default::template", getenv("DEBCONF_TEMPLATE")); } @@ -161,7 +161,7 @@ db = NEW(struct template_db); memset(db, 0, sizeof(struct template_db)); db->handle = dlh; - db->modname = modname; + db->modname = STRDUP(modname); db->data = NULL; db->config = cfg; snprintf(db->configpath, sizeof(db->configpath), @@ -197,6 +197,7 @@ void template_db_delete(struct template_db *db) { db->methods.shutdown(db); + free(db->modname); dlclose(db->handle); DELETE(db); @@ -377,7 +378,7 @@ const char *modpath, *driver, *modname = NULL; if (instance != NULL) - modname = strdup(instance); + modname = instance; if (modname == NULL) modname = getenv("DEBCONF_CONFIG"); @@ -409,7 +410,7 @@ db = NEW(struct question_db); memset(db, 0, sizeof(struct question_db)); db->handle = dlh; - db->modname = modname; + db->modname = STRDUP(modname); db->data = NULL; db->config = cfg; db->tdb = tdb; @@ -449,6 +450,7 @@ void question_db_delete(struct question_db *db) { db->methods.shutdown(db); + free(db->modname); dlclose(db->handle); DELETE(db); diff -Nru /tmp/xwalyA0i1H/cdebconf-0.114/src/database.h /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/database.h --- /tmp/xwalyA0i1H/cdebconf-0.114/src/database.h 2006-07-26 00:50:03.000000000 +0200 +++ /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/database.h 2007-09-07 13:15:45.000000000 +0200 @@ -57,7 +57,7 @@ */ struct template_db { /** db module name */ - const char *modname; + char *modname; /** db module handle */ void *handle; /** configuration data */ @@ -76,7 +76,7 @@ */ struct question_db { /** db module name */ - const char *modname; + char *modname; /** db module handle */ void *handle; /** configuration data */ diff -Nru /tmp/xwalyA0i1H/cdebconf-0.114/src/debconf-loadtemplate.c /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/debconf-loadtemplate.c --- /tmp/xwalyA0i1H/cdebconf-0.114/src/debconf-loadtemplate.c 2006-09-23 15:23:29.000000000 +0200 +++ /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/debconf-loadtemplate.c 2007-09-07 13:09:29.000000000 +0200 @@ -122,6 +122,8 @@ if (tdb->methods.set(tdb, t) != DC_OK) INFO(INFO_ERROR, "Cannot add template %s", t->tag); } + if (oldt) + template_deref(oldt); q = qdb->methods.get(qdb, t->tag); if (q == NULL) @@ -140,7 +142,9 @@ if (qdb->methods.set(qdb, q) != DC_OK) INFO(INFO_ERROR, "Cannot add config %s", t->tag); question_deref(q); + oldt = t; t = t->next; + template_deref(oldt); } } diff -Nru /tmp/xwalyA0i1H/cdebconf-0.114/src/frontend.c /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/frontend.c --- /tmp/xwalyA0i1H/cdebconf-0.114/src/frontend.c 2006-07-26 00:50:03.000000000 +0200 +++ /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/frontend.c 2007-09-07 13:09:29.000000000 +0200 @@ -83,6 +83,7 @@ { question_deref(f->info); f->info = info; + question_ref(info); } static bool frontend_can_go_back(struct frontend *ui, struct question *q) @@ -232,10 +233,10 @@ obj->methods.shutdown(obj); if (obj->handle != NULL) dlclose(obj->handle); - DELETE(obj->questions); + frontend_clear(obj); DELETE(obj->capb); DELETE(obj->title); - DELETE(obj->info); + question_deref(obj->info); DELETE(obj->progress_title); DELETE(obj->plugin_path); DELETE(obj); diff -Nru /tmp/xwalyA0i1H/cdebconf-0.114/src/modules/db/http/http.c /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/modules/db/http/http.c --- /tmp/xwalyA0i1H/cdebconf-0.114/src/modules/db/http/http.c 2006-07-26 00:49:59.000000000 +0200 +++ /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/modules/db/http/http.c 2007-09-07 13:17:38.000000000 +0200 @@ -208,6 +208,22 @@ return DC_OK; } +static int http_template_shutdown(struct template_db *db) +{ + struct template_db_cache *dbdata = db->data; + struct template *t; + + while (dbdata->templates != NULL) + { + t = dbdata->templates; + dbdata->templates = dbdata->templates->next; + t->next = NULL; + template_deref(t); + } + + return DC_OK; +} + static int http_template_set(struct template_db *db, struct template *t) { return DC_NOTIMPL; @@ -280,6 +296,22 @@ return DC_OK; } +static int http_question_shutdown(struct question_db *db) +{ + struct question_db_cache *dbdata = db->data; + struct question *q; + + while (dbdata->questions != NULL) + { + q = dbdata->questions; + dbdata->questions = dbdata->questions->next; + q->next = q->prev = NULL; + question_deref(q); + } + + return DC_OK; +} + static int http_question_set(struct question_db *db, struct question *q) { return DC_NOTIMPL; @@ -327,7 +359,7 @@ if (name == NULL || *name == 0) { INFO(INFO_ERROR, "Read a stanza without a name"); - DELETE(header); + rfc822_header_destroy(header); continue; } @@ -342,7 +374,7 @@ tmp->template = template_new(name); db->tdb->methods.set(db->tdb, tmp->template); } - DELETE(header); + rfc822_header_destroy(header); } fclose(inf); @@ -363,6 +395,7 @@ struct template_db_module debconf_template_db_module = { initialize: http_template_initialize, + shutdown: http_template_shutdown, set: http_template_set, get: http_template_get, remove: http_template_remove, @@ -371,6 +404,7 @@ struct question_db_module debconf_question_db_module = { initialize: http_question_initialize, + shutdown: http_question_shutdown, set: http_question_set, get: http_question_get, disown: http_question_disown, diff -Nru /tmp/xwalyA0i1H/cdebconf-0.114/src/modules/db/rfc822db/rfc822db.c /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/modules/db/rfc822db/rfc822db.c --- /tmp/xwalyA0i1H/cdebconf-0.114/src/modules/db/rfc822db/rfc822db.c 2006-09-23 15:23:28.000000000 +0200 +++ /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/modules/db/rfc822db/rfc822db.c 2007-09-07 13:17:38.000000000 +0200 @@ -22,6 +22,9 @@ FILE *outf = NULL; +static struct template *rfc822db_template_get(struct template_db *db, + const char *ltag); + int nodetemplatecomp(const void *pa, const void *pb) { return strcmp(((struct template *)pa)->tag, ((struct template *)pb)->tag); @@ -125,6 +128,11 @@ return ret; } +void rfc822db_template_destroyitem(void *data) +{ + template_deref((struct template *) data); +} + /* templates */ static int rfc822db_template_initialize(struct template_db *db, struct configuration *cfg) { @@ -142,6 +150,20 @@ return DC_OK; } +static int rfc822db_template_shutdown(struct template_db *db) +{ + struct template_db_cache *dbdata = db->data; + if (dbdata == NULL) + return DC_OK; + if (dbdata->root) + tdestroy(dbdata->root, rfc822db_template_destroyitem); + if (dbdata->iterator) + di_slist_destroy(dbdata->iterator, rfc822db_template_destroyitem); + free(dbdata); + db->data = NULL; + return DC_OK; +} + /* * Function: rfc822db_template_load * Input: template database @@ -176,7 +198,7 @@ if (name == NULL) { INFO(INFO_ERROR, "Read a stanza without a name"); - DELETE(header); + rfc822_header_destroy(header); continue; } @@ -187,6 +209,7 @@ tmp->next = NULL; tsearch(tmp, &dbdata->root, nodetemplatecomp); + rfc822_header_destroy(header); } fclose(inf); @@ -356,11 +379,6 @@ template_dup(*(struct template **) nodep)); } -void rfc822db_template_destroyiterator(void *data) -{ - template_deref((struct template *) data); -} - static struct template *rfc822db_template_iterate(struct template_db *db, void **iter) { @@ -373,8 +391,7 @@ node = *(di_slist_node **) iter; if (node == NULL) { if (dbdata->iterator) - di_slist_destroy(dbdata->iterator, - rfc822db_template_destroyiterator); + di_slist_destroy(dbdata->iterator, rfc822db_template_destroyitem); dbdata->iterator = di_slist_alloc(); template_iterator = dbdata->iterator; /* non-thread-safe */ twalk(dbdata->root, rfc822db_template_makeiterator); @@ -384,7 +401,7 @@ *iter = node = node->next; if (node == NULL) { - di_slist_destroy(dbdata->iterator, rfc822db_template_destroyiterator); + di_slist_destroy(dbdata->iterator, rfc822db_template_destroyitem); dbdata->iterator = NULL; return NULL; } @@ -394,6 +411,11 @@ return t; } +void rfc822db_question_destroyitem(void *data) +{ + question_deref((struct question *) data); +} + /* config database */ static int rfc822db_question_initialize(struct question_db *db, struct configuration *cfg) { @@ -412,6 +434,20 @@ return DC_OK; } +static int rfc822db_question_shutdown(struct question_db *db) +{ + struct question_db_cache *dbdata = db->data; + if (dbdata == NULL) + return DC_OK; + if (dbdata->root) + tdestroy(dbdata->root, rfc822db_question_destroyitem); + if (dbdata->iterator) + di_slist_destroy(dbdata->iterator, rfc822db_question_destroyitem); + free(dbdata); + db->data = NULL; + return DC_OK; +} + /* * Function: rfc822db_question_load * Input: question database @@ -450,7 +486,7 @@ if (name == NULL || *name == 0) { INFO(INFO_ERROR, "Read a stanza without a name"); - DELETE(header); + rfc822_header_destroy(header); continue; } @@ -466,7 +502,7 @@ db->tdb->methods.set(db->tdb, tmp->template); } tsearch(tmp, &dbdata->root, nodequestioncomp); - DELETE(header); + rfc822_header_destroy(header); } fclose(inf); @@ -668,11 +704,6 @@ question_dup(*(struct question **) nodep)); } -void rfc822db_question_destroyiterator(void *data) -{ - question_deref((struct question *) data); -} - static struct question *rfc822db_question_iterate(struct question_db *db, void **iter) { @@ -685,8 +716,7 @@ node = *(di_slist_node **) iter; if (node == NULL) { if (dbdata->iterator) - di_slist_destroy(dbdata->iterator, - rfc822db_question_destroyiterator); + di_slist_destroy(dbdata->iterator, rfc822db_question_destroyitem); dbdata->iterator = di_slist_alloc(); question_iterator = dbdata->iterator; /* non-thread-safe */ twalk(dbdata->root, rfc822db_question_makeiterator); @@ -696,7 +726,7 @@ *iter = node = node->next; if (node == NULL) { - di_slist_destroy(dbdata->iterator, rfc822db_question_destroyiterator); + di_slist_destroy(dbdata->iterator, rfc822db_question_destroyitem); dbdata->iterator = NULL; return NULL; } @@ -708,6 +738,7 @@ struct template_db_module debconf_template_db_module = { initialize: rfc822db_template_initialize, + shutdown: rfc822db_template_shutdown, load: rfc822db_template_load, save: rfc822db_template_save, set: rfc822db_template_set, @@ -718,6 +749,7 @@ struct question_db_module debconf_question_db_module = { initialize: rfc822db_question_initialize, + shutdown: rfc822db_question_shutdown, load: rfc822db_question_load, save: rfc822db_question_save, set: rfc822db_question_set, diff -Nru /tmp/xwalyA0i1H/cdebconf-0.114/src/modules/db/stack/stack.c /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/modules/db/stack/stack.c --- /tmp/xwalyA0i1H/cdebconf-0.114/src/modules/db/stack/stack.c 2006-07-26 00:49:59.000000000 +0200 +++ /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/modules/db/stack/stack.c 2007-09-07 13:09:29.000000000 +0200 @@ -85,10 +85,8 @@ struct template_stack *tstack = (struct template_stack *)db->data; while (tstack) { struct template_stack *next = tstack->next; - if (tstack->db->methods.shutdown(tstack->db) != DC_OK) - return DC_NOTOK; - dlclose(tstack->db->handle); - DELETE(tstack->db); + template_db_delete(tstack->db); + DELETE(tstack); tstack = next; } return DC_OK; @@ -250,10 +248,8 @@ struct question_stack *qstack = (struct question_stack *)db->data; while (qstack) { struct question_stack *next = qstack->next; - if (qstack->db->methods.shutdown(qstack->db) != DC_OK) - return DC_NOTOK; - dlclose(qstack->db->handle); - DELETE(qstack->db); + question_db_delete(qstack->db); + DELETE(qstack); qstack = next; } return DC_OK; diff -Nru /tmp/xwalyA0i1H/cdebconf-0.114/src/modules/db/textdb/textdb.c /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/modules/db/textdb/textdb.c --- /tmp/xwalyA0i1H/cdebconf-0.114/src/modules/db/textdb/textdb.c 2006-09-23 15:23:28.000000000 +0200 +++ /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/modules/db/textdb/textdb.c 2007-09-07 13:09:29.000000000 +0200 @@ -114,6 +114,22 @@ return DC_OK; } +static int textdb_template_shutdown(struct template_db *db) +{ + struct template_db_cache *dbdata = db->data; + struct template *t; + + while (dbdata->templates != NULL) + { + t = dbdata->templates; + dbdata->templates = dbdata->templates->next; + t->next = NULL; + template_deref(t); + } + + return DC_OK; +} + static int textdb_template_set(struct template_db *db, struct template *t) { FILE *outf; @@ -275,6 +291,22 @@ return DC_OK; } +static int textdb_question_shutdown(struct question_db *db) +{ + struct question_db_cache *dbdata = db->data; + struct question *q; + + while (dbdata->questions != NULL) + { + q = dbdata->questions; + dbdata->questions = dbdata->questions->next; + q->next = q->prev = NULL; + question_deref(q); + } + + return DC_OK; +} + static int textdb_question_set(struct question_db *db, struct question *q) { FILE *outf; @@ -446,6 +478,7 @@ struct template_db_module debconf_template_db_module = { initialize: textdb_template_initialize, + shutdown: textdb_template_shutdown, set: textdb_template_set, get: textdb_template_get, remove: textdb_template_remove, @@ -454,6 +487,7 @@ struct question_db_module debconf_question_db_module = { initialize: textdb_question_initialize, + shutdown: textdb_question_shutdown, set: textdb_question_set, get: textdb_question_get, disown: textdb_question_disown, diff -Nru /tmp/xwalyA0i1H/cdebconf-0.114/src/question.c /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/question.c --- /tmp/xwalyA0i1H/cdebconf-0.114/src/question.c 2006-09-23 15:23:29.000000000 +0200 +++ /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/question.c 2007-09-07 13:09:29.000000000 +0200 @@ -22,8 +22,18 @@ void question_delete(struct question *question) { + struct questionowner **ownerp; + + DELETE(question->tag); if (question->template) template_deref(question->template); + for (ownerp = &question->owners; *ownerp != NULL;) + { + struct questionowner *currentp = *ownerp; + *ownerp = currentp->next; + DELETE(currentp->owner); + DELETE(currentp); + } if (question->priority != NULL) free(question->priority); DELETE(question); diff -Nru /tmp/xwalyA0i1H/cdebconf-0.114/src/rfc822.c /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/rfc822.c --- /tmp/xwalyA0i1H/cdebconf-0.114/src/rfc822.c 2006-07-26 00:50:03.000000000 +0200 +++ /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/rfc822.c 2007-09-07 13:17:38.000000000 +0200 @@ -102,3 +102,17 @@ /* 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 -Nru /tmp/xwalyA0i1H/cdebconf-0.114/src/rfc822.h /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/rfc822.h --- /tmp/xwalyA0i1H/cdebconf-0.114/src/rfc822.h 2006-07-26 00:50:03.000000000 +0200 +++ /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/rfc822.h 2007-09-07 13:17:38.000000000 +0200 @@ -9,4 +9,5 @@ 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 diff -Nru /tmp/xwalyA0i1H/cdebconf-0.114/src/template.c /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/template.c --- /tmp/xwalyA0i1H/cdebconf-0.114/src/template.c 2006-09-23 15:23:29.000000000 +0200 +++ /tmp/DNEzBXmMOx/cdebconf-0.114etch1/src/template.c 2007-09-07 13:09:29.000000000 +0200 @@ -134,6 +134,7 @@ while (p != NULL) { q = p->next; + DELETE(p->language); DELETE(p->defaultval); DELETE(p->choices); DELETE(p->indices);
signature.asc
Description: Digital signature