[PATCH weston] Fix a crash when opening two terminal windows and closing the first one.

Dima Ryazanov dima at gmail.com
Thu Nov 29 00:27:09 PST 2012


To reproduce, launch the terminal, open a second window using Ctrl-Shift-N,
go back to the first window, and press Ctrl-D. The terminal's master FD gets
events even after being closed, causing terminal_destroy to be called twice
on the same object.

To fix this, I'm adding a function to stop watching an FD.
---
 clients/terminal.c |    6 ++++--
 clients/window.c   |    6 ++++++
 clients/window.h   |    3 +++
 3 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/clients/terminal.c b/clients/terminal.c
index 1887829..25acc81 100644
--- a/clients/terminal.c
+++ b/clients/terminal.c
@@ -2578,13 +2578,15 @@ terminal_create(struct display *display)
 static void
 terminal_destroy(struct terminal *terminal)
 {
+	display_unwatch_fd(terminal->display, terminal->master);
 	window_destroy(terminal->window);
 	close(terminal->master);
 	wl_list_remove(&terminal->link);
-	free(terminal);
 
 	if (wl_list_empty(&terminal_list))
-		exit(0);
+		display_exit(terminal->display);
+
+	free(terminal);
 }
 
 static void
diff --git a/clients/window.c b/clients/window.c
index 3469fe6..b625516 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -4347,6 +4347,12 @@ display_watch_fd(struct display *display,
 }
 
 void
+display_unwatch_fd(struct display *display, int fd)
+{
+	epoll_ctl(display->epoll_fd, EPOLL_CTL_DEL, fd, NULL);
+}
+
+void
 display_run(struct display *display)
 {
 	struct task *task;
diff --git a/clients/window.h b/clients/window.h
index 9b820a0..804eef5 100644
--- a/clients/window.h
+++ b/clients/window.h
@@ -147,6 +147,9 @@ display_watch_fd(struct display *display,
 		 int fd, uint32_t events, struct task *task);
 
 void
+display_unwatch_fd(struct display *display, int fd);
+
+void
 display_run(struct display *d);
 
 void
-- 
1.7.10.4



More information about the wayland-devel mailing list