Re: ncurses 6.6 regression: setupterm() rejects valid PTY, breaks tmux attach

Liam Huang <[email protected]> Wed, 27 May 2026 15:26:16 +0800
Newsgroups gmane.comp.lib.ncurses.bugs
Message-ID <[email protected]>
--Apple-Mail=_20503431-5EBA-4237-9292-7A43ECD8E8D8
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8

Hi Thomas,

Thank you for your reply and pointers. I'm writing back with a =
correction:
after further investigation, I've determined that this is NOT an ncurses
bug. I apologize for the noise.


CORRECTION

The "open terminal failed: not a terminal" error is caused by a tmux
client/server version mismatch after a Homebrew upgrade, not by ncurses
6.6's setupterm(). ncurses is innocent here.


WHAT WENT WRONG WITH MY ORIGINAL ANALYSIS

My isolation test used LD_LIBRARY_PATH to swap ncurses versions at
runtime. I believed this showed ncurses 6.6 as the regression boundary.
However, the brew tmux binary has a hardcoded DT_RPATH (not DT_RUNPATH)
pointing to its ncurses directory. DT_RPATH takes priority over
LD_LIBRARY_PATH, so all three test groups were actually running with
ncurses 6.6 =E2=80=94 the test was invalid.

The real variable I failed to control was the tmux server version. =
Before
`brew upgrade`, an older tmux (3.5a) server was still running. After the
upgrade, the new 3.6b client connected to the old server, triggering the
failure.


ACTUAL ROOT CAUSE

tmux 3.6b upgraded its bundled OpenBSD imsg IPC library. The struct
imsg_hdr layout changed in an ABI-incompatible way:

  Old (3.5a): type(u32) + len(u16) + flags(u16) + peerid(u32) + pid(u32)
  New (3.6b): type(u32) + len(u32)              + peerid(u32) + pid(u32)

The old library marks "message carries an fd" with flags & IMSGF_HASFD
(bit 0 of the flags field). The new library uses len & 0x80000000
(bit 31 of the widened len field), with the flags field removed =
entirely.

When the new client sends MSG_IDENTIFY_STDIN (carrying the terminal fd),
the old server misparses the header: it reads len=3D0x0010, =
flags=3D0x8000,
and since 0x8000 & IMSGF_HASFD(0x0001) =3D=3D 0, it never dequeues the =
fd.
The client's terminal fd is lost, isatty() fails on a stale fd, and tmux
reports "not a terminal".

I confirmed this with strace (ioctl(TCGETS) returns ENOTTY on the
received fd) and ncurses trace (setupterm() is never called =E2=80=94 =
the failure
occurs before ncurses is involved).


CLARIFICATIONS ON YOUR REPLY

A few small points, respectfully:

1. "Homebrew isn't Ubuntu - it's MacOS"

   Homebrew has officially supported Linux since 2019 (the former
   Linuxbrew project merged into mainline). It is widely used on Linux
   servers and in CI environments. My setup =E2=80=94 Homebrew on Ubuntu =
=E2=80=94 is a
   supported configuration, not an exotic one.

2. "This isn't the Ubuntu bug-reporting system"

   Understood. I was not reporting an Ubuntu/Debian packaging issue. I =
was
   reporting what I believed to be a regression in ncurses 6.6 itself,
   tested with a from-source build using the same configure flags. As it
   turns out, the bug was not in ncurses at all, so this is moot.

3. The 2026-02 report you referenced (bug-ncurses/2026-02/msg00025)

   That earlier report may or may not be the same issue. If the reporter
   was also hitting a tmux version mismatch after an upgrade, it would
   explain why no reproducer was provided =E2=80=94 the problem =
disappears once
   the old server is killed. It might be worth asking them whether they
   had recently upgraded tmux.


SUMMARY

- ncurses 6.6 setupterm() works correctly. I verified this with both a
  minimal C reproducer (SCM_RIGHTS fd passing + setupterm()) and ncurses
  trace output.
- The bug is in tmux's cross-version compatibility (or lack thereof)
  after an imsg library ABI change.
- I've updated the Homebrew issue (homebrew-core#284568) with the
  correction.

ONE QUESTION

