<feed xmlns='http://www.w3.org/2005/Atom'>
<title>zsh/Src, branch master</title>
<subtitle>[no description]</subtitle>
<id>http://git.sudomsg.com/mirror/zsh/atom/Src?h=master</id>
<link rel='self' href='http://git.sudomsg.com/mirror/zsh/atom/Src?h=master'/>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/'/>
<updated>2026-09-01T05:22:46Z</updated>
<entry>
<title>55128: socket: unmetafy the socket name</title>
<updated>2026-09-01T05:22:46Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-08-27T13:14:00Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=60aaf9c8e0180c740d39bdb7f93d53db638c6721'/>
<id>urn:sha1:60aaf9c8e0180c740d39bdb7f93d53db638c6721</id>
<content type='text'>
This also led me to discover that if you type a leading nul in zsh, it
passes through correctly to linux and it gives us an abstract socket
instead, so document that that works, and print them properly. Also add
support for reporting the autobind socket name if you pass an empty path.

The more specific size in the bind and connect calls is due to abstract
sockets using the entire specified length, regardless of any embedded 0
bytes.
</content>
</entry>
<entry>
<title>55109: remove obsolete nameref-specific code from typeset_single</title>
<updated>2026-08-23T22:18:45Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-08-23T22:18:45Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=fdc46ea6592f5c3e54c9c9dea5052768166a7a18'/>
<id>urn:sha1:fdc46ea6592f5c3e54c9c9dea5052768166a7a18</id>
<content type='text'>
Test changes here are for extra coverage, previous tests still pass
</content>
</entry>
<entry>
<title>55061 (first part): break/continue errors in a subshell with no local loop</title>
<updated>2026-08-23T00:18:22Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-08-23T00:18:22Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=c8deeb0c88ff81a5742313bcd4630252aee055e6'/>
<id>urn:sha1:c8deeb0c88ff81a5742313bcd4630252aee055e6</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54940: Forbid (!v) substitution flags for symmetry with (v!)</title>
<updated>2026-08-23T00:10:58Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-08-23T00:10:58Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=acd444ba43483c246ded553b6714fdebf8227ab0'/>
<id>urn:sha1:acd444ba43483c246ded553b6714fdebf8227ab0</id>
<content type='text'>
</content>
</entry>
<entry>
<title>55047 (first part): Revert ${!var} in ksh mode to remove namref special case</title>
<updated>2026-08-23T00:00:11Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-08-23T00:00:11Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=556479e8eb744b0c0f7605d1f2ca8de799f3b16c'/>
<id>urn:sha1:556479e8eb744b0c0f7605d1f2ca8de799f3b16c</id>
<content type='text'>
</content>
</entry>
<entry>
<title>55026: Fix ${(!)ref::=var} substitutions for symmetry with other flags</title>
<updated>2026-08-22T23:44:43Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-08-22T23:44:43Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=a3a6ca51571e88d8089ffe2ee382d5baabae6951'/>
<id>urn:sha1:a3a6ca51571e88d8089ffe2ee382d5baabae6951</id>
<content type='text'>
</content>
</entry>
<entry>
<title>55022: descriptive names for parameter declaration CPP macros</title>
<updated>2026-08-22T23:15:29Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-08-22T23:15:29Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=48421acecda088c2cfe3ff17119efa2bd9ee5dac'/>
<id>urn:sha1:48421acecda088c2cfe3ff17119efa2bd9ee5dac</id>
<content type='text'>
</content>
</entry>
<entry>
<title>55020: fix changing flags (not type) of a TYPESET_TO_UNSET parameter</title>
<updated>2026-08-22T23:08:55Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-08-22T23:08:55Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=2225255275b7aac1baea651584a916cc8a1da98a'/>
<id>urn:sha1:2225255275b7aac1baea651584a916cc8a1da98a</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54810: use realparamtab to create and scope private variables</title>
<updated>2026-08-22T22:58:38Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-08-22T22:58:38Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=82fa8de3a332e74ca7978e1d4929f09183329337'/>
<id>urn:sha1:82fa8de3a332e74ca7978e1d4929f09183329337</id>
<content type='text'>
</content>
</entry>
<entry>
<title>55082: fix zlecs bounds checks in vimatchbracket and alignmultiwordleft</title>
<updated>2026-08-14T03:10:41Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-05-29T04:55:00Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=53de4623539a227b1eacc82399bdf76189dc679f'/>
<id>urn:sha1:53de4623539a227b1eacc82399bdf76189dc679f</id>
<content type='text'>
</content>
</entry>
<entry>
<title>55076: _exit in zexecve when the interpreter doesn't work</title>
<updated>2026-08-13T12:26:00Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-08-09T22:07:37Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=ea9578cc841829e213d3daf0f0ea30a95ed7c50c'/>
<id>urn:sha1:ea9578cc841829e213d3daf0f0ea30a95ed7c50c</id>
<content type='text'>
</content>
</entry>
<entry>
<title>55065: fix null deref in havefiles</title>
<updated>2026-08-13T12:25:59Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-08-07T10:39:53Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=bcffb5b4f5845e80e9cc75e1b9ed6d99074f89d5'/>
<id>urn:sha1:bcffb5b4f5845e80e9cc75e1b9ed6d99074f89d5</id>
<content type='text'>
This was introduced in 51404.
</content>
</entry>
<entry>
<title>55055: break: more completely enumerate loop types we are not in</title>
<updated>2026-08-05T09:41:33Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2019-05-25T19:28:33Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=50da17c2ec619bd4afc1b4af2949c1e8c788980d'/>
<id>urn:sha1:50da17c2ec619bd4afc1b4af2949c1e8c788980d</id>
<content type='text'>
</content>
</entry>
<entry>
<title>55021: prevent segfault upon "typeset -U" of a tied array hidden by a local</title>
<updated>2026-07-27T04:22:48Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-07-27T04:22:48Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=9a9af70296bfbdb5be1d9521415d87fd4accaa34'/>
<id>urn:sha1:9a9af70296bfbdb5be1d9521415d87fd4accaa34</id>
<content type='text'>
</content>
</entry>
<entry>
<title>55030: allow "typeset -hn", issue error on useless no-op "typeset -gh"</title>
<updated>2026-07-27T03:58:50Z</updated>
<author>
<name>Bart Schaefer</name>
<email>schaefer@zsh.org</email>
</author>
<published>2026-07-27T03:31:35Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=25642451465f55d76acffe7eda1273e592e0aa78'/>
<id>urn:sha1:25642451465f55d76acffe7eda1273e592e0aa78</id>
<content type='text'>
Includes unposted K01nameref test
</content>
</entry>
<entry>
<title>54994: use gdbm_fd_open so we can move the fd to &gt;9</title>
<updated>2026-07-25T05:03:05Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-07-19T16:44:51Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=c0fe1189905e6bd6ef227068478638cfb52b1255'/>
<id>urn:sha1:c0fe1189905e6bd6ef227068478638cfb52b1255</id>
<content type='text'>
This function is available since gdbm 1.13 and even debian old old
stable has 1.17, so this should be fine.
</content>
</entry>
<entry>
<title>54986: actually prevent FDT_MODULE fds from being closed by user</title>
<updated>2026-07-25T05:03:05Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-07-19T03:04:11Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=43a2b878a127f20c49907110543c54ea8c5ccda3'/>
<id>urn:sha1:43a2b878a127f20c49907110543c54ea8c5ccda3</id>
<content type='text'>
The stated goal of FDT_MODULE is:
  /*
   * Entry visible to other processes but controlled by a module.
   * The difference from FDT_EXTERNAL is that closing this using
   * standard fd syntax will fail as there is some tidying up that
   * needs to be done by the module's own mechanism.
   */
  #define FDT_MODULE		3

