Re: [LFS Trac] #5956: vim-9.2.0725 (Security Update) (was: vim-9.2.0699 (Security Update))

LFS Trac ([email protected] via lfs-book Mailing List) <[email protected]> Thu, 25 Jun 2026 18:25:35 -0000
Newsgroups gmane.linux.lfs.book
Message-ID <[email protected]>
#5956: vim-9.2.0725 (Security Update)
-------------------------+-----------------------
 Reporter:  Joe Locash   |       Owner:  lfs-book
     Type:  enhancement  |      Status:  new
 Priority:  normal       |   Milestone:  13.1
Component:  Book         |     Version:  git
 Severity:  normal       |  Resolution:
 Keywords:               |
-------------------------+-----------------------
Changes (by Joe Locash):

 * summary:  vim-9.2.0699 (Security Update) => vim-9.2.0725 (Security
              Update)

Comment:

 {{{
 Out-of-bounds Write in SAL Soundfolding in Vim < 9.2.0725
 =========================================================
 Date: 24.06.2026
 Severity: Medium
 CVE: *requested, not yet assigned*
 CWE: Out-of-bounds Write (CWE-787)

 ## Summary
 The single-byte branch of `spell_soundfold_sal()` in `src/spell.c`
 translates
 a word through a spell file's SAL (sound-folding) rules into a caller-
 owned
 result buffer.  Its result writes are guarded with `reslen < MAXWLEN`,
 which
 allows `reslen` to reach `MAXWLEN`.  The function then terminates the
 result
 with `res[reslen] = NUL`, writing one byte past the end of the
 `MAXWLEN`-element
 stack buffer when `reslen == MAXWLEN`.  A word that reaches the buffer
 boundary,
 passed to `soundfold()` (or reached via sound-based spell suggestion)
 while a
 SAL-based spell language is active, therefore writes past the end of that
 buffer.  This is a stack out-of-bounds write that corrupts the call frame
 and
 crashes the editor.

 ## Description
 `spell_soundfold_sal()` writes its translated output into the stack buffer
 `res`, an array of size `[MAXWLEN]` (valid indices `0..MAXWLEN - 1`).  The
 single-byte branch, taken for 8-bit encodings such as `latin1`, guards
 each
 result write with `reslen < MAXWLEN`, so `reslen` can be incremented up to
 and
 including `MAXWLEN`.  After the translation loop the result is NUL-
 terminated:

 ```C
     res[reslen] = NUL;          // reslen may equal MAXWLEN -> OOB write
 ```

 With `reslen == MAXWLEN` this stores at index `MAXWLEN` of a
 `MAXWLEN`-element
 buffer, one byte past the end (CWE-787).  The preceding write sites in
 this
 branch — the no-`<`-rule copy loop, the `"^^"` rule append, and the
 double-letter condense — are bounded with `< MAXWLEN` rather than `<
 MAXWLEN - 1`,
 leaving no room for the terminating NUL at the boundary.

 `f_soundfold()` passes the user-supplied string to `eval_soundfold()`
 without
 length-bounding it; the input is case-folded to roughly `MAXWLEN - 1`
 bytes, so
 an argument at that boundary length drives `reslen` to `MAXWLEN`.  This is
 the
 SAL counterpart to the SOFO issue fixed in 9.2.0698; the single-byte SAL
 branch
 was the remaining walker of this class with an off-by-one at the
 terminator.

 ## Impact
 This issue is driven by the length of the word handed to the
 `spell_soundfold_sal()` function, not by the contents of the spell file;
 any
 loaded spell language with SAL sound-folding rules is enough.
 Exploitation is
 constrained, however.  The vulnerable single-byte branch is only reached
 under
 a non-multibyte 8-bit encoding (e.g. `set encoding=latin1`); under the
 default
 UTF-8 encoding the multibyte branch `spell_soundfold_wsal()`, which writes
 one
 full character at a time and breaks on `l + MB_MAXBYTES > MAXWLEN`, is
 taken
 instead and is unaffected.  Spell checking must be enabled with such a
 SAL-based language, and `soundfold()` must be invoked on a boundary-length
 word
 — for instance a script or plugin that calls `soundfold()` on untrusted
 input.
 When those conditions hold the out-of-bounds write corrupts the
 `eval_soundfold()` stack frame and the process aborts.

 ## Acknowledgements
 The Vim project would like to thank Hirohito Higashi (@h-east) for
 reporting and
 analyzing the issue and suggesting a fix.

 ## References
 The issue has been fixed as of Vim patch
 [v9.2.0725](https://github.com/vim/vim/releases/tag/v9.2.0725).
 -
 [Commit](https://github.com/vim/vim/commit/d22ff1c955ff87e8273210eae125aab0e85b6c30)
 - [Github Security
 Advisory](https://github.com/vim/vim/security/advisories/GHSA-m3hf-
 xcm3-xhm2)
 }}}
-- 
Ticket URL: <https://wiki.linuxfromscratch.org/lfs/ticket/5956#comment:5>
LFS Trac <https://wiki.linuxfromscratch.org/lfs/>
Linux From Scratch: Your Distro, Your Rules.

-- 
http://lists.linuxfromscratch.org/sympa/info/lfs-book
Unsubscribe: See the above information page