On Tue, 22 Apr 2025 09:17:31 +0200, Theo Buehler <t...@theobuehler.org> wrote: > > Also, adding a pledge without giving a clear root cause is never the > right thing to do. At a minimum a ktrace should be provided. > > Why does this violate the inet pledge? Why does this work on 7.6? What > exactly changed in 7.7 so that it no longer works? > > These are questions that should be asked answered *before* commit. >
Thanks for challenge it. Indeed, my patch was wrong and here no need to touch pledge(). The cause is claudio@ works on libutil's imsg. Because it includes renaming of imsg_init -> imsgbuf_init, it leads configure to a conclusion that tmate needs compat/imsg.c and compat/imsg-buffer.c where additional socket() is used. So, here a diff which revert pledge() changes, and improved compatibility with new imsg API. Ok? Index: sysutils/tmate/Makefile =================================================================== RCS file: /cvs/ports/sysutils/tmate/Makefile,v diff -u -p -r1.24 Makefile --- sysutils/tmate/Makefile 22 Apr 2025 07:07:57 -0000 1.24 +++ sysutils/tmate/Makefile 22 Apr 2025 20:23:39 -0000 @@ -4,7 +4,7 @@ GH_ACCOUNT = tmate-io GH_PROJECT = tmate GH_TAGNAME = 2.4.0 CATEGORIES = sysutils -REVISION = 8 +REVISION = 9 SITES.p = https://github.com/tmate-io/tmate/commit/ PATCHFILES.p = tmate-bad-fingerprint{cbec43f56dfb48c2fb6e00faa2cb85443d4b7d8f}.patch \ Index: sysutils/tmate/patches/patch-client_c =================================================================== RCS file: sysutils/tmate/patches/patch-client_c diff -N sysutils/tmate/patches/patch-client_c --- sysutils/tmate/patches/patch-client_c 22 Apr 2025 07:07:57 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,23 +0,0 @@ -Add missing inet promise. - -Index: client.c ---- client.c.orig -+++ client.c -@@ -391,7 +391,7 @@ client_main(struct event_base *base, int argc, char ** - * - * "sendfd" is dropped later in client_dispatch_wait(). - */ -- if (pledge("stdio unix sendfd proc exec tty", NULL) != 0) -+ if (pledge("stdio unix sendfd proc exec tty inet", NULL) != 0) - fatal("pledge failed"); - #endif - -@@ -652,7 +652,7 @@ client_dispatch_wait(struct imsg *imsg, const char *sh - * get the first message from the server. - */ - if (!pledge_applied) { -- if (pledge("stdio unix proc exec tty", NULL) != 0) -+ if (pledge("stdio unix proc exec tty inet", NULL) != 0) - fatal("pledge failed"); - pledge_applied = 1; - }; Index: sysutils/tmate/patches/patch-configure-ac =================================================================== RCS file: /cvs/ports/sysutils/tmate/patches/patch-configure-ac,v diff -u -p -r1.1 patch-configure-ac --- sysutils/tmate/patches/patch-configure-ac 20 Feb 2024 12:01:49 -0000 1.1 +++ sysutils/tmate/patches/patch-configure-ac 22 Apr 2025 20:23:39 -0000 @@ -1,5 +1,6 @@ ---- configure.ac.orig Sun Nov 17 07:09:38 2019 -+++ configure.ac Sat Feb 3 15:47:48 2024 +Index: configure.ac +--- configure.ac.orig ++++ configure.ac @@ -201,7 +201,7 @@ fi PKG_CHECK_MODULES( @@ -18,3 +19,18 @@ fi PKG_CHECK_MODULES( +@@ -310,11 +310,11 @@ fi + AC_SUBST(XOPEN_DEFINES) + + # Look for imsg in libutil. compat/imsg.c is linked by Makefile.am if missing. +-AC_SEARCH_LIBS(imsg_init, util, found_imsg_init=yes, found_imsg_init=no) +-if test "x$found_imsg_init" = xyes; then ++AC_SEARCH_LIBS(imsgbuf_init, util, found_imsgbuf_init=yes, found_imsgbuf_init=no) ++if test "x$found_imsgbuf_init" = xyes; then + AC_DEFINE(HAVE_IMSG) + fi +-AM_CONDITIONAL(NO_IMSG, [test "x$found_imsg_init" = xno]) ++AM_CONDITIONAL(NO_IMSG, [test "x$found_imsgbuf_init" = xno]) + + # Look for forkpty in libutil. compat/forkpty-*.c is linked if not found. + AC_SEARCH_LIBS(forkpty, util, found_forkpty=yes, found_forkpty=no) Index: sysutils/tmate/patches/patch-proc_c =================================================================== RCS file: sysutils/tmate/patches/patch-proc_c diff -N sysutils/tmate/patches/patch-proc_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ sysutils/tmate/patches/patch-proc_c 22 Apr 2025 20:23:39 -0000 @@ -0,0 +1,72 @@ +Index: proc.c +--- proc.c.orig ++++ proc.c +@@ -59,8 +59,10 @@ proc_event_cb(__unused int fd, short events, void *arg + struct imsg imsg; + + if (!(peer->flags & PEER_BAD) && (events & EV_READ)) { +- if (((n = imsg_read(&peer->ibuf)) == -1 && errno != EAGAIN) || +- n == 0) { ++ if ((n = imsgbuf_read(&peer->ibuf)) == -1) ++ fatal("imsgbuf_read"); ++ ++ if (n == 0) { + peer->dispatchcb(NULL, peer->arg); + return; + } +@@ -74,8 +76,6 @@ proc_event_cb(__unused int fd, short events, void *arg + log_debug("peer %p message %d", peer, imsg.hdr.type); + + if (peer_check_version(peer, &imsg) != 0) { +- if (imsg.fd != -1) +- close(imsg.fd); + imsg_free(&imsg); + break; + } +@@ -86,13 +86,13 @@ proc_event_cb(__unused int fd, short events, void *arg + } + + if (events & EV_WRITE) { +- if (msgbuf_write(&peer->ibuf.w) <= 0 && errno != EAGAIN) { ++ if (imsgbuf_write(&peer->ibuf) == -1) { + peer->dispatchcb(NULL, peer->arg); + return; + } + } + +- if ((peer->flags & PEER_BAD) && peer->ibuf.w.queued == 0) { ++ if ((peer->flags & PEER_BAD) && imsgbuf_queuelen(&peer->ibuf) == 0) { + peer->dispatchcb(NULL, peer->arg); + return; + } +@@ -133,7 +133,7 @@ proc_update_event(struct tmuxpeer *peer) + event_del(&peer->event); + + events = EV_READ; +- if (peer->ibuf.w.queued > 0) ++ if (imsgbuf_queuelen(&peer->ibuf) > 0) + events |= EV_WRITE; + event_set(&peer->event, peer->ibuf.fd, events, proc_event_cb, peer); + +@@ -246,7 +246,11 @@ proc_add_peer(struct tmuxproc *tp, int fd, + peer->dispatchcb = dispatchcb; + peer->arg = arg; + +- imsg_init(&peer->ibuf, fd); ++ if (imsgbuf_init(&peer->ibuf, fd) == -1) ++ fatal("imsgbuf_init"); ++ ++ imsgbuf_allow_fdpass(&peer->ibuf); ++ + event_set(&peer->event, fd, EV_READ, proc_event_cb, peer); + + log_debug("add peer %p: %d (%p)", peer, fd, arg); +@@ -261,7 +265,7 @@ proc_remove_peer(struct tmuxpeer *peer) + log_debug("remove peer %p", peer); + + event_del(&peer->event); +- imsg_clear(&peer->ibuf); ++ imsgbuf_clear(&peer->ibuf); + + close(peer->ibuf.fd); + free(peer); Index: sysutils/tmate/patches/patch-server-client_c =================================================================== RCS file: sysutils/tmate/patches/patch-server-client_c diff -N sysutils/tmate/patches/patch-server-client_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ sysutils/tmate/patches/patch-server-client_c 22 Apr 2025 20:23:39 -0000 @@ -0,0 +1,14 @@ +Index: server-client.c +--- server-client.c.orig ++++ server-client.c +@@ -1238,8 +1238,8 @@ server_client_dispatch_identify(struct client *c, stru + case MSG_IDENTIFY_STDIN: + if (datalen != 0) + fatalx("bad MSG_IDENTIFY_STDIN size"); +- c->fd = imsg->fd; +- log_debug("client %p IDENTIFY_STDIN %d", c, imsg->fd); ++ c->fd = imsg_get_fd(imsg); ++ log_debug("client %p IDENTIFY_STDIN %d", c, c->fd); + break; + case MSG_IDENTIFY_ENVIRON: + if (datalen == 0 || data[datalen - 1] != '\0')