Since the root cause is in tmux (the imsg library ABI change breaks
cross-version client/server compatibility without bumping =
PROTOCOL_VERSION),
would you recommend I report this to the tmux project? If so, could you
suggest the appropriate channel =E2=80=94 is it the GitHub issue tracker =
at
https://github.com/tmux/tmux/issues, or the tmux-users mailing list?

Again, I apologize for the incorrect report and for taking your time.
Thank you for maintaining ncurses.

Best regards,
Liam


> 2026=E5=B9=B45=E6=9C=8825=E6=97=A5 22:42=EF=BC=8CThomas Dickey =
<[email protected]> =E5=86=99=E9=81=93=EF=BC=9A
>=20
> On Mon, May 25, 2026 at 10:15:16AM +0800, Liam Huang wrote:
>> Hi,
>>=20
>> I've found a regression in ncurses 6.6 (patchdate 20251230) where
>> setupterm() fails on valid Linux pseudo-terminals, causing tmux's
>> tty_init() to fail and "open terminal failed: not a terminal" on =
attach.
>=20
> This sounds like a bug which was reported in tmux without providing a
> way to reproduce it -=20
>=20
> https://lists.gnu.org/archive/html/bug-ncurses/2026-02/msg00025.html
>=20
>> The issue does NOT occur with ncurses 6.5 (patchdate 20240427) or
>> the Ubuntu system ncurses 6.4.
>=20
> This isn't the Ubuntu bug-reporting system.  Since Ubuntu only
> mirrors ncurses updates from Debian, the place to report Ubuntu issues
> is in Debian.
>=20
>>=20
>> ENVIRONMENT
>>=20
>>  OS:       Ubuntu 24.04.4 LTS
>>  Kernel:   6.8.0-107-generic x86_64
>>  tmux:     3.6b (Homebrew)
>=20
> Homebrew isn't Ubuntu - it's MacOS.
>=20
>>  ncurses:  6.6.20251230 (Homebrew, wide-char build)
>>            6.5.20240427 (built from source, same configure flags)
>>            6.4+20240113 (Ubuntu system /lib/x86_64-linux-gnu)
>=20
> That's 3 versions of ncurses, one self-built, and (Homebrew isn't
> far from that, either).  If you're going to do all of that, you
> should be able to configure ncurses for traces and provide that =
information.
>=20
>> REPRODUCTION
>>=20
>>  # Using tmux 3.6b linked against ncurses 6.6:
>>  $ tmux new -d -s test
>>  $ tmux attach -t test
>>  open terminal failed: not a terminal
>>=20
>>  This happens in:
>>  - Interactive SSH sessions (ssh user@host, then tmux a)
>>  - VS Code Remote integrated terminal
>>  - PTYs created by script(1)
>>=20
>>  The ONLY working case is ssh -t host "tmux a -t test" (forced PTY
>>  with terminal size forwarding from the SSH client).
>>=20
>>=20
>> ISOLATION
>>=20
>>  Same tmux 3.6b binary, different ncurses library at runtime:
>>=20
>>  | ncurses           | method                              | result  =
|
>>  =
|-------------------|-------------------------------------|---------|
>>  | 6.6.20251230      | default brew linkage                | FAIL    =
|
>>  | 6.5.20240427      | LD_LIBRARY_PATH=3D.../ncurses-6.5/lib | OK     =
 |
>>  | 6.4 (system)      | LD_LIBRARY_PATH=3D/lib/x86_64-linux-gnu | OK   =
 |
