tty: Improve error handling in tty_create()
authorJonas Ådahl <jadahl@gmail.com>
Wed, 28 Mar 2012 20:36:10 +0000 (22:36 +0200)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 29 Mar 2012 03:03:00 +0000 (23:03 -0400)
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
src/tty.c

index c5e9e8a..85c16d8 100644 (file)
--- a/src/tty.c
+++ b/src/tty.c
@@ -152,12 +152,13 @@ tty_create(struct weston_compositor *compositor, tty_vt_func_t vt_func,
 
        if (tty->fd <= 0) {
                fprintf(stderr, "failed to open tty: %m\n");
+               free(tty);
                return NULL;
        }
 
        if (tcgetattr(tty->fd, &tty->terminal_attributes) < 0) {
                fprintf(stderr, "could not get terminal attributes: %m\n");
-               return NULL;
+               goto err;
        }
 
        /* Ignore control characters and disable echo */
@@ -174,11 +175,13 @@ tty_create(struct weston_compositor *compositor, tty_vt_func_t vt_func,
        tty->input_source =
                wl_event_loop_add_fd(loop, tty->fd,
                                     WL_EVENT_READABLE, on_tty_input, tty);
+       if (!tty->input_source)
+               goto err_attr;
 
        ret = ioctl(tty->fd, KDSETMODE, KD_GRAPHICS);
        if (ret) {
                fprintf(stderr, "failed to set KD_GRAPHICS mode on tty: %m\n");
-               return NULL;
+               goto err_input_source;
        }
 
        tty->has_vt = 1;
@@ -187,13 +190,32 @@ tty_create(struct weston_compositor *compositor, tty_vt_func_t vt_func,
        mode.acqsig = SIGUSR1;
        if (ioctl(tty->fd, VT_SETMODE, &mode) < 0) {
                fprintf(stderr, "failed to take control of vt handling\n");
-               return NULL;
+               goto err_kdmode;
        }
 
        tty->vt_source =
                wl_event_loop_add_signal(loop, SIGUSR1, vt_handler, tty);
+       if (!tty->vt_source)
+               goto err_vtmode;
 
        return tty;
+
+err_vtmode:
+       ioctl(tty->fd, VT_SETMODE, &mode);
+
+err_kdmode:
+       ioctl(tty->fd, KDSETMODE, KD_TEXT);
+
+err_input_source:
+       wl_event_source_remove(tty->input_source);
+
+err_attr:
+       tcsetattr(tty->fd, TCSANOW, &tty->terminal_attributes);
+
+err:
+       close(tty->fd);
+       free(tty);
+       return NULL;
 }
 
 void