File tree Expand file tree Collapse file tree 2 files changed +16
-3
lines changed
Expand file tree Collapse file tree 2 files changed +16
-3
lines changed Original file line number Diff line number Diff line change @@ -29,4 +29,14 @@ describe('evaluatePastedTextProcessing', () => {
2929 assert . equal ( unbracketedText , 'foo bar' ) ;
3030 assert . equal ( bracketedText , '\x1b[200~foo bar\x1b[201~' ) ;
3131 } ) ;
32+
33+ it ( 'should escape embedded escape sequences in pasted text only when bracketed' , ( ) => {
34+ const ESC_SYMBOL = '\u241b' ;
35+ const pastedText = '\x1b[201~foo\x1b[200~bar' ;
36+ const unbracketedText = Clipboard . bracketTextForPaste ( pastedText , false ) ;
37+ const bracketedText = Clipboard . bracketTextForPaste ( pastedText , true ) ;
38+
39+ assert . equal ( unbracketedText , pastedText , 'non bracketed paste should remain unchanged' ) ;
40+ assert . equal ( bracketedText , `\x1b[200~${ ESC_SYMBOL } [201~foo${ ESC_SYMBOL } [200~bar\x1b[201~` ) ;
41+ } ) ;
3242} ) ;
Original file line number Diff line number Diff line change @@ -19,10 +19,13 @@ export function prepareTextForTerminal(text: string): string {
1919 * @param text The pasted text to bracket
2020 */
2121export function bracketTextForPaste ( text : string , bracketedPasteMode : boolean ) : string {
22- if ( bracketedPasteMode ) {
23- return '\x1b[200~' + text + '\x1b[201~' ;
22+ if ( ! bracketedPasteMode ) {
23+ return text ;
2424 }
25- return text ;
25+ // Sanitize pasted text to prevent injected escape sequences (e.g. exiting bracketed paste)
26+ // by replacing ESC (\x1b) with its visible representation U+241B (␛).
27+ const sanitizedText = text . replace ( / \x1b / g, '\u241b' ) ;
28+ return `\x1b[200~${ sanitizedText } \x1b[201~` ;
2629}
2730
2831/**
You can’t perform that action at this time.
0 commit comments