>>=20
>>  Commands to reproduce the isolation test:
>>=20
>>    # FAIL with 6.6
>>    script -qc 'tmux -S /tmp/t66 new -d -s x && \
>>                 tmux -S /tmp/t66 a -t x' /dev/null
>>=20
>>    # OK with 6.5
>>    script -qc 'LD_LIBRARY_PATH=3D/path/to/ncurses-6.5/lib \
>>                 tmux -S /tmp/t65 new -d -s x && \
>>                 LD_LIBRARY_PATH=3D/path/to/ncurses-6.5/lib \
>>                 tmux -S /tmp/t65 a -t x' /dev/null
>>=20
>>=20
>> MECHANISM
>>=20
>>  tmux's server receives the client's PTY fd via SCM_RIGHTS, then
>>  calls tty_init() -> setupterm(). With ncurses 6.6, setupterm()
>>  apparently rejects the terminal, causing tty_init() to return -1.
>=20
> "apparently" can be used with lots of supporting data (actual
> system calls used, along with their results).
>=20
>>  This leaves the CLIENT_TERMINAL flag unset, and server_client_open()
>>  returns "not a terminal".
>>=20
>>  strace shows the PTY is valid =E2=80=94 TCGETS succeeds, the fd =
resolves
>>  to /dev/pts/N, and permissions are correct (crw--w---- owner:tty).
>=20
> I don't see a trace (and in any case, this report deals with a large =
system,
> in which things can be misconfigured)
>=20
>>  The tmux source code for this path is identical between 3.4 and
>>  3.6b, confirming the behavioral change is in ncurses, not tmux.
>>=20
>>=20
>> BUILD FLAGS (both 6.5 and 6.6 built with):
>>=20
>>  ./configure --prefix=3D... --with-shared --with-widec \
>>    --enable-pc-files --enable-sigwinch --enable-ext-colors \
>>    --without-debug --without-ada
>>=20
>>=20
>> I haven't bisected the exact ncurses patch between 6.5 and 6.6 yet.
>> Happy to test patches or provide additional traces if helpful.
>=20
> That's about 18 months of changes :-)
>=20
> --=20
> Thomas E. Dickey <[email protected] =
<mailto:[email protected]>>
> https://invisible-island.net <https://invisible-island.net/>

--Apple-Mail=_20503431-5EBA-4237-9292-7A43ECD8E8D8
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
	charset=utf-8

<html aria-label=3D"message body"><head><meta http-equiv=3D"content-type" =
content=3D"text/html; charset=3Dutf-8"></head><body =
style=3D"overflow-wrap: break-word; -webkit-nbsp-mode: space; =
line-break: after-white-space;"><div>Hi =
Thomas,</div><div><br></div><div>Thank you for your reply and pointers. =
I'm writing back with a correction:</div><div>after further =
investigation, I've determined that this is NOT an =
ncurses</div><div>bug. I apologize for the =
noise.</div><div><br></div><div><br></div><div>CORRECTION</div><div><br></=
div><div>The "open terminal failed: not a terminal" error is caused by a =
tmux</div><div>client/server version mismatch after a Homebrew upgrade, =
not by ncurses</div><div>6.6's setupterm(). ncurses is innocent =
here.</div><div><br></div><div><br></div><div>WHAT WENT WRONG WITH MY =
ORIGINAL ANALYSIS</div><div><br></div><div>My isolation test used =
LD_LIBRARY_PATH to swap ncurses versions at</div><div>runtime. I =
believed this showed ncurses 6.6 as the regression =
boundary.</div><div>However, the brew tmux binary has a hardcoded =
DT_RPATH (not DT_RUNPATH)</div><div>pointing to its ncurses directory. =
DT_RPATH takes priority over</div><div>LD_LIBRARY_PATH, so all three =
test groups were actually running with</div><div>ncurses 6.6 =E2=80=94 =
the test was invalid.</div><div><br></div><div>The real variable I =
failed to control was the tmux server version. Before</div><div>`brew =
upgrade`, an older tmux (3.5a) server was still running. After =
the</div><div>upgrade, the new 3.6b client connected to the old server, =
triggering =
the</div><div>failure.</div><div><br></div><div><br></div><div>ACTUAL =
ROOT CAUSE</div><div><br></div><div>tmux 3.6b upgraded its bundled =
OpenBSD imsg IPC library. The struct</div><div>imsg_hdr layout changed =
in an ABI-incompatible way:</div><div><br></div><div>&nbsp; Old (3.5a): =
type(u32) + len(u16) + flags(u16) + peerid(u32) + =
pid(u32)</div><div>&nbsp; New (3.6b): type(u32) + len(u32) &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;+ peerid(u32) + =
pid(u32)</div><div><br></div><div>The old library marks "message carries =
an fd" with flags &amp; IMSGF_HASFD</div><div>(bit 0 of the flags =
field). The new library uses len &amp; 0x80000000</div><div>(bit 31 of =
the widened len field), with the flags field removed =
entirely.</div><div><br></div><div>When the new client sends =
MSG_IDENTIFY_STDIN (carrying the terminal fd),</div><div>the old server =
misparses the header: it reads len=3D0x0010, flags=3D0x8000,</div><div>and=
 since 0x8000 &amp; IMSGF_HASFD(0x0001) =3D=3D 0, it never dequeues the =