but this wasn't actually enforced. By accident, some fds ended up as
FDT_INTERNAL because movefd clobbers the FDT_MODULE value and those were
protected from closing. I think this straightens out all the bits
properly, at least the ones I found.

(Note that zsocket is using FDT_EXTERNAL purposefully because the user
*is* expected to close those fds with the {myfd}&gt;&amp;- syntax, it has no
specific interface to close opened sockets since it has no internal
state for them.)

Both zsocket and ztcp forgot to movefd the some of their fds which meant
it was potentially in the 0-9 range, which is also not protected from
being closed by the user, but:

Since the -d flag allows the user to put module fds at low fds, I made
the check forbid closing FDT_MODULE fds in that range too, I think
that's correct?

zftp did some very questionable things, relying on FDT_UNUSED fds to act
approximately like it expected, instead use FDT_MODULE there too.

Also make redup ensure the fdtable is big enough for the assignments
after, just for consistency, since the old addmodulefd call before
didn't necessarily grow it to the moved-to fd number.

Remove some misleading comments like
/* move the fd since no one will want to read from it */
the reason we move the fd is because we have promised the user we will
not open fds in the 0-9 range.

Also added maximum macro, and converted existing users of MIN/MAX to
them, since we have not, as far as I can tell, made any effort to check
that those macros are in fact defined by anyone.
</content>
</entry>
<entry>
<title>54985: fix crash with bracketed-paste-magic and undo</title>
<updated>2026-07-21T14:20:48Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-07-17T20:53:21Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=7708d466dfab8dd29f9ae5de12c74af37bf99a4d'/>
<id>urn:sha1:7708d466dfab8dd29f9ae5de12c74af37bf99a4d</id>
<content type='text'>
In particular, fc -P/-p didn't interact well with undo. Make sure we
store/restore histline across those calls.
</content>
</entry>
<entry>
<title>54943: Do not export named references even when ALLEXPORT is enabled</title>
<updated>2026-07-19T21:13:59Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-07-19T21:13:59Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=1caf52e3aedb46ea6a3d8a8f62da7aa29893a56b'/>
<id>urn:sha1:1caf52e3aedb46ea6a3d8a8f62da7aa29893a56b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54809: ZLE specials are always in realparamtab and can't be namerefs</title>
<updated>2026-07-19T20:34:52Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-07-19T20:34:52Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=27b7b59af8ba0e6993416436b09e7fb859311fb9'/>
<id>urn:sha1:27b7b59af8ba0e6993416436b09e7fb859311fb9</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54941: Fix saving and restoring of subscripted inline assignments</title>
<updated>2026-07-16T01:45:06Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-07-10T11:44:53Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=62103851e4e1f9825673f71861479b2570c97e2d'/>
<id>urn:sha1:62103851e4e1f9825673f71861479b2570c97e2d</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54956: init: don't reset ZLE_RPROMPT_INDENT on term init</title>
<updated>2026-07-16T01:40:33Z</updated>
<author>
<name>dana</name>
<email>dana@dana.is</email>
</author>
<published>2026-07-11T23:51:56Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=5f8a7810039e7524fec7ab3dc5d2b80b219d06e8'/>
<id>urn:sha1:5f8a7810039e7524fec7ab3dc5d2b80b219d06e8</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54927: checkptycmd: remove select()+FIONREAD variant, re-enable poll on osx</title>
<updated>2026-07-11T23:57:56Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-07-08T23:36:02Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=b5cc027f85d54bbafde54062d27e136cc46072e3'/>
<id>urn:sha1:b5cc027f85d54bbafde54062d27e136cc46072e3</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54930: zexit: don't write history in sub-shells</title>
<updated>2026-07-11T23:00:59Z</updated>
<author>
<name>dana</name>
<email>dana@dana.is</email>
</author>
<published>2026-07-09T02:56:52Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=e3344253ab814c63cc0f2acc81f885163c0ce502'/>
<id>urn:sha1:e3344253ab814c63cc0f2acc81f885163c0ce502</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54909: Untokenize before quoting unquoted literal values</title>
<updated>2026-07-08T18:40:29Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-07-05T01:04:09Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=89e8b507381b8beec263c0437b14994b39abaf0d'/>
<id>urn:sha1:89e8b507381b8beec263c0437b14994b39abaf0d</id>
<content type='text'>
% print -r - ${(q+):-foo = bar}|xxd
00000000: 2766 6f6f 208d 2062 6172 270a            'foo . bar'.
% print -r - ${(q+):-foo * bar}|xxd
00000000: 2766 6f6f 2087 2062 6172 270a            'foo . bar'.
% print -r - ${(qqqq):-foo = bar}
$'foo \215 bar'
</content>
</entry>
<entry>
<title>54783: improve checkptycmd</title>
<updated>2026-07-04T17:56:26Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-15T16:18:38Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=4b4ebccaa9666c608f18f73c5b8102cbfc8e8deb'/>
<id>urn:sha1:4b4ebccaa9666c608f18f73c5b8102cbfc8e8deb</id>
<content type='text'>
With the previous (and now fallback) version of checkptycmd(), doing
this:
zpty foo 'while read; do echo hi; done'
zpty (or zpty -t foo)

