free uci_history entries properly
authorFelix Fietkau <nbd@openwrt.org>
Wed, 30 Jan 2008 02:18:56 +0000 (03:18 +0100)
committerFelix Fietkau <nbd@openwrt.org>
Wed, 30 Jan 2008 02:18:56 +0000 (03:18 +0100)
file.c
list.c

diff --git a/file.c b/file.c
index 0a9b180921d3c5ba28170969301197137ed81efe..cb76d97cc0e7d759ab2deeeaad86a5b72849743b 100644 (file)
--- a/file.c
+++ b/file.c
@@ -749,7 +749,7 @@ int uci_save(struct uci_context *ctx, struct uci_package *p)
                        fprintf(f, "\n");
                else
                        fprintf(f, "=%s\n", h->value);
-               uci_list_del(&e->list);
+               uci_free_history(h);
        }
 
 done:
diff --git a/list.c b/list.c
index bd70857abdb1af2bc5e71748d327f95099e30bf9..88f07bd05c07e9ebbfe6c3a5a42f31e724be71c2 100644 (file)
--- a/list.c
+++ b/list.c
@@ -173,7 +173,7 @@ uci_free_package(struct uci_package *p)
 }
 
 /* record a change that was done to a package */
-static inline void
+static void
 uci_add_history(struct uci_context *ctx, struct uci_package *p, int cmd, char *section, char *option, char *value)
 {
        struct uci_history *h;
@@ -197,6 +197,19 @@ uci_add_history(struct uci_context *ctx, struct uci_package *p, int cmd, char *s
        uci_list_add(&p->history, &h->e.list);
 }
 
+static void
+uci_free_history(struct uci_history *h)
+{
+       if (!h)
+               return;
+       if ((h->section != NULL) &&
+               (h->section != uci_dataptr(h))) {
+               free(h->section);
+               free(h->value);
+       }
+       uci_free_element(&h->e);
+}
+
 static struct uci_element *uci_lookup_list(struct uci_context *ctx, struct uci_list *list, const char *name)
 {
        struct uci_element *e;