fd.</div><div>The client's terminal fd is lost, isatty() fails on a =
stale fd, and tmux</div><div>reports "not a =
terminal".</div><div><br></div><div>I confirmed this with strace =
(ioctl(TCGETS) returns ENOTTY on the</div><div>received fd) and ncurses =
trace (setupterm() is never called =E2=80=94 the =
failure</div><div>occurs before ncurses is =
involved).</div><div><br></div><div><br></div><div>CLARIFICATIONS ON =
YOUR REPLY</div><div><br></div><div>A few small points, =
respectfully:</div><div><br></div><div>1. "Homebrew isn't Ubuntu - it's =
MacOS"</div><div><br></div><div>&nbsp; &nbsp;Homebrew has officially =
supported Linux since 2019 (the former</div><div>&nbsp; &nbsp;Linuxbrew =
project merged into mainline). It is widely used on =
Linux</div><div>&nbsp; &nbsp;servers and in CI environments. My setup =
=E2=80=94 Homebrew on Ubuntu =E2=80=94 is a</div><div>&nbsp; =
&nbsp;supported configuration, not an exotic =
one.</div><div><br></div><div>2. "This isn't the Ubuntu bug-reporting =
system"</div><div><br></div><div>&nbsp; &nbsp;Understood. I was not =
reporting an Ubuntu/Debian packaging issue. I was</div><div>&nbsp; =
&nbsp;reporting what I believed to be a regression in ncurses 6.6 =
itself,</div><div>&nbsp; &nbsp;tested with a from-source build using the =
same configure flags. As it</div><div>&nbsp; &nbsp;turns out, the bug =
was not in ncurses at all, so this is moot.</div><div><br></div><div>3. =
The 2026-02 report you referenced =
(bug-ncurses/2026-02/msg00025)</div><div><br></div><div>&nbsp; =
&nbsp;That earlier report may or may not be the same issue. If the =
reporter</div><div>&nbsp; &nbsp;was also hitting a tmux version mismatch =
after an upgrade, it would</div><div>&nbsp; &nbsp;explain why no =
reproducer was provided =E2=80=94 the problem disappears =
once</div><div>&nbsp; &nbsp;the old server is killed. It might be worth =
asking them whether they</div><div>&nbsp; &nbsp;had recently upgraded =
tmux.</div><div><br></div><div><br></div><div>SUMMARY</div><div><br></div>=
<div>- ncurses 6.6 setupterm() works correctly. I verified this with =
both a</div><div>&nbsp; minimal C reproducer (SCM_RIGHTS fd passing + =
setupterm()) and ncurses</div><div>&nbsp; trace output.</div><div>- The =
bug is in tmux's cross-version compatibility (or lack =
thereof)</div><div>&nbsp; after an imsg library ABI change.</div><div>- =
I've updated the Homebrew issue (homebrew-core#284568) with =
the</div><div>&nbsp; correction.</div><div><br></div><div>ONE =
QUESTION</div><div><br></div><div>Since the root cause is in tmux (the =
imsg library ABI change breaks</div><div>cross-version client/server =
compatibility without bumping PROTOCOL_VERSION),</div><div>would you =
recommend I report this to the tmux project? If so, could =
you</div><div>suggest the appropriate channel =E2=80=94 is it the GitHub =
issue tracker at</div><div>https://github.com/tmux/tmux/issues, or the =
tmux-users mailing list?</div><div><br></div><div>Again, I apologize for =
the incorrect report and for taking your time.</div><div>Thank you for =
maintaining ncurses.</div><div><br></div><div>Best =
regards,</div><div>Liam</div><div><br></div><div><br><blockquote =
type=3D"cite"><div>2026=E5=B9=B45=E6=9C=8825=E6=97=A5 22:42=EF=BC=8CThomas=
 Dickey &lt;[email protected]&gt; =E5=86=99=E9=81=93=EF=BC=9A</d=