would hang forever, which seems counterintuitive to the purpose of
listing processes (or testing if a process is running).
</content>
</entry>
<entry>
<title>54889: comparguments: always parse optargs as optargs</title>
<updated>2026-07-03T11:59:42Z</updated>
<author>
<name>dana</name>
<email>dana@dana.is</email>
</author>
<published>2026-06-30T23:47:31Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=7a43a20cdfc7a4feffbd838b75d22a1be4fa417f'/>
<id>urn:sha1:7a43a20cdfc7a4feffbd838b75d22a1be4fa417f</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54876: comparguments: search more thoroughly for foreign-set options</title>
<updated>2026-07-03T11:59:40Z</updated>
<author>
<name>dana</name>
<email>dana@dana.is</email>
</author>
<published>2026-06-30T04:35:41Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=e9d0e6a8ad252c6eaceaca4301bd2b4d44570574'/>
<id>urn:sha1:e9d0e6a8ad252c6eaceaca4301bd2b4d44570574</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54831: comparguments: treat empty description as if missing</title>
<updated>2026-06-24T00:36:14Z</updated>
<author>
<name>dana</name>
<email>dana@dana.is</email>
</author>
<published>2026-06-21T02:38:38Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=2e7a39d1d5bd897d9648fc38fedf07aa061be2df'/>
<id>urn:sha1:2e7a39d1d5bd897d9648fc38fedf07aa061be2df</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54792: prevent named references from being entered as named directories</title>
<updated>2026-06-23T04:29:59Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-06-23T04:00:05Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=8a0801b83b1d8a44c021e6799b99c80d068324ad'/>
<id>urn:sha1:8a0801b83b1d8a44c021e6799b99c80d068324ad</id>
<content type='text'>
</content>
</entry>
<entry>
<title>47546: builtin: trivial cleanup</title>
<updated>2026-06-23T00:15:14Z</updated>
<author>
<name>Felipe Contreras</name>
<email>felipe.contreras@gmail.com</email>
</author>
<published>2020-11-12T17:38:22Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=334cf2b707a91bcdd7109cf91e847e3ec6c7d3e9'/>
<id>urn:sha1:334cf2b707a91bcdd7109cf91e847e3ec6c7d3e9</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54822: the ::= fix in 54674 was incomplete</title>
<updated>2026-06-21T07:26:14Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-19T19:33:34Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=c4e0b3cfd15a82261295dad8c242b874079ae79c'/>
<id>urn:sha1:c4e0b3cfd15a82261295dad8c242b874079ae79c</id>
<content type='text'>
% foo=xxx; () { echo ${2::=$foo} } yyy
yyy

We get the argv parameter returned when asking for "2" so use getvalue()
to get a vbuf with the proper start/end set instead of making up bogus
values.
</content>
</entry>
<entry>
<title>54773: params: make out-of-range (w) subscript index work like others</title>
<updated>2026-06-21T00:48:39Z</updated>
<author>
<name>dana</name>
<email>dana@dana.is</email>
</author>
<published>2026-06-14T16:41:01Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=815774384c15a0c35f2a842298a0b802493879fe'/>
<id>urn:sha1:815774384c15a0c35f2a842298a0b802493879fe</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54767: zformat: replace -qn by spec quoting indicator syntax</title>
<updated>2026-06-21T00:17:54Z</updated>
<author>
<name>dana</name>
<email>dana@dana.is</email>
</author>
<published>2026-06-14T03:59:54Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=6cf538a00f6dd9647b99854ea2335bb6d4db03e9'/>
<id>urn:sha1:6cf538a00f6dd9647b99854ea2335bb6d4db03e9</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54801: fix two more warnings from 54710</title>
<updated>2026-06-18T04:15:00Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-18T04:14:09Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=0be5cb7736d3582b5275b350518e4fad0833f186'/>
<id>urn:sha1:0be5cb7736d3582b5275b350518e4fad0833f186</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54776: fix warnings from 54710</title>
<updated>2026-06-16T08:39:58Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-15T00:08:14Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=773b790570eea3b53864f4955eaeed6c5502d024'/>
<id>urn:sha1:773b790570eea3b53864f4955eaeed6c5502d024</id>
<content type='text'>
Some compilers warn if a label immediately precedes a variable declaration.
</content>
</entry>
<entry>
<title>54771: fix a bug in nosort deduplication</title>
<updated>2026-06-16T08:39:58Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-14T05:24:38Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=1a63833e0f65b30999bc5a2404f9d893eca8d15b'/>
<id>urn:sha1:1a63833e0f65b30999bc5a2404f9d893eca8d15b</id>
<content type='text'>
Introduced in 49915.

Confusion in pointers could mark the wrong entries in some cases. Make
sure asp is incremented to the correct entry by the outer loop's
'asp++', and don't touch sp at all.

In particular, the third added test was missing the 'foo' entry:

Y01completion.ztst: starting.
--- expected
+++ actual
@@ -1,4 +1,3 @@
 line: {tst }{}
-NO:{foo}
 NO:{bar}
 NO:{baz}
Was testing: nosort dedup with three same-string non-duplicates
</content>
</entry>
<entry>
<title>54764: zerrmsg: handle null pointers with %s/%l</title>
<updated>2026-06-16T03:15:01Z</updated>
<author>
<name>dana</name>
<email>dana@dana.is</email>
</author>
<published>2026-06-13T03:33:03Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=13f4336d4e20c6230991d834949f897af625d13f'/>
<id>urn:sha1:13f4336d4e20c6230991d834949f897af625d13f</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54762: make curjob and prevjob work better</title>
<updated>2026-06-13T23:57:17Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-12T21:00:26Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=8ca612cfe2ace3819656c483dcc3822da6b63f01'/>
<id>urn:sha1:8ca612cfe2ace3819656c483dcc3822da6b63f01</id>
<content type='text'>
In particular, these two sequences were still broken after 54294:

% v() { vim "$@"; }; v
[suspend vim]
% urxvt &amp;
[3] 12707
% bg %-
bg: job already in background
% fg
[1]    continued
[exit vim]
% fg
before:
fg: no current job
after:
[3]  + running    urxvt

% sleep 100
^Z
zsh: suspended  sleep 100
% bg
[1]    continued  sleep 100
% fg
before
fg: no current job
after:
[1]  - running    sleep 100

The changed test expected the sole remaining job to be %- which should
not be possible, and now it is properly %+ instead.
</content>
</entry>
<entry>
<title>54753: zpty: register pty fd as FDT_MODULE so it isn't closed when forking</title>
<updated>2026-06-13T23:57:17Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-11T04:34:30Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=807eac8dff2b2281ac7cf52ebd8c7b73fa358e37'/>
<id>urn:sha1:807eac8dff2b2281ac7cf52ebd8c7b73fa358e37</id>
<content type='text'>
This lets us remove these mysterious braces too.
</content>
</entry>
<entry>
<title>54721: illegal -&gt; invalid, invalid option -&gt; bad option</title>
<updated>2026-06-13T23:57:17Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-09T00:46:16Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=52c23c9c2c3cbba08ed548a77cd2737df478f371'/>
<id>urn:sha1:52c23c9c2c3cbba08ed548a77cd2737df478f371</id>
<content type='text'>
Combinations of options can remain invalid, though.
</content>
</entry>
<entry>
<title>54715: compctl: print multibyte errors correctly (phew)</title>
<updated>2026-06-13T23:57:17Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-07T04:13:45Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=a353b36183225c1aaee086a0c8752fe7ece092ee'/>
<id>urn:sha1:a353b36183225c1aaee086a0c8752fe7ece092ee</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54714: add MB_NICECHAR and use it</title>
<updated>2026-06-13T23:57:17Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-08T18:57:06Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=f9d159b88ab8ea843a3231cadd0c0b57da74cc8b'/>
<id>urn:sha1:f9d159b88ab8ea843a3231cadd0c0b57da74cc8b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54713: fix multibyte error reporting in zparseopts</title>
<updated>2026-06-13T23:57:08Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-06T20:46:14Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=9977df3608fa01663a31425b6233fcc15f0cf679'/>
<id>urn:sha1:9977df3608fa01663a31425b6233fcc15f0cf679</id>
<content type='text'>
This one is complicated by the fact it's using fprintf. If the user
passed a nonprintable char as an option, we shouldn't print that, which
nicechar handles for us.

