weston: Fix memleak issue in compositor.c
authorSrivardhan Hebbar <sri.hebbar@samsung.com>
Tue, 27 May 2014 09:00:59 +0000 (14:30 +0530)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 19 Jun 2014 00:14:40 +0000 (17:14 -0700)
Based on a previous patch by Hardening <rdp.effort@gmail.com>.

Signed-off-by: Srivardhan Hebbar <sri.hebbar@samsung.com>
src/compositor.c

index 2fbfdbf..df09458 100644 (file)
@@ -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();