From: Alberto Leiva Popper Date: Fri, 10 Nov 2023 16:48:05 +0000 (-0600) Subject: Fix new RRDP memory leak X-Git-Tag: 1.6.0~20 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=df05d903ddef411fa2f62ca0ca5ed7268e8bbddb;p=thirdparty%2FFORT-validator.git Fix new RRDP memory leak Introduced by 6d8081c992da9d677e3bd9cdf21bb63e604f0b4d. --- diff --git a/src/rrdp.c b/src/rrdp.c index d9103678..31f464ea 100644 --- a/src/rrdp.c +++ b/src/rrdp.c @@ -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; } diff --git a/test/rrdp_test.c b/test/rrdp_test.c index 9fbecd35..abf88653 100644 --- a/test/rrdp_test.c +++ b/test/rrdp_test.c @@ -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