Fixes 54077.
</content>
</entry>
<entry>
<title>54712: handle the Pound token in error message</title>
<updated>2026-06-13T23:56:15Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-07T01:45:55Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=fe4868147fab048bdb97bcc236fa43029a132d35'/>
<id>urn:sha1:fe4868147fab048bdb97bcc236fa43029a132d35</id>
<content type='text'>
otherwise we print this:
parse error in ${...\M-D...} substitution

In practice, I'm not sure how to hit this path, I uncommented the
condition to test it.
</content>
</entry>
<entry>
<title>54711: print invalid option to getopts correctly</title>
<updated>2026-06-13T23:56:15Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-06T23:44:29Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=182bef391e514b7e3b905212e18f3ad3c5dcc967'/>
<id>urn:sha1:182bef391e514b7e3b905212e18f3ad3c5dcc967</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54710: handle multibyte arguments in error messages</title>
<updated>2026-06-13T23:56:15Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-06T23:48:20Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=e5f58a80ba5124735d6434845ea382a5db1f1875'/>
<id>urn:sha1:e5f58a80ba5124735d6434845ea382a5db1f1875</id>
<content type='text'>
A lot of places check option strings char by char, then send that char
to zwarn/zerr, instead of reading out the full multibyte character.
Doing so is quite easy with unmeta_one in most cases, so just go ahead
and do that. The print functions in fact expect a wchar_t for %c anyway.

Also renames "unknown option" to "bad option" because that's what every
other place calls it (also one place was missing the colon, added that).

To reproduce the math errors, since it's slightly less obvious (you need
a multibyte character that is also an invalid parameter name, otherwise
it actually works fine)
% zsh -c '(( ¯ ))'
zsh:1: bad math expression: illegal character: ^
% zsh -c 'zmodload zsh/mathfunc; (( sin(1¯) ))'
zsh:1: bad math expression: illegal character: ^
% zsh -c 'の=5; echo $(( の ))' # unchanged because it is working
5

Also adds some tests because B12 was looking very empty, not sure if
this is the correct way to handle the intersection of possibly not
compiled module with possibly not available UTF-8 locale, but X02 and
some others do a similar thing with ZSH_TEST_LANG, though in those cases
that's handled specially by comptest, not the test itself.
</content>
</entry>
<entry>
<title>unposted: kill: fix -l argument error, add tests</title>
<updated>2026-06-11T01:47:14Z</updated>
<author>
<name>dana</name>
<email>dana@dana.is</email>
</author>
<published>2026-06-11T01:44:59Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=8d4b0f6511d24dfa54141a2eaf5d276b2a3cfbd7'/>
<id>urn:sha1:8d4b0f6511d24dfa54141a2eaf5d276b2a3cfbd7</id>
<content type='text'>
fixes this issue:

  % kill -l 6term
  kill: unknown signal: SIGterm
</content>
</entry>
<entry>
<title>54731: Adapt gdbm code to named references</title>
<updated>2026-06-10T04:06:12Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-06-10T04:06:12Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=adcc9a1c228a3b7b38675541103ddd69c779d88e'/>
<id>urn:sha1:adcc9a1c228a3b7b38675541103ddd69c779d88e</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54727: Implement references to positional parameters</title>
<updated>2026-06-10T03:47:57Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-06-10T03:41:40Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=934b1551092546b7902392c4ccf91a87dbb24343'/>
<id>urn:sha1:934b1551092546b7902392c4ccf91a87dbb24343</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54722: Fix nameref issues in builtin "unset"</title>
<updated>2026-06-10T03:47:57Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-06-09T01:16:06Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=f0d4e4cb52a96642363d4e06178f658ea3d542a9'/>
<id>urn:sha1:f0d4e4cb52a96642363d4e06178f658ea3d542a9</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54707: fix autoload +X nonexist leaving funcdef at dummy</title>
<updated>2026-06-10T03:20:52Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-08T16:35:18Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=9702f0a4efe8d41859f823f45083521317e3b8b4'/>
<id>urn:sha1:9702f0a4efe8d41859f823f45083521317e3b8b4</id>
<content type='text'>
% autoload +X nonexist
zsh:999: nonexist: function definition file not found
% nonexist
 exec.c:6086: function definition nonexist has zero reference count