iv><br class=3D"Apple-interchange-newline"><div><meta =
charset=3D"UTF-8"><span style=3D"caret-color: rgb(0, 0, 0); font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant-caps: =
normal; font-weight: 400; letter-spacing: normal; orphans: 2; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none; float: none; display: inline !important;">On Mon, =
May 25, 2026 at 10:15:16AM +0800, Liam Huang wrote:</span><br =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: =
solid;"><blockquote type=3D"cite" style=3D"font-family: Helvetica; =
font-size: 12px; font-style: normal; font-variant-caps: normal; =
font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; =
text-indent: 0px; text-transform: none; white-space: normal; widows: 2; =
word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: =
none; text-decoration-thickness: auto; text-decoration-style: =
solid;">Hi,<br><br>I've found a regression in ncurses 6.6 (patchdate =
20251230) where<br>setupterm() fails on valid Linux pseudo-terminals, =
causing tmux's<br>tty_init() to fail and "open terminal failed: not a =
terminal" on attach.<br></blockquote><br style=3D"caret-color: rgb(0, 0, =
0); font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
orphans: 2; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;">This sounds like a bug which was reported =
in tmux without providing a</span><br style=3D"caret-color: rgb(0, 0, =
0); font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
orphans: 2; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;">way to reproduce it -<span =
class=3D"Apple-converted-space">&nbsp;</span></span><br =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><br =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><a =
href=3D"https://lists.gnu.org/archive/html/bug-ncurses/2026-02/msg00025.ht=
ml" style=3D"font-family: Helvetica; font-size: 12px; font-style: =
normal; font-variant-caps: normal; font-weight: 400; letter-spacing: =
normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: =
0px;">https://lists.gnu.org/archive/html/bug-ncurses/2026-02/msg00025.html=
</a><br style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; =
font-size: 12px; font-style: normal; font-variant-caps: normal; =
font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; =
text-indent: 0px; text-transform: none; white-space: normal; widows: 2; =
word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: =
none; text-decoration-thickness: auto; text-decoration-style: =
solid;"><br style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; =
font-size: 12px; font-style: normal; font-variant-caps: normal; =
font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; =
text-indent: 0px; text-transform: none; white-space: normal; widows: 2; =
word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: =
none; text-decoration-thickness: auto; text-decoration-style: =
solid;"><blockquote type=3D"cite" style=3D"font-family: Helvetica; =
font-size: 12px; font-style: normal; font-variant-caps: normal; =
font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; =
text-indent: 0px; text-transform: none; white-space: normal; widows: 2; =
word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: =
none; text-decoration-thickness: auto; text-decoration-style: =
solid;">The issue does NOT occur with ncurses 6.5 (patchdate 20240427) =
or<br>the Ubuntu system ncurses 6.4.<br></blockquote><br =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;">This isn't the Ubuntu bug-reporting system. =
&nbsp;Since Ubuntu only</span><br style=3D"caret-color: rgb(0, 0, 0); =
font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
orphans: 2; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;">mirrors ncurses updates from Debian, the =
place to report Ubuntu issues</span><br style=3D"caret-color: rgb(0, 0, =
0); font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
orphans: 2; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;">is in Debian.</span><br style=3D"caret-color:=
 rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: =
