From aa36899d8a54d359bf3da997fb6f681199e49938 Mon Sep 17 00:00:00 2001 From: emersion Date: Tue, 24 Apr 2018 22:04:19 +0100 Subject: Fix a bunch of swaybar memory leaks --- swaybar/bar.c | 21 +++++++++++---------- swaybar/config.c | 6 ++++++ swaybar/i3bar.c | 3 ++- swaybar/ipc.c | 13 ++----------- swaybar/status_line.c | 14 +++++++++++++- 5 files changed, 34 insertions(+), 23 deletions(-) (limited to 'swaybar') diff --git a/swaybar/bar.c b/swaybar/bar.c index b4c0698f..5b8028e5 100644 --- a/swaybar/bar.c +++ b/swaybar/bar.c @@ -25,7 +25,6 @@ #include "ipc-client.h" #include "list.h" #include "log.h" -#include "pango.h" #include "pool-buffer.h" #include "wlr-layer-shell-unstable-v1-client-protocol.h" @@ -34,6 +33,15 @@ static void bar_init(struct swaybar *bar) { wl_list_init(&bar->outputs); } +void free_workspaces(struct wl_list *list) { + struct swaybar_workspace *ws, *tmp; + wl_list_for_each_safe(ws, tmp, list, link) { + wl_list_remove(&ws->link); + free(ws->name); + free(ws); + } +} + static void swaybar_output_free(struct swaybar_output *output) { if (!output) { return; @@ -44,12 +52,7 @@ static void swaybar_output_free(struct swaybar_output *output) { wl_output_destroy(output->output); destroy_buffer(&output->buffers[0]); destroy_buffer(&output->buffers[1]); - struct swaybar_workspace *ws, *ws_tmp; - wl_list_for_each_safe(ws, ws_tmp, &output->workspaces, link) { - wl_list_remove(&ws->link); - free(ws->name); - free(ws); - } + free_workspaces(&output->workspaces); struct swaybar_hotspot *hotspot, *hotspot_tmp; wl_list_for_each_safe(hotspot, hotspot_tmp, &output->hotspots, link) { if (hotspot->destroy) { @@ -468,9 +471,7 @@ void bar_run(struct swaybar *bar) { static void free_outputs(struct wl_list *list) { struct swaybar_output *output, *tmp; wl_list_for_each_safe(output, tmp, list, link) { - wl_list_remove(&output->link); - free(output->name); - free(output); + swaybar_output_free(output); } } diff --git a/swaybar/config.c b/swaybar/config.c index 9169ad27..db7b0db6 100644 --- a/swaybar/config.c +++ b/swaybar/config.c @@ -74,5 +74,11 @@ void free_config(struct swaybar_config *config) { free(config->font); free(config->mode); free(config->sep_symbol); + struct config_output *coutput, *tmp; + wl_list_for_each_safe(coutput, tmp, &config->outputs, link) { + wl_list_remove(&coutput->link); + free(coutput->name); + free(coutput); + } free(config); } diff --git a/swaybar/i3bar.c b/swaybar/i3bar.c index dced13d2..141612a6 100644 --- a/swaybar/i3bar.c +++ b/swaybar/i3bar.c @@ -7,7 +7,7 @@ #include "swaybar/config.h" #include "swaybar/status_line.h" -static void i3bar_block_free(struct i3bar_block *block) { +void i3bar_block_free(struct i3bar_block *block) { if (!block) { return; } @@ -18,6 +18,7 @@ static void i3bar_block_free(struct i3bar_block *block) { free(block->name); free(block->instance); free(block->color); + free(block); } static bool i3bar_parse_json(struct status_line *status, const char *text) { diff --git a/swaybar/ipc.c b/swaybar/ipc.c index ed5d9a31..959fa095 100644 --- a/swaybar/ipc.c +++ b/swaybar/ipc.c @@ -216,15 +216,6 @@ static void ipc_parse_config( json_object_put(bar_config); } -static void free_workspaces(struct wl_list *list) { - struct swaybar_workspace *ws, *tmp; - wl_list_for_each_safe(ws, tmp, list, link) { - wl_list_remove(&ws->link); - free(ws->name); - free(ws); - } -} - void ipc_get_workspaces(struct swaybar *bar) { bar->focused_output = NULL; struct swaybar_output *output; @@ -290,8 +281,8 @@ static void ipc_get_outputs(struct swaybar *bar) { continue; } if (bar->config->all_outputs) { - struct config_output *coutput = calloc( - 1, sizeof(struct config_output)); + struct config_output *coutput = + calloc(1, sizeof(struct config_output)); coutput->name = strdup(name); coutput->index = i; wl_list_insert(&bar->config->outputs, &coutput->link); diff --git a/swaybar/status_line.c b/swaybar/status_line.c index 8d781ca3..e0e7414a 100644 --- a/swaybar/status_line.c +++ b/swaybar/status_line.c @@ -1,4 +1,4 @@ -#define _POSIX_C_SOURCE 199309L +#define _POSIX_C_SOURCE 200809L #include #include #include @@ -126,5 +126,17 @@ void status_line_free(struct status_line *status) { close(status->read_fd); close(status->write_fd); kill(status->pid, SIGTERM); + switch (status->protocol) { + case PROTOCOL_I3BAR:; + struct i3bar_block *block, *tmp; + wl_list_for_each_safe(block, tmp, &status->blocks, link) { + i3bar_block_free(block); + } + free(status->i3bar_state.buffer); + break; + default: + free(status->text_state.buffer); + break; + } free(status); } -- cgit v1.2.3-54-g00ecf