All the paths that set shf-&gt;funcdef in loadautofn call freeeprog on
the old one first anyway, so rather than make a new mkautofn if
loadautofn fails, just keep the old one.
</content>
</entry>
<entry>
<title>54705: ksh93: fix use after free of .sh.edchar</title>
<updated>2026-06-10T03:20:52Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-08T14:59:27Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=5fc00ccd292609e8974f5f87cb2bbd5f34504e57'/>
<id>urn:sha1:5fc00ccd292609e8974f5f87cb2bbd5f34504e57</id>
<content type='text'>
% bindkey T foo
% zle -N foo
% foo() { emulate -L ksh; () { zle -M ${.sh.edchar} } }
% zmodload zsh/ksh93
% [press T twice]
\M-(\M-^Ak\M-&lt;\M-G^?

or alternatively, emulate ksh in the main shell and just define this,
but then you have to make sure you're in a zsh -f shell so random things
aren't entering functions in the background.
% foo() { zle -M ${.sh.edchar} }

the code tries to restore sh_edchar = sh_unsetval; in the else branch,
but this doesn't ever run in the above scenario because we never enter
or leave a function with ksh emulation enabled (or indeed at all).
</content>
</entry>
<entry>
<title>54704 + 54728: remove obsolete workaround in ksh93 module</title>
<updated>2026-06-10T03:20:52Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-08T14:16:27Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=a2b3c7afa01e34d33a7bb4a2fc2b8c7987e2f9cd'/>
<id>urn:sha1:a2b3c7afa01e34d33a7bb4a2fc2b8c7987e2f9cd</id>
<content type='text'>
After 54475 changed deleteparamdef to use getnode2 instead, this
workaround isn't needed anymore.
</content>
</entry>
<entry>
<title>54696: unset REPLY before e:: and oe:: so things don't break if it had acquired a weird type</title>
<updated>2026-06-10T03:20:52Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-07T09:08:04Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=302567cf24385d3b273bed5fb4f288a885770012'/>
<id>urn:sha1:302567cf24385d3b273bed5fb4f288a885770012</id>
<content type='text'>
Reported in 43032.
</content>
</entry>
<entry>
<title>54693: show ARGV0 and - precommand more clearly in xtrace output</title>
<updated>2026-06-10T03:20:51Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-07T06:11:15Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=ff742aa0adaa85ce77b019e500272237bafaafd0'/>
<id>urn:sha1:ff742aa0adaa85ce77b019e500272237bafaafd0</id>
<content type='text'>
Reported in 48901.

Also has a secondary effect of correcting the string sent to the
command_not_found_handler. If you don't have such a handler, then the
errors are correct before the patch as well.

command_not_found_handler() { echo -E &gt;&amp;2 command not found: $1 }

Before:
% ARGV0=foobar blurg
zsh:1&gt; ARGV0=foobar foobar
command not found: foobar
% - blurg
+zsh:1&gt; -blurg
command not found: -blurg
% ARGV0=foobar - blurg
+zsh:1&gt; ARGV0=foobar foobar
command not found: foobar

After:
% ARGV0=foobar blurg
+zsh:1&gt; ARGV0=foobar blurg
command not found: blurg
% - blurg
+zsh:1&gt; - blurg
command not found: blurg
% ARGV0=foobar - blurg
+zsh:1&gt; ARGV0=foobar - blurg
command not found: blurg
</content>
</entry>
<entry>
<title>54692: untokenize string sent to matheval for (#) flag</title>
<updated>2026-06-10T03:20:51Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-07T05:37:36Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=bba21b0ccadd999362ba1193b9909c512fee1c7d'/>
<id>urn:sha1:bba21b0ccadd999362ba1193b9909c512fee1c7d</id>
<content type='text'>
Fixes 49409.
</content>
</entry>
<entry>
<title>54691: fix :W and :w duplicating input</title>
<updated>2026-06-10T03:20:51Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-07T04:53:33Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=5bb0960729b86a360be153b35a2e7f92a2d8ade3'/>
<id>urn:sha1:5bb0960729b86a360be153b35a2e7f92a2d8ade3</id>
<content type='text'>
Reported in 50991 and introduced in 22525.
</content>
</entry>
<entry>
<title>54688: handle Stéphane correctly</title>
<updated>2026-06-10T03:20:51Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-06T14:40:12Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=2136ff7f5045c963e5a41e920350b9a884752492'/>
<id>urn:sha1:2136ff7f5045c963e5a41e920350b9a884752492</id>
<content type='text'>
In the original report we had [[ é = *$'\xa9' ]] which has op == P_STAR,
in this case charstart is filled out inline, in the other cases it's
done by the patrepeat function. If ptlen &gt; P_LS_LEN(next) we have
returned, if it is &lt; then we have backtracked into the region where
charstart is valid and we can check that, and finally if they are equal
we know we are on a valid character boundary (but charstart might not be
valid here, in fact multiple tests fail if you leave out the ptlen
check).

Separately,
% [[ éé = é#$'\xa9' ]]; echo $?
 pattern.c:4113: closure following more than one character
0
% [[ éé = (é)#$'\xa9' ]]; echo $?
1
so just treat multibyte single characters as "not simple", which fixes
that case too.
</content>
</entry>
<entry>
<title>54687: fix brace completion</title>
<updated>2026-06-10T03:20:51Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-06T02:39:12Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=b652243ee40abbc325531c77fbb19be42ea917a6'/>
<id>urn:sha1:b652243ee40abbc325531c77fbb19be42ea917a6</id>
<content type='text'>
% mkdir 'a b c'; touch 'a b c'/{'a b c','d e f'}
% ls a\ b\ c/{&lt;tab&gt;
corrupts the command line into
% ls a\ b\ {c/
and the effect is worse the more backslashes there are. It seems like
this code should simply always use bp-&gt;qpos so there is no reason to
keep hasunqu around either.

For the compctl path, the curpos members need to be whatever they're
determined to be at the start by addwhat for the comparison with ppl and
psl, so just fix them at the end before add_match_data.

The quotename in get_comp_string fixes subsequent completions, eg
% ls a\ b\ c/{a\ b\ c,&lt;tab&gt;
</content>
</entry>
<entry>
<title>54686: count lines in showmsg more correctly</title>
<updated>2026-06-10T03:20:51Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-06T02:12:33Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=ef1cd684ccb068a698ae2a7da28597259c1c3308'/>
<id>urn:sha1:ef1cd684ccb068a698ae2a7da28597259c1c3308</id>
<content type='text'>
If you do this,
wide() { zle -M ${(l:$COLUMNS::a:)} }; zle -N wide; bindkey W wide
then we would move the cursor up one row too many after printing the
message.

The hunks with 1 + are triggered by this (one is MULTIBYTE the other not),
wide() { zle -M ${(l:$COLUMNS::a:)}$'\n'b }; zle -N wide; bindkey W wide
</content>
</entry>
<entry>
<title>54683: fix for ctrl-r with combining characters or nonprintable wide chars</title>
<updated>2026-06-10T03:20:50Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-05T15:36:31Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=0ee2835f13ae19a04a3b1e5d27476d35e7a04634'/>
<id>urn:sha1:0ee2835f13ae19a04a3b1e5d27476d35e7a04634</id>
<content type='text'>
Typing one of these characters in isearch caused the terminal cursor to
jump to the wrong row, and various other problems, because we totally
lost track of things.

Make use of addmultiword() to draw the combining characters, analogously
to how the main input line does it. This resolves ccs/vcs getting out of
sync with the display, because there are no top level glyphs of zero
width anymore.

The code seems to simply have forgotten about nonprintable wide
characters that weren't ascii control characters, so handle those like
in the main line redraw code.

I didn't bother handling the ZSH_INVALID_WCHAR range because I don't see
how you could possibly insert one of those in the isearch buffer. If you
manage to do this, congratulations.
</content>
</entry>
<entry>
<title>54674: ::= didn't respect parameter flags</title>
<updated>2026-06-10T03:20:50Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-04T07:06:02Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=e5e9caa2ee2188444e06ea1e162eb23375ca7538'/>
<id>urn:sha1:e5e9caa2ee2188444e06ea1e162eb23375ca7538</id>
<content type='text'>
The documentation says
    ${name::=word}
          In  the first form, if name is unset then set it to word; in
          the second form, if name is unset or null then set it to word;
          and in the third form, unconditionally  set name to word.  In
          all forms, the value of the parameter is then substituted.

Particularly that "the value of the parameter is substituted", not "the
word is substituted".

This is what happens before the fix, and similarly for array flags like "unique":

% typeset -E3 fl; hi=5; echo ${fl::=hi}
hi
% echo $fl
5.00e+00
</content>
</entry>
<entry>
<title>54676: preserve COLUMNS + LINES from the environment</title>
<updated>2026-06-09T02:11:58Z</updated>
<author>
<name>dana</name>
<email>dana@dana.is</email>
</author>
<published>2026-06-05T04:23:29Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=d7da0f59fc86f1e5d6465ea0b0ca4b93d6a31d54'/>
<id>urn:sha1:d7da0f59fc86f1e5d6465ea0b0ca4b93d6a31d54</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54659: comparguments: support zsh-style '-' terminator with -S -S</title>
<updated>2026-06-09T00:53:13Z</updated>
<author>
<name>dana</name>
<email>dana@dana.is</email>
</author>
<published>2026-06-02T02:15:13Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=0e2f4f282191f13c3e32969b38483dcde9301c86'/>
<id>urn:sha1:0e2f4f282191f13c3e32969b38483dcde9301c86</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54718: Remove support for named references to subscripted variables</title>
<updated>2026-06-09T00:39:39Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-06-09T00:39:39Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=2d3f0b346cdc9ce29f416db26d7a76ccfe90a1ec'/>
<id>urn:sha1:2d3f0b346cdc9ce29f416db26d7a76ccfe90a1ec</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54475: Don't perform dereferencing when looking up certain special parameters</title>
<updated>2026-06-09T00:19:08Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-06-09T00:19:08Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=edd6cc82994c6c6741aa32b7bd794128a721f6e4'/>
<id>urn:sha1:edd6cc82994c6c6741aa32b7bd794128a721f6e4</id>
<content type='text'>
Tweaked to account for workers/54328
</content>
</entry>
<entry>
<title>54700: Refine string and array slice assignments</title>
<updated>2026-06-08T23:59:37Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-06-08T23:59:37Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=2327604d026f9dd6dce806f1d7e7d3c125d2d4e4'/>
<id>urn:sha1:2327604d026f9dd6dce806f1d7e7d3c125d2d4e4</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54294: Fix %- (prevjob) picking wrong job after resuming</title>
<updated>2026-06-08T22:29:22Z</updated>
<author>
<name>Mikel Ward</name>
<email>mikel@mikelward.com</email>
</author>
<published>2026-06-08T22:29:22Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=93c286c624d52a9c9bced63d396dc4b2fa80ce99'/>
<id>urn:sha1:93c286c624d52a9c9bced63d396dc4b2fa80ce99</id>
<content type='text'>
Also corrects exit status of "wait %%" (TBD from workers/43945)
</content>
</entry>
<entry>
<title>54278: Detect invalid variable names in reference initializers</title>
<updated>2026-06-08T22:01:06Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-06-08T22:01:06Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=b2629b4cf81f63471e6c52df407d8aca669da6ea'/>
<id>urn:sha1:b2629b4cf81f63471e6c52df407d8aca669da6ea</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54277: reference loops are detected at create time, remove loop tagging</title>
<updated>2026-06-08T21:46:19Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-06-08T21:46:19Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=501d393732f4d2100ed15750f95d984078eafb5e'/>
<id>urn:sha1:501d393732f4d2100ed15750f95d984078eafb5e</id>
<content type='text'>
</content>
</entry>
<entry>
<title>unposted: fix NULL termination in ksh93</title>
<updated>2026-06-08T14:37:19Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-08T14:29:59Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=28a41561748f0d0a14e1af7656f07242818ed3d9'/>
<id>urn:sha1:28a41561748f0d0a14e1af7656f07242818ed3d9</id>
<content type='text'>
I'm not sure how I messed this up in 54558, but now it should be
actually correct. I even tested it:

% [[ foo = (#m)(#b)f(o)o ]]
% zmodload -F zsh/ksh93 p:.sh.match
% () { setopt localoptions ksharrays; typeset -p .sh.match }
typeset -g -ar .sh.match=( foo o )
</content>
</entry>
<entry>
<title>54672: use bangchar instead of this hardcoded !</title>
<updated>2026-06-07T10:45:30Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-01T22:14:40Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=5cce599495b348af4acf69be3af4914d5cba7672'/>
<id>urn:sha1:5cce599495b348af4acf69be3af4914d5cba7672</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54671: fix anchored pattern with --disable-multibyte</title>
<updated>2026-06-07T10:45:30Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-06-04T04:44:16Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=dda9d01fde4f6d692c1d66f458583abd0f084ef3'/>
<id>urn:sha1:dda9d01fde4f6d692c1d66f458583abd0f084ef3</id>
<content type='text'>
Just copied this code over from the multibyte branch.
</content>
</entry>
<entry>
<title>54669: add --disable-link-all-libs configure option</title>
<updated>2026-06-07T10:45:29Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-05-27T03:39:30Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=1426a4dfdc2eccbcbf0c2583efd802e4169b487b'/>
<id>urn:sha1:1426a4dfdc2eccbcbf0c2583efd802e4169b487b</id>
<content type='text'>
When this is used, libraries only needed by specific modules will only
be linked to those modules (currently libgdbm and libpcre2). When
--enable-cap is used, the main shell also uses libcap functions so we
want to link that either way.

Speaking of the cap module, it did some weird thing where it always
compiles but creates useless builtins that only error, which means you
can't rely on zmodload to check if they'll work. I'm sure someone will
complain about me changing this but I'm going to at least try it and see
if someone has a good reason for it.

The gdbm module also has a big ifdef for the whole module, but instead
of dummy builtins it just does #error, so remove that. We won't try to
compile it if the user didn't ask for it, and if the user asked for it
and it wouldn't compile, configure won't create a Makefile. Using the
ac_cv_ cache variables in db_gdbm.mdd also doesn't actually work
properly, those will remain set and enable the module to be linked after
you pass --disable-gdbm and you will get the aforementioned #error. Use
the enable_gdbm variable instead, like pcre.mdd does (and also cap.mdd
now that I evilly made it conditional on --enable-cap).
</content>
</entry>
<entry>
<title>54328: Only ever turn global parameters into named directories</title>
<updated>2026-06-04T04:26:38Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-04-10T22:59:53Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=9ca111beeea8e9dbdd3d73f49aae15b3645a65f9'/>
<id>urn:sha1:9ca111beeea8e9dbdd3d73f49aae15b3645a65f9</id>
<content type='text'>
see also 54299, 54309, 54340
</content>
</entry>
<entry>
<title>54340: Remove partial duplication of strsetfn and arrsetfn</title>
<updated>2026-06-04T04:22:44Z</updated>
<author>
<name>Philippe Altherr</name>
<email>philippe.altherr@gmail.com</email>
</author>
<published>2026-04-12T12:07:33Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=b6acc7eb43dcf4d7074beded444a8867f12d884c'/>
<id>urn:sha1:b6acc7eb43dcf4d7074beded444a8867f12d884c</id>
<content type='text'>
</content>
</entry>
<entry>
<title>44874: fix a memory leak and potential heap corruption when rotating lines</title>
<updated>2026-06-04T03:46:11Z</updated>
<author>
<name>Roman Perepelitsa</name>
<email>roman.perepelitsa@gmail.com</email>
</author>
<published>2019-10-28T11:11:20Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=feee3e825659ec5ad49796ef25d843850aa90511'/>
<id>urn:sha1:feee3e825659ec5ad49796ef25d843850aa90511</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54624: parse_class would underallocate if posix character classes are used</title>
<updated>2026-06-04T03:46:11Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-05-27T16:43:44Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=bba0ec5f2fbee208e17496218b560341a2ac2aec'/>
<id>urn:sha1:bba0ec5f2fbee208e17496218b560341a2ac2aec</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54620: fix check for when to hash commands</title>
<updated>2026-06-04T03:46:09Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-05-26T17:30:47Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=d092cf6f18f9ba15e9709ed11aafd7e13cf7ae7a'/>
<id>urn:sha1:d092cf6f18f9ba15e9709ed11aafd7e13cf7ae7a</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54617: fix lookup in $commands array when hashlistall is unset</title>
<updated>2026-06-04T03:45:50Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-05-26T15:24:40Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=0883f8fec6d08780229f239ce0c3455efe19a198'/>
<id>urn:sha1:0883f8fec6d08780229f239ce0c3455efe19a198</id>
<content type='text'>
While the documentation for the zsh/parameter module does state
  The zsh/parameter module gives access to some of the internal hash tables
and
  commands
    This array gives access to the command hash table.
, the latter entry does *also* say
  values are the pathnames of the files that would be executed when
  the command would be invoked.

Change getpmcommand to always do a lookup via findcmd() if it the entry
is not found in the hash and HASHLISTALL is unset. This will indirectly
respect HASHCMDS and add the single entry if it is set, look it up in
the hash if it was added and then HASHCMDS was unset, etc.
</content>
</entry>
<entry>
<title>unposted: remove further remnant of restricted mode</title>
<updated>2026-06-04T02:14:47Z</updated>
<author>
<name>Oliver Kiddle</name>
<email>opk@zsh.org</email>
</author>
<published>2026-06-04T02:14:47Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=e1a4d5204a824124d4d4593855deeba9d7fa56b2'/>
<id>urn:sha1:e1a4d5204a824124d4d4593855deeba9d7fa56b2</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54644: init: add patchlevel to --version output</title>
<updated>2026-06-02T00:00:21Z</updated>
<author>
<name>dana</name>
<email>dana@dana.is</email>
</author>
<published>2026-05-31T00:56:30Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=48fa360ea48f08bb4944549bcf6df31149329383'/>
<id>urn:sha1:48fa360ea48f08bb4944549bcf6df31149329383</id>
<content type='text'>
</content>
</entry>
<entry>
<title>49374: Show patchlevel in version string</title>
<updated>2026-06-01T23:55:33Z</updated>
<author>
<name>Wesley Schwengle</name>
<email>wesley@opperschaap.net</email>
</author>
<published>2021-09-03T17:38:03Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=494b3c9e5f7abb6238c5579d4c4f80a09ea086d2'/>
<id>urn:sha1:494b3c9e5f7abb6238c5579d4c4f80a09ea086d2</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54625: remove .cvsignore</title>
<updated>2026-05-30T04:23:34Z</updated>
<author>
<name>dana</name>
<email>dana@dana.is</email>
</author>
<published>2026-05-29T05:04:51Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=8714db6175ba78f91adc51c84cf7d2c27b9fdebe'/>
<id>urn:sha1:8714db6175ba78f91adc51c84cf7d2c27b9fdebe</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54603 (tweaked): zsh_eval_context: add math context</title>
<updated>2026-05-28T03:47:19Z</updated>
<author>
<name>dana</name>
<email>dana@dana.is</email>
</author>
<published>2026-05-23T20:45:10Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=df757b8882baad6acadcd23dbc3251a1c65b6217'/>
<id>urn:sha1:df757b8882baad6acadcd23dbc3251a1c65b6217</id>
<content type='text'>
tweaked to add void to prototype

+ NEWS update
</content>
</entry>
<entry>
<title>unposted: zformat: pass through %) with -q</title>
<updated>2026-05-28T03:42:51Z</updated>
<author>
<name>dana</name>
<email>dana@dana.is</email>
</author>
<published>2026-05-28T03:28:37Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=c14a702e471a7fc91fbb41ca5c04c1b8bc172110'/>
<id>urn:sha1:c14a702e471a7fc91fbb41ca5c04c1b8bc172110</id>
<content type='text'>
the behaviour in the original patch was not actually desirable
</content>
</entry>
<entry>
<title>54602: zformat: add -qQ options to auto-escape %s</title>
<updated>2026-05-28T03:35:22Z</updated>
<author>
<name>dana</name>
<email>dana@dana.is</email>
</author>
<published>2026-05-23T07:01:44Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=26d9cb019087a2ee0bfc9ea8c94fb914bf968237'/>
<id>urn:sha1:26d9cb019087a2ee0bfc9ea8c94fb914bf968237</id>
<content type='text'>
+ NEWS update
</content>
</entry>
<entry>
<title>54589: remove dead code identified by scan-build</title>
<updated>2026-05-26T15:02:58Z</updated>
<author>
<name>Oliver Kiddle</name>
<email>opk@zsh.org</email>
</author>
<published>2026-05-26T14:22:16Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=f2be63b88bc4723bff8fb26ea3e5c10e733eb0b4'/>
<id>urn:sha1:f2be63b88bc4723bff8fb26ea3e5c10e733eb0b4</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54615: fix ambiguous dangling from 54595</title>
<updated>2026-05-25T23:56:02Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-05-25T23:54:53Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=a633776867204a4416ba20ed7c1535c788ae84b5'/>
<id>urn:sha1:a633776867204a4416ba20ed7c1535c788ae84b5</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54609: fix accept-and-hold completion for words with leading quotes</title>
<updated>2026-05-25T05:10:42Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-05-24T14:09:00Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=054975eefc5e6f03548c972025ae23401dfc449b'/>
<id>urn:sha1:054975eefc5e6f03548c972025ae23401dfc449b</id>
<content type='text'>
The intention here was probably to skip leading braces, but the code
is a no-op because m-&gt;qipl is 0 in that case. When there is a quote, we
don't want to skip it, so just remove that thing.

There can never be a combination of both cases, "{&lt;tab&gt; will quote the
brace and not actually do brace completion, and for {"&lt;tab&gt; other code
will remove the " because we only handle leading quotes (I think?).
</content>
</entry>
<entry>
<title>54609 + 54606: additional fixes for interactive menu selection</title>
<updated>2026-05-25T05:10:42Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-05-23T22:15:31Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=d783c155f8061c442a7a499c3553606f63d33075'/>
<id>urn:sha1:d783c155f8061c442a7a499c3553606f63d33075</id>
<content type='text'>
Both of these involve we being incorrect, the we = wb + modelen hunk
fixes this problem:

% : &lt;cursor here&gt;; foobar
start interactive menu selection, type doc/z/ and hit tab, then select
one of the files, you end up with
% : Doc/Zsh/arith.yo&lt;cursor here&gt;[suffix space]h/; foobar

The other hunk is for when there is a leading quote in the word being
completed, like "NE being incorrectly completed to "NEWS"E

During completion, the quote tokens are temporarily removed, and we is
decremented (this all happens in get_comp_string, around the parts
involving skipchars, I would advice not looking too closely). Then the
complist code restores the original string via setmline but forgot to
restore we. I don't think there's any point in trying to track exactly
how many characters were deleted to add them back, just set it back to
the cursor position.
</content>
</entry>
<entry>
<title>54601: fix complist interactive mode overwriting buffer</title>
<updated>2026-05-25T05:10:42Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-05-10T19:28:49Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=00181813dc7e2c8c7ce864d0191b90da9a329670'/>
<id>urn:sha1:00181813dc7e2c8c7ce864d0191b90da9a329670</id>
<content type='text'>
This has been discussed a few times starting with 49242, and continued
at 50412, 50422, 52312 and 52657.

reproduce recipe:
% zmodload zsh/complist
% bindkey '^I' menu-select
% MENUMODE=interactive
% touch test{1,2}
% : ; foobar
    ^ 1. Type the above line in its entirety.
      2. Place the cursor before the ;
      3. Press Tab.
      4. Press Enter.
% : test1 bar
    ^ Completion is written over existing buffer contents.

The main confusing thing to note is that do_single looks at minfo.cur,
whether you pass it or not, because minfo is a global variable. When it
is not NULL, it uses minfo.pos and minfo.len which are stale in these
particular situations. When it is instead NULL, it recalculates them
correctly for us, which is what we want.

The two different hunks are separate code paths for accepting the
completion or navigating to another match.
</content>
</entry>
<entry>
<title>54600: fix metafy stuff in add_autoload_function</title>
<updated>2026-05-25T05:10:42Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-05-23T05:40:07Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=24a98c9f5114c3d8d959344765e10a7835afb447'/>
<id>urn:sha1:24a98c9f5114c3d8d959344765e10a7835afb447</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54599: use correct buf size in cancd</title>
<updated>2026-05-25T05:10:42Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-05-23T04:48:45Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=fb8eb42874a41de41a8e1adfba96ef6fa6308561'/>
<id>urn:sha1:fb8eb42874a41de41a8e1adfba96ef6fa6308561</id>
<content type='text'>
When path is metafied, it can be longer than PATH_MAX, so use MAXCMDLEN.
Using ztrlen &gt;= PATH_MAX instead of strlen &gt;= MAXCMDLEN is just a minor
optimization to avoid the syscall if we know the path is too long anyway,
but it's not worth doing this extra check on the result of the snprintf
call (probably).
</content>
</entry>
<entry>
<title>54598: fix getfpfunc metafication</title>
<updated>2026-05-25T05:09:00Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-05-23T04:18:35Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=f21ea7321b977ec9a3e078e25ef8f5607cbf1797'/>
<id>urn:sha1:f21ea7321b977ec9a3e078e25ef8f5607cbf1797</id>
<content type='text'>
It wouldn't load functions if they or the directory they were in had a
metafied byte in the name, for example れ has a 0x82 byte.

One detail to note here is the try_dump_file call using the unmetafied
ppu path, and then metafied function name s. That's correct because it's
comparing s with the function name inside the dumpfile, which is metafied.
</content>
</entry>
<entry>
<title>54597: hashcmd could reject valid paths to hash if they had metafied characters</title>
<updated>2026-05-25T05:07:39Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-05-23T03:25:10Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=82a18fb3124420f4c0f6c953362d393b118501b8'/>
<id>urn:sha1:82a18fb3124420f4c0f6c953362d393b118501b8</id>
<content type='text'>
And the iscom takes care of paths that are actually too long for us.
</content>
</entry>
<entry>
<title>54596: pathprog used a signed char as a buffer size</title>
<updated>2026-05-25T05:05:10Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-05-23T03:15:42Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=dc27c35a72328ce0a4b8c37f78e289d1ec50192f'/>
<id>urn:sha1:dc27c35a72328ce0a4b8c37f78e289d1ec50192f</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54595: overflow check in isreallycom</title>
<updated>2026-05-25T05:05:10Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-05-23T03:08:50Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=80f30feb7822aa9976b72201d1bf21f52a970796'/>
<id>urn:sha1:80f30feb7822aa9976b72201d1bf21f52a970796</id>
<content type='text'>
</content>
</entry>
<entry>
<title>54594: fix two very similar coverity issues</title>
<updated>2026-05-25T05:05:09Z</updated>
<author>
<name>Mikael Magnusson</name>
<email>mikachu@gmail.com</email>
</author>
<published>2026-05-08T13:12:57Z</published>
<link rel='alternate' type='text/html' href='http://git.sudomsg.com/mirror/zsh/commit/?id=734a26d6ae88a436d477bf1855c90fcb4b581320'/>
<id>urn:sha1:734a26d6ae88a436d477bf1855c90fcb4b581320</id>
<content type='text'>
Coverity CID 1255838 stack buffer overflow in execute()
Coverity CID 1255846 stack buffer overflow in findcmd()

This can be triggered by inserting long entries manually, then using
=foo expansion. Unfortunately, it is also possible to overflow buf by
importing a PATH entry that's over 4xPATH_MAX characters long.

There was also some related confusion about how long a path can be and
when/how to check the length of metafied strings, so fix all that up
too. Use MAXCMDLEN (which is PATH_MAX*4) for metafied strings, though
this is a little overkill, metafication can only double the length. We
do not at least need the +1 at the end. PATH_MAX includes the
terminating nul byte, so we make sure to not be off-by-one on our ztrlen
checks too.

The hunks in execute() are quite specific about the ztrlen length so it
can continue checking or return the correct error, while findcmd() just
relies on RET_IF_COM to work correctly instead.

Somewhat unrelated change that snuck in, return 127 when the command is
too long like the other exec failures, because I had to add a new
return anyway.
</content>
</entry>
</feed>
