compositor-x11: Add error handling in x11_compositor_create()
authorMartin Olsson <martin@minimum.se>
Sun, 8 Jul 2012 01:03:44 +0000 (03:03 +0200)
committerKristian Høgsberg <krh@bitplanet.net>
Mon, 9 Jul 2012 21:50:45 +0000 (17:50 -0400)
src/compositor-x11.c

index 5afaa7a..f2f0cb1 100644 (file)
@@ -1064,17 +1064,17 @@ x11_compositor_create(struct wl_display *display,
 
        if (weston_compositor_init(&c->base, display, argc, argv,
                                   config_file) < 0)
-               return NULL;
+               goto err_free;
 
        c->dpy = XOpenDisplay(NULL);
        if (c->dpy == NULL)
-               return NULL;
+               goto err_free;
 
        c->conn = XGetXCBConnection(c->dpy);
        XSetEventQueueOwner(c->dpy, XCBOwnsEventQueue);
 
        if (xcb_connection_has_error(c->conn))
-               return NULL;
+               goto err_xdisplay;
 
        s = xcb_setup_roots_iterator(xcb_get_setup(c->conn));
        c->screen = s.data;
@@ -1084,20 +1084,20 @@ x11_compositor_create(struct wl_display *display,
 
        c->base.wl_display = display;
        if (x11_compositor_init_egl(c) < 0)
-               return NULL;
+               goto err_xdisplay;
 
        c->base.destroy = x11_destroy;
 
        if (weston_compositor_init_gl(&c->base) < 0)
-               return NULL;
+               goto err_egl;
 
        if (x11_input_create(c, no_input) < 0)
-               return NULL;
+               goto err_egl;
 
        for (i = 0, x = 0; i < count; i++) {
                if (x11_compositor_create_output(c, x, 0, width, height,
                                                 fullscreen, no_input) < 0)
-                       return NULL;
+                       goto err_x11_input;
                x += width;
        }
 
@@ -1109,6 +1109,16 @@ x11_compositor_create(struct wl_display *display,
        wl_event_source_check(c->xcb_source);
 
        return &c->base;
+
+err_x11_input:
+       x11_input_destroy(c);
+err_egl:
+       x11_compositor_fini_egl(c);
+err_xdisplay:
+       XCloseDisplay(c->dpy);
+err_free:
+       free(c);
+       return NULL;
 }
 
 WL_EXPORT struct weston_compositor *