]> git.ipfire.org Git - thirdparty/FORT-validator.git/commitdiff
Fix new RRDP memory leak
authorAlberto Leiva Popper <ydahhrk@gmail.com>
Fri, 10 Nov 2023 16:48:05 +0000 (10:48 -0600)
committerAlberto Leiva Popper <ydahhrk@gmail.com>
Fri, 10 Nov 2023 17:01:34 +0000 (11:01 -0600)
Introduced by 6d8081c992da9d677e3bd9cdf21bb63e604f0b4d.

src/rrdp.c
test/rrdp_test.c

index d91036787034f40d185649e9bd084acb43d19483..31f464ea482659ca3f11fac3ccc7d04eb237540a 100644 (file)
@@ -101,7 +101,16 @@ BN_create(void)
 }
 
 static void
-rrdp_session_cleanup(struct rrdp_session *meta)
+serial_cleanup(struct rrdp_serial *serial)
+{
+       BN_free(serial->num);
+       serial->num = NULL;
+       xmlFree(serial->str);
+       serial->str = NULL;
+}
+
+static void
+session_cleanup(struct rrdp_session *meta)
 {
        xmlFree(meta->session_id);
        BN_free(meta->serial.num);
@@ -115,6 +124,13 @@ metadata_cleanup(struct file_metadata *meta)
        uri_refput(meta->uri);
 }
 
+static void
+notification_delta_cleanup(struct notification_delta *delta)
+{
+       serial_cleanup(&delta->serial);
+       metadata_cleanup(&delta->meta);
+}
+
 static void
 update_notification_init(struct update_notification *notif,
     struct rpki_uri *uri)
@@ -125,18 +141,12 @@ update_notification_init(struct update_notification *notif,
        notif->uri = uri_refget(uri);
 }
 
-static void
-notification_delta_destroy(struct notification_delta *delta)
-{
-       metadata_cleanup(&delta->meta);
-}
-
 static void
 update_notification_cleanup(struct update_notification *file)
 {
        metadata_cleanup(&file->snapshot);
-       rrdp_session_cleanup(&file->session);
-       notification_deltas_cleanup(&file->deltas, notification_delta_destroy);
+       session_cleanup(&file->session);
+       notification_deltas_cleanup(&file->deltas, notification_delta_cleanup);
        uri_refput(file->uri);
 }
 
@@ -365,15 +375,6 @@ validate_version(xmlTextReaderPtr reader, unsigned long expected)
        return 0;
 }
 
-static void
-serial_cleanup(struct rrdp_serial *serial)
-{
-       BN_free(serial->num);
-       serial->num = NULL;
-       xmlFree(serial->str);
-       serial->str = NULL;
-}
-
 static int
 parse_serial(xmlTextReaderPtr reader, struct rrdp_serial *serial)
 {
@@ -452,7 +453,7 @@ validate_session(xmlTextReaderPtr reader, struct rrdp_session *expected)
        }
 
 end:
-       rrdp_session_cleanup(&actual);
+       session_cleanup(&actual);
        return error;
 }
 
@@ -1044,7 +1045,7 @@ rrdp_update(struct rpki_uri *uri)
 revert_notification:
        update_notification_cleanup(&new);
 end:
-       rrdp_session_cleanup(&old);
+       session_cleanup(&old);
        fnstack_pop();
        return error;
 }
index 9fbecd35421c5272bb9e92f83188c7a4dda22428..abf88653baac088f874ac21a50db145d21bd010e 100644 (file)
@@ -98,14 +98,14 @@ START_TEST(test_sort_deltas)
        ck_assert_int_eq(-EINVAL, __sort_deltas(&deltas, 4, "4"));
        ck_assert_int_eq(-EINVAL, __sort_deltas(&deltas, 2, "2"));
 
-       notification_deltas_cleanup(&deltas, notification_delta_destroy);
+       notification_deltas_cleanup(&deltas, notification_delta_cleanup);
        notification_deltas_init(&deltas);
 
        add_serials(&deltas, 3, 0, 1, 2, END);
        ck_assert_int_eq(0, __sort_deltas(&deltas, 3, "3"));
        validate_serials(&deltas, 0, 1, 2, 3, END);
 
-       notification_deltas_cleanup(&deltas, notification_delta_destroy);
+       notification_deltas_cleanup(&deltas, notification_delta_cleanup);
        notification_deltas_init(&deltas);
 
        add_serials(&deltas, 4, 3, 2, 1, 0, END);
@@ -115,7 +115,7 @@ START_TEST(test_sort_deltas)
        ck_assert_int_eq(-EINVAL, __sort_deltas(&deltas, 5, "5"));
        ck_assert_int_eq(-EINVAL, __sort_deltas(&deltas, 3, "3"));
 
-       notification_deltas_cleanup(&deltas, notification_delta_destroy);
+       notification_deltas_cleanup(&deltas, notification_delta_cleanup);
 }
 END_TEST