From: Frantisek Sumsal Date: Sun, 26 Mar 2023 10:23:43 +0000 (+0200) Subject: userdb: fix a memory leak X-Git-Tag: v254-rc1~899^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d31706384d600a810b42e51519fa0136349d80df;p=thirdparty%2Fsystemd.git userdb: fix a memory leak [ 49.275617] testsuite-46.sh[1862]: ================================================================= [ 49.275870] testsuite-46.sh[1862]: ==1862==ERROR: LeakSanitizer: detected memory leaks [ 49.276039] testsuite-46.sh[1862]: Direct leak of 103 byte(s) in 14 object(s) allocated from: [ 49.276515] testsuite-46.sh[1862]: #0 0x7f4dbc07243b in strdup (/lib64/libasan.so.8+0x7243b) [ 49.276707] testsuite-46.sh[1862]: #1 0x7f4dbb3900d5 in free_and_strdup ../src/basic/string-util.c:952 [ 49.276931] testsuite-46.sh[1862]: #2 0x7f4dbb15c67d in json_dispatch_user_group_name ../src/shared/json.c:4699 [ 49.277134] testsuite-46.sh[1862]: #3 0x7f4dbb16da9b in json_dispatch ../src/shared/json.c:4395 [ 49.277352] testsuite-46.sh[1862]: #4 0x7f4dbb25b28e in userdb_on_query_reply ../src/shared/userdb.c:305 [ 49.277603] testsuite-46.sh[1862]: #5 0x7f4dbb2748b9 in varlink_dispatch_reply ../src/shared/varlink.c:760 [ 49.277766] testsuite-46.sh[1862]: #6 0x7f4dbb2748b9 in varlink_process ../src/shared/varlink.c:951 [ 49.277975] testsuite-46.sh[1862]: #7 0x7f4dbb27a001 in defer_callback ../src/shared/varlink.c:1897 [ 49.278197] testsuite-46.sh[1862]: #8 0x7f4dbb5d57dd in source_dispatch ../src/libsystemd/sd-event/sd-event.c:4191 [ 49.278421] testsuite-46.sh[1862]: #9 0x7f4dbb5d685d in sd_event_dispatch ../src/libsystemd/sd-event/sd-event.c:4780 [ 49.278675] testsuite-46.sh[1862]: #10 0x7f4dbb5d70bf in sd_event_run ../src/libsystemd/sd-event/sd-event.c:4841 [ 49.278873] testsuite-46.sh[1862]: #11 0x7f4dbb257e7c in userdb_process ../src/shared/userdb.c:591 [ 49.279048] testsuite-46.sh[1862]: #12 0x7f4dbb25f78f in membershipdb_iterator_get ../src/shared/userdb.c:1411 [ 49.279280] testsuite-46.sh[1862]: #13 0x7f4dbb23a98c in user_record_show ../src/shared/user-record-show.c:187 [ 49.279504] testsuite-46.sh[1862]: #14 0x404ae3 in show_user ../src/userdb/userdbctl.c:93 [ 49.279710] testsuite-46.sh[1862]: #15 0x40b4f5 in display_user ../src/userdb/userdbctl.c:418 [ 49.279961] testsuite-46.sh[1862]: #16 0x7f4dbb2804d2 in dispatch_verb ../src/shared/verbs.c:110 [ 49.280233] testsuite-46.sh[1862]: #17 0x40dcf3 in run ../src/userdb/userdbctl.c:1327 [ 49.280434] testsuite-46.sh[1862]: #18 0x40dcf3 in main ../src/userdb/userdbctl.c:1330 [ 49.280657] testsuite-46.sh[1862]: #19 0x7f4db9e4a50f in __libc_start_call_main (/lib64/libc.so.6+0x2750f) [ 49.280907] testsuite-46.sh[1862]: SUMMARY: AddressSanitizer: 103 byte(s) leaked in 14 allocation(s). --- diff --git a/src/shared/userdb.c b/src/shared/userdb.c index a77eff4407a..5e347e46293 100644 --- a/src/shared/userdb.c +++ b/src/shared/userdb.c @@ -146,6 +146,16 @@ static void user_group_data_release(struct user_group_data *d) { json_variant_unref(d->record); } +struct membership_data { + char *user_name; + char *group_name; +}; + +static void membership_data_done(struct membership_data *d) { + free(d->user_name); + free(d->group_name); +} + static int userdb_on_query_reply( Varlink *link, JsonVariant *parameters, @@ -288,10 +298,7 @@ static int userdb_on_query_reply( } case LOOKUP_MEMBERSHIP: { - struct membership_data { - const char *user_name; - const char *group_name; - } membership_data = {}; + _cleanup_(membership_data_done) struct membership_data membership_data = {}; static const JsonDispatch dispatch_table[] = { { "userName", JSON_VARIANT_STRING, json_dispatch_user_group_name, offsetof(struct membership_data, user_name), JSON_RELAX }, @@ -306,21 +313,8 @@ static int userdb_on_query_reply( if (r < 0) goto finish; - iterator->found_user_name = mfree(iterator->found_user_name); - iterator->found_group_name = mfree(iterator->found_group_name); - - iterator->found_user_name = strdup(membership_data.user_name); - if (!iterator->found_user_name) { - r = -ENOMEM; - goto finish; - } - - iterator->found_group_name = strdup(membership_data.group_name); - if (!iterator->found_group_name) { - r = -ENOMEM; - goto finish; - } - + iterator->found_user_name = TAKE_PTR(membership_data.user_name); + iterator->found_group_name = TAKE_PTR(membership_data.group_name); iterator->n_found++; if (FLAGS_SET(flags, VARLINK_REPLY_CONTINUES))