normal; font-variant-caps: normal; font-weight: 400; letter-spacing: =
normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><br =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: =
solid;"><blockquote type=3D"cite" style=3D"font-family: Helvetica; =
font-size: 12px; font-style: normal; font-variant-caps: normal; =
font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; =
text-indent: 0px; text-transform: none; white-space: normal; widows: 2; =
word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: =
none; text-decoration-thickness: auto; text-decoration-style: =
solid;"><br>ENVIRONMENT<br><br>&nbsp;OS: =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ubuntu 24.04.4 LTS<br>&nbsp;Kernel: =
&nbsp;&nbsp;6.8.0-107-generic x86_64<br>&nbsp;tmux: =
&nbsp;&nbsp;&nbsp;&nbsp;3.6b (Homebrew)<br></blockquote><br =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;">Homebrew isn't Ubuntu - it's =
MacOS.</span><br style=3D"caret-color: rgb(0, 0, 0); font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant-caps: =
normal; font-weight: 400; letter-spacing: normal; orphans: 2; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration-line: none; text-decoration-thickness: auto; =
text-decoration-style: solid;"><br style=3D"caret-color: rgb(0, 0, 0); =
font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
orphans: 2; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: =
solid;"><blockquote type=3D"cite" style=3D"font-family: Helvetica; =
font-size: 12px; font-style: normal; font-variant-caps: normal; =
font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; =
text-indent: 0px; text-transform: none; white-space: normal; widows: 2; =
word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: =
none; text-decoration-thickness: auto; text-decoration-style: =
solid;">&nbsp;ncurses: &nbsp;6.6.20251230 (Homebrew, wide-char =
build)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;6.5.20240427 (built from source, same configure =
flags)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;6.4+20240113 (Ubuntu system /lib/x86_64-linux-gnu)<br></blockquote><br =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;">That's 3 versions of ncurses, one =
self-built, and (Homebrew isn't</span><br style=3D"caret-color: rgb(0, =
0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
orphans: 2; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;">far from that, either). &nbsp;If you're =
going to do all of that, you</span><br style=3D"caret-color: rgb(0, 0, =
0); font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
orphans: 2; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;">should be able to configure ncurses for =
traces and provide that information.</span><br style=3D"caret-color: =
rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: =
normal; font-variant-caps: normal; font-weight: 400; letter-spacing: =
normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><br =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: =
solid;"><blockquote type=3D"cite" style=3D"font-family: Helvetica; =
font-size: 12px; font-style: normal; font-variant-caps: normal; =
font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; =
text-indent: 0px; text-transform: none; white-space: normal; widows: 2; =
word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: =
none; text-decoration-thickness: auto; text-decoration-style: =
solid;">REPRODUCTION<br><br>&nbsp;# Using tmux 3.6b linked against =
ncurses 6.6:<br>&nbsp;$ tmux new -d -s test<br>&nbsp;$ tmux attach -t =
test<br>&nbsp;open terminal failed: not a terminal<br><br>&nbsp;This =
happens in:<br>&nbsp;- Interactive SSH sessions (ssh user@host, then =
tmux a)<br>&nbsp;- VS Code Remote integrated terminal<br>&nbsp;- PTYs =
created by script(1)<br><br>&nbsp;The ONLY working case is ssh -t host =
"tmux a -t test" (forced PTY<br>&nbsp;with terminal size forwarding from =
the SSH client).<br><br><br>ISOLATION<br><br>&nbsp;Same tmux 3.6b =
binary, different ncurses library at runtime:<br><br>&nbsp;| ncurses =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| method =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;| result =
&nbsp;|<br>&nbsp;|-------------------|------------------------------------=
-|---------|<br>&nbsp;| 6.6.20251230 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| =
default brew linkage =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;| FAIL &nbsp;&nbsp;&nbsp;|<br>&nbsp;| 6.5.20240427 =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| LD_LIBRARY_PATH=3D.../ncurses-6.5/lib | =
OK &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br>&nbsp;| 6.4 (system) =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| LD_LIBRARY_PATH=3D/lib/x86_64-linux-gnu =
| OK &nbsp;&nbsp;&nbsp;|<br><br>&nbsp;Commands to reproduce the =
isolation test:<br><br>&nbsp;&nbsp;&nbsp;# FAIL with =
6.6<br>&nbsp;&nbsp;&nbsp;script -qc 'tmux -S /tmp/t66 new -d -s x =
&amp;&amp; =
\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;tmux -S /tmp/t66 a -t x' =
/dev/null<br><br>&nbsp;&nbsp;&nbsp;# OK with =
6.5<br>&nbsp;&nbsp;&nbsp;script -qc =
'LD_LIBRARY_PATH=3D/path/to/ncurses-6.5/lib =
\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;tmux -S /tmp/t65 new -d -s x &amp;&amp; =
\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;LD_LIBRARY_PATH=3D/path/to/ncurses-6.5/lib =
\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;tmux -S /tmp/t65 a -t x' =
/dev/null<br><br><br>MECHANISM<br><br>&nbsp;tmux's server receives the =
client's PTY fd via SCM_RIGHTS, then<br>&nbsp;calls tty_init() -&gt; =
setupterm(). With ncurses 6.6, setupterm()<br>&nbsp;apparently rejects =
the terminal, causing tty_init() to return -1.<br></blockquote><br =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;">"apparently" can be used with lots of =
supporting data (actual</span><br style=3D"caret-color: rgb(0, 0, 0); =
font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
orphans: 2; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;">system calls used, along with their =
results).</span><br style=3D"caret-color: rgb(0, 0, 0); font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant-caps: =
normal; font-weight: 400; letter-spacing: normal; orphans: 2; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration-line: none; text-decoration-thickness: auto; =
text-decoration-style: solid;"><br style=3D"caret-color: rgb(0, 0, 0); =
font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
orphans: 2; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: =
solid;"><blockquote type=3D"cite" style=3D"font-family: Helvetica; =
font-size: 12px; font-style: normal; font-variant-caps: normal; =
font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; =
text-indent: 0px; text-transform: none; white-space: normal; widows: 2; =
word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: =
none; text-decoration-thickness: auto; text-decoration-style: =
solid;">&nbsp;This leaves the CLIENT_TERMINAL flag unset, and =
server_client_open()<br>&nbsp;returns "not a =
terminal".<br><br>&nbsp;strace shows the PTY is valid =E2=80=94 TCGETS =
succeeds, the fd resolves<br>&nbsp;to /dev/pts/N, and permissions are =
correct (crw--w---- owner:tty).<br></blockquote><br style=3D"caret-color: =
rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: =
normal; font-variant-caps: normal; font-weight: 400; letter-spacing: =
normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;">I don't see a trace (and in any case, this =
report deals with a large system,</span><br style=3D"caret-color: rgb(0, =
0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
orphans: 2; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;">in which things can be =
misconfigured)</span><br style=3D"caret-color: rgb(0, 0, 0); =
font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
orphans: 2; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><br =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: =
solid;"><blockquote type=3D"cite" style=3D"font-family: Helvetica; =
font-size: 12px; font-style: normal; font-variant-caps: normal; =
font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; =
text-indent: 0px; text-transform: none; white-space: normal; widows: 2; =
word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: =
none; text-decoration-thickness: auto; text-decoration-style: =
solid;">&nbsp;The tmux source code for this path is identical between =
3.4 and<br>&nbsp;3.6b, confirming the behavioral change is in ncurses, =
not tmux.<br><br><br>BUILD FLAGS (both 6.5 and 6.6 built =
with):<br><br>&nbsp;./configure --prefix=3D... --with-shared =
--with-widec \<br>&nbsp;&nbsp;&nbsp;--enable-pc-files --enable-sigwinch =
--enable-ext-colors \<br>&nbsp;&nbsp;&nbsp;--without-debug =
--without-ada<br><br><br>I haven't bisected the exact ncurses patch =
between 6.5 and 6.6 yet.<br>Happy to test patches or provide additional =
traces if helpful.<br></blockquote><br style=3D"caret-color: rgb(0, 0, =
0); font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
orphans: 2; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;">That's about 18 months of changes =
:-)</span><br style=3D"caret-color: rgb(0, 0, 0); font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant-caps: =
normal; font-weight: 400; letter-spacing: normal; orphans: 2; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration-line: none; text-decoration-thickness: auto; =
text-decoration-style: solid;"><br style=3D"caret-color: rgb(0, 0, 0); =
font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
orphans: 2; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;">--<span =
class=3D"Apple-converted-space">&nbsp;</span></span><br =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
12px; font-style: normal; font-variant-caps: normal; font-weight: 400; =
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;">Thomas E. Dickey &lt;</span><a =
href=3D"mailto:[email protected]" style=3D"font-family: =
Helvetica; font-size: 12px; font-style: normal; font-variant-caps: =
normal; font-weight: 400; letter-spacing: normal; orphans: 2; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: =
0px;">[email protected]</a><span style=3D"caret-color: rgb(0, =
0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
orphans: 2; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;">&gt;</span><br style=3D"caret-color: rgb(0, =
0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; =
font-variant-caps: normal; font-weight: 400; letter-spacing: normal; =
orphans: 2; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; widows: 2; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration-line: none; =
text-decoration-thickness: auto; text-decoration-style: solid;"><a =
href=3D"https://invisible-island.net/" style=3D"font-family: Helvetica; =
font-size: 12px; font-style: normal; font-variant-caps: normal; =
font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; =
text-indent: 0px; text-transform: none; white-space: normal; widows: 2; =
word-spacing: 0px; -webkit-text-stroke-width: =
0px;">https://invisible-island.net</a></div></blockquote></div><br></body>=
</html>=

--Apple-Mail=_20503431-5EBA-4237-9292-7A43ECD8E8D8--