diff options
author | Srivardhan Hebbar <sri.hebbar@samsung.com> | 2014-05-27 14:30:59 +0530 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2014-06-18 17:14:40 -0700 |
commit | ba2a36d5c5e19738d5f56812a5eb652b418e8184 (patch) | |
tree | e491ab90a3c36ae66e8188c5d37541e501912c47 | |
parent | 6ac60c17911ff416edcdeabf7800904765d3f59d (diff) |
weston: Fix memleak issue in compositor.c
Based on a previous patch by Hardening <rdp.effort@gmail.com>.
Signed-off-by: Srivardhan Hebbar <sri.hebbar@samsung.com>
-rw-r--r-- | src/compositor.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/compositor.c b/src/compositor.c index 2fbfdbf8..df094581 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -4229,6 +4229,11 @@ int main(int argc, char *argv[]) signals[3] = wl_event_loop_add_signal(loop, SIGCHLD, sigchld_handler, NULL); + if (!signals[0] || !signals[1] || !signals[2] || !signals[3]) { + ret = EXIT_FAILURE; + goto out_signals; + } + if (noconfig == 0) config = weston_config_parse("weston.ini"); if (config != NULL) { @@ -4256,13 +4261,16 @@ int main(int argc, char *argv[]) backend_init = weston_load_module(backend, "backend_init"); free(backend); - if (!backend_init) - exit(EXIT_FAILURE); + if (!backend_init) { + ret = EXIT_FAILURE; + goto out_signals; + } ec = backend_init(display, &argc, argv, config); if (ec == NULL) { weston_log("fatal: failed to create compositor\n"); - exit(EXIT_FAILURE); + ret = EXIT_FAILURE; + goto out_signals; } catch_signals(); @@ -4343,12 +4351,15 @@ int main(int argc, char *argv[]) wl_signal_emit(&ec->destroy_signal, ec); - for (i = ARRAY_LENGTH(signals); i;) - wl_event_source_remove(signals[--i]); - weston_compositor_xkb_destroy(ec); ec->destroy(ec); + +out_signals: + for (i = ARRAY_LENGTH(signals) - 1; i >= 0; i--) + if (signals[i]) + wl_event_source_remove(signals[i]); + wl_display_destroy(display); weston_log_file_close(); |