From 6238793ad71f0bc0a6062c6575d866c180b18d08 Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 18 Aug 2026 07:24:49 +0000 Subject: [PATCH 1/3] Restore umask if bind fails, from nachalsa at naver dot com. --- server.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server.c b/server.c index ffd5b4ddf..bc2fcdd92 100644 --- a/server.c +++ b/server.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server.c,v 1.215 2026/08/03 10:07:57 nicm Exp $ */ +/* $OpenBSD: server.c,v 1.216 2026/08/18 07:24:49 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -131,6 +131,7 @@ server_create_socket(uint64_t flags, char **cause) mask = umask(S_IXUSR|S_IRWXG|S_IRWXO); if (bind(fd, (struct sockaddr *)&sa, sizeof sa) == -1) { saved_errno = errno; + umask(mask); close(fd); errno = saved_errno; goto fail; From 72c5037f06625f8dff165ea42c660ee696e9015e Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 18 Aug 2026 07:32:09 +0000 Subject: [PATCH 2/3] Correctly clear clients referring to a session with destroy-unattached, GitHub issue 5497 from Jeong, Heon. --- server-fn.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server-fn.c b/server-fn.c index 149d048ad..503516afe 100644 --- a/server-fn.c +++ b/server-fn.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-fn.c,v 1.149 2026/07/27 14:25:46 nicm Exp $ */ +/* $OpenBSD: server-fn.c,v 1.150 2026/08/18 07:32:09 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -548,6 +548,7 @@ server_check_unattached(void) continue; break; } + server_destroy_session(s); session_destroy(s, 1, __func__); } } From 4714f478fed87ae2c510ecd035aa89c5a90dedf8 Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 18 Aug 2026 07:43:44 +0000 Subject: [PATCH 3/3] When a pane is respawned, reset the control mode offsets. GitHub issue 5498 from Alex Rattray. --- control.c | 21 ++++++++++++++++++++- spawn.c | 18 ++++++++++++++++-- tmux.h | 3 ++- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/control.c b/control.c index 7f76ff9e3..c3bb82b01 100644 --- a/control.c +++ b/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.65 2026/08/04 11:18:22 nicm Exp $ */ +/* $OpenBSD: control.c,v 1.66 2026/08/18 07:43:44 nicm Exp $ */ /* * Copyright (c) 2012 Nicholas Marriott @@ -388,6 +388,25 @@ control_pause_pane(struct client *c, struct window_pane *wp) } } +/* + * Reset a pane after its buffer has been replaced: drop any output still + * queued from the old buffer and start again from the pane's own offset. + */ +void +control_reset_pane(struct client *c, struct window_pane *wp) +{ + struct control_pane *cp; + + if (c->control_state == NULL) + return; + cp = control_get_pane(c, wp); + if (cp == NULL) + return; + control_discard_pane(c, cp); + memcpy(&cp->offset, &wp->offset, sizeof cp->offset); + memcpy(&cp->queued, &wp->offset, sizeof cp->queued); +} + /* Write an already-formatted line, queueing it behind %output if needed. */ static void control_write_line(struct client *c, char *line) diff --git a/spawn.c b/spawn.c index 6379e01af..9e162217f 100644 --- a/spawn.c +++ b/spawn.c @@ -1,4 +1,4 @@ -/* $OpenBSD: spawn.c,v 1.50 2026/07/23 09:38:27 nicm Exp $ */ +/* $OpenBSD: spawn.c,v 1.51 2026/08/18 07:43:44 nicm Exp $ */ /* * Copyright (c) 2019 Nicholas Marriott @@ -245,7 +245,7 @@ struct window_pane * spawn_pane(struct spawn_context *sc, char **cause) { struct cmdq_item *item = sc->item; - struct client *c; + struct client *c, *loop; struct session *s = sc->s; struct session *ts; struct window *w = sc->wl->window; @@ -333,6 +333,20 @@ spawn_pane(struct spawn_context *sc, char **cause) input_free(sc->wp0->ictx); sc->wp0->ictx = NULL; } + + /* + * The old buffer is gone and the new one starts empty, so + * offsets into the old buffer no longer mean anything. Reset + * them, and drop output control clients still had queued. + */ + sc->wp0->offset.used = 0; + sc->wp0->base_offset = 0; + sc->wp0->pipe_offset.used = 0; + TAILQ_FOREACH(loop, &clients, entry) { + if (loop->flags & CLIENT_CONTROL) + control_reset_pane(loop, sc->wp0); + } + new_wp = sc->wp0; new_wp->flags &= ~(PANE_STATUSREADY|PANE_STATUSDRAWN); } else { diff --git a/tmux.h b/tmux.h index 11d9e3d4d..ea03cb463 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.1425 2026/08/17 20:04:00 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.1426 2026/08/18 07:43:44 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -3986,6 +3986,7 @@ void control_set_pane_on(struct client *, struct window_pane *); void control_set_pane_off(struct client *, struct window_pane *); void control_continue_pane(struct client *, struct window_pane *); void control_pause_pane(struct client *, struct window_pane *); +void control_reset_pane(struct client *, struct window_pane *); void control_set_window_size(struct client *, u_int, u_int, u_int); int control_get_window_size(struct client *, u_int, u_int *, u_int *); void control_clear_window_size(struct client *, u_int);