fsmonitor: fix hashmap memory leak in fsmonitor_run_daemon

The `state.cookies` hashmap is initialized during daemon startup but never freed during cleanup in the `done:` label of fsmonitor_run_daemon(). The cookie entries also have names allocated via strbuf_detach() that must be freed individually. Iterate the hashmap to free each cookie name, then call hashmap_clear_and_free() to release the entries and table. Signed-off-by: Paul Tarjan <github@paulisageek.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Paul Tarjan committed Apr 15, 2026 at 13:27 UTC 8b1d96554261aeef649bb3f36f9812a3c6e3f4da
1 file changed +9
builtin/fsmonitor--daemon.c
+9
@@ -1404,6 +1404,15 @@ static int fsmonitor_run_daemon(void)
1404 done:
1405 pthread_cond_destroy(&state.cookies_cond);
1406 pthread_mutex_destroy(&state.main_lock);
1407 + {
1408 + struct hashmap_iter iter;
1409 + struct fsmonitor_cookie_item *cookie;
1410 +
1411 + hashmap_for_each_entry(&state.cookies, &iter, cookie, entry)
1412 + free(cookie->name);
1413 + hashmap_clear_and_free(&state.cookies,
1414 + struct fsmonitor_cookie_item, entry);
1415 + }
1416 fsm_listen__dtor(&state);
1417 fsm_health__dtor(&state);
1418