fix(terminal): skip setting string_initial to false on no-op (#34176)

Problem:

Currently undefined behavior can occur when `string_fragment()` is
called with `OSC_COMMAND`. This is because when the state changes to
`OSC_COMMAND`, `string_initial` is set to true. Then in some cases,
directly after this `string_initial` will be set back to false before
the on_osc callback is called, this leads to `term_settermprop()` never
initializing the title.

Solution:

In all of the no-op cases in `string_fragment()` currently, we continue
to the end of the function where `vt->parser.string_initial` is set to
false. This change returns in the no-op cases instead since in these
cases the string has not yet been terminated and sent to the callback.

Note:

This change also adds a test with a byte sequence from the file
in #34028 that caused nvim to crash. This byte sequences is the shortest
sequence I could trim down from that file that still would trigger the
crash. There are also two other tests I added which validate that
setting the title with OSC-0 and OSC-2 still works.

Fixes: #34028
This commit is contained in:
Gabriel Ford
2025-05-29 14:29:16 -04:00
committed by GitHub
parent f82219c490
commit b28bbee539
2 changed files with 49 additions and 1 deletions

View File

@@ -122,7 +122,7 @@ static void string_fragment(VTerm *vt, const char *str, size_t len, bool final)
case CSI_INTERMED:
case OSC_COMMAND:
case DCS_COMMAND:
break;
return;
}
vt->parser.string_initial = false;