diff --git a/pkg/noun/manage.c b/pkg/noun/manage.c index 0a6d37eb1a..cf02e68fb0 100644 --- a/pkg/noun/manage.c +++ b/pkg/noun/manage.c @@ -1815,6 +1815,16 @@ u3m_soft_esc(u3_noun ref, u3_noun sam) return pro; } +void +u3m_mark_mute(void) +{ + u3m_quac** arr_u = u3m_mark(); + for (c3_w i_w = 0; arr_u[i_w]; i_w++) { + u3a_quac_free(arr_u[i_w]); + } + c3_free(arr_u); +} + /* u3m_grab(): garbage-collect the world, plus extra roots. */ void @@ -1839,7 +1849,7 @@ u3m_grab(u3_noun som, ...) // terminate with u3_none } va_end(vap); } - u3m_mark(); // XX leaks + u3m_mark_mute(); u3a_sweep(); } diff --git a/pkg/vere/io/lick.c b/pkg/vere/io/lick.c index 9e722cb0a5..2f05704019 100644 --- a/pkg/vere/io/lick.c +++ b/pkg/vere/io/lick.c @@ -616,6 +616,7 @@ _lick_io_exit(u3_auto* car_u) } u3s_cue_xeno_done(lic_u->sil_u); + c3_free(lic_u->fod_c); c3_free(lic_u); } diff --git a/pkg/vere/io/unix.c b/pkg/vere/io/unix.c index 9879e7db4f..4c5da87835 100644 --- a/pkg/vere/io/unix.c +++ b/pkg/vere/io/unix.c @@ -871,6 +871,8 @@ _unix_create_dir(u3_udir* dir_u, u3_udir* par_u, u3_noun nam) _unix_mkdir(pax_c); _unix_watch_dir(dir_u, par_u, pax_c); + + c3_free(pax_c); } static u3_noun _unix_update_node(u3_unix* unx_u, u3_unod* nod_u); @@ -1336,7 +1338,6 @@ _unix_sync_file(u3_unix* unx_u, u3_udir* par_u, u3_noun nam, u3_noun ext, u3_nou u3_ufil* fil_u = c3_malloc(sizeof(u3_ufil)); _unix_watch_file(unx_u, fil_u, par_u, pax_c); fil_u->gum_w = gum_w; - goto _unix_sync_file_out; } else { _unix_write_file_soft((u3_ufil*) nod_u, u3k(u3t(mim))); @@ -1344,8 +1345,6 @@ _unix_sync_file(u3_unix* unx_u, u3_udir* par_u, u3_noun nam, u3_noun ext, u3_nou } c3_free(pax_c); - -_unix_sync_file_out: u3z(mim); } @@ -1402,6 +1401,8 @@ _unix_sync_change(u3_unix* unx_u, u3_udir* dir_u, u3_noun pax, u3_noun mim) } _unix_sync_change(unx_u, (u3_udir*) nod_u, u3k(t_pax), mim); + + c3_free(nam_c); } } u3z(pax); @@ -1580,6 +1581,14 @@ _unix_io_exit(u3_auto* car_u) { u3_unix* unx_u = (u3_unix*)car_u; + u3_umon* mon_u = unx_u->mon_u; + u3_umon* nex_u; + while ( mon_u ) { + nex_u = mon_u->nex_u; + _unix_free_mount_point(unx_u, mon_u); + mon_u = nex_u; + } + u3z(unx_u->sat); c3_free(unx_u->pax_c); c3_free(unx_u); diff --git a/pkg/vere/mdns.c b/pkg/vere/mdns.c index e58dae6dfc..998a1c46ec 100644 --- a/pkg/vere/mdns.c +++ b/pkg/vere/mdns.c @@ -14,6 +14,12 @@ typedef struct _mdns_payload { void* context; } mdns_payload; +#ifdef ASAN_ENABLED + void __lsan_ignore_object(const void *p); +#else + #define __lsan_ignore_object(p) ((void) (p)) +#endif + static void close_cb(uv_handle_t* poll) { mdns_payload* payload = (mdns_payload*)poll->data; DNSServiceRefDeallocate(payload->sref); @@ -182,6 +188,7 @@ void mdns_init(uint16_t port, bool fake, char* our, mdns_cb* cb, void* context) # endif mdns_payload* register_payload = (mdns_payload*)c3_calloc(sizeof(mdns_payload)); + __lsan_ignore_object(register_payload); DNSServiceErrorType err;