aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTiago Cunha <tcunha@gmx.com>2012-08-31 09:22:08 +0000
committerTiago Cunha <tcunha@gmx.com>2012-08-31 09:22:08 +0000
commit56e37487a81f07b4c8f409e72dea6c5b746de4b3 (patch)
tree224cea806ff14efaa70bff628a268c5572a5c7ea
parent674545f7e6fc703a809d60b572e1a99d0777d6f2 (diff)
downloadrtmux-56e37487a81f07b4c8f409e72dea6c5b746de4b3.tar.gz
rtmux-56e37487a81f07b4c8f409e72dea6c5b746de4b3.tar.bz2
rtmux-56e37487a81f07b4c8f409e72dea6c5b746de4b3.zip
Sync OpenBSD patchset 1165:
Fix up window reference counting and don't crash if the rename timer fires while the window is dead but still referenced. Fixes problem reported by Michael Scholz.
-rw-r--r--names.c3
-rw-r--r--notify.c3
-rw-r--r--tmux.h1
-rw-r--r--window.c19
4 files changed, 18 insertions, 8 deletions
diff --git a/names.c b/names.c
index 11baae35..b86d1b01 100644
--- a/names.c
+++ b/names.c
@@ -50,6 +50,9 @@ window_name_callback(unused int fd, unused short events, void *data)
struct window *w = data;
char *name, *wname;
+ if (w->active == NULL)
+ return;
+
if (!options_get_number(&w->options, "automatic-rename")) {
if (event_initialized(&w->name_timer))
event_del(&w->name_timer);
diff --git a/notify.c b/notify.c
index c3aab462..c78fbdf3 100644
--- a/notify.c
+++ b/notify.c
@@ -124,7 +124,8 @@ notify_drain(void)
if (ne->session != NULL)
ne->session->references--;
if (ne->window != NULL)
- ne->window->references--;
+ window_remove_ref(ne->window);
+
TAILQ_REMOVE(&notify_queue, ne, entry);
free(ne);
}
diff --git a/tmux.h b/tmux.h
index 442e09f7..a3d64dee 100644
--- a/tmux.h
+++ b/tmux.h
@@ -2126,6 +2126,7 @@ struct window_pane *window_pane_find_down(struct window_pane *);
struct window_pane *window_pane_find_left(struct window_pane *);
struct window_pane *window_pane_find_right(struct window_pane *);
void window_set_name(struct window *, const char *);
+void window_remove_ref(struct window *);
void winlink_clear_flags(struct winlink *);
void window_mode_attrs(struct grid_cell *, struct options *);
diff --git a/window.c b/window.c
index d3d8c186..5ef81959 100644
--- a/window.c
+++ b/window.c
@@ -179,13 +179,8 @@ winlink_remove(struct winlinks *wwl, struct winlink *wl)
free(wl->status_text);
free(wl);
- if (w != NULL) {
- if (w->references == 0)
- fatal("bad reference count");
- w->references--;
- if (w->references == 0)
- window_destroy(w);
- }
+ if (w != NULL)
+ window_remove_ref(w);
}
struct winlink *
@@ -360,6 +355,16 @@ window_destroy(struct window *w)
}
void
+window_remove_ref(struct window *w)
+{
+ if (w->references == 0)
+ fatal("bad reference count");
+ w->references--;
+ if (w->references == 0)
+ window_destroy(w);
+}
+
+void
window_set_name(struct window *w, const char *new_name)
{
free(w->name);