mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	fix(terminal): fix OSC 8 parsing (#34424)
vterm does not send us the terminator in the string fragment. Our OSC 8
parser assumed that it was and therefore treated short strings as
invalid (as it assumed it was missing a terminator).
(cherry picked from commit b5aef05b8f)
			
			
This commit is contained in:
		
				
					committed by
					
						
						github-actions[bot]
					
				
			
			
				
	
			
			
			
						parent
						
							5d0766ddce
						
					
				
				
					commit
					36c6f488e4
				
			@@ -283,31 +283,22 @@ static int parse_osc8(VTermStringFragment frag, int *attr)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Move past the semicolon
 | 
			
		||||
  i++;
 | 
			
		||||
 | 
			
		||||
  if (i >= frag.len) {
 | 
			
		||||
  if (frag.str[i] != ';') {
 | 
			
		||||
    // Invalid OSC sequence
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Find the terminator
 | 
			
		||||
  const size_t start = i;
 | 
			
		||||
  for (; i < frag.len; i++) {
 | 
			
		||||
    if (frag.str[i] == '\a' || frag.str[i] == '\x1b') {
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  // Move past the semicolon
 | 
			
		||||
  i++;
 | 
			
		||||
 | 
			
		||||
  const size_t len = i - start;
 | 
			
		||||
  if (len == 0) {
 | 
			
		||||
  if (i >= frag.len) {
 | 
			
		||||
    // Empty OSC 8, no URL
 | 
			
		||||
    *attr = 0;
 | 
			
		||||
    return 1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  char *url = xmemdupz(&frag.str[start], len + 1);
 | 
			
		||||
  url[len] = 0;
 | 
			
		||||
  char *url = xmemdupz(&frag.str[i], frag.len - i + 1);
 | 
			
		||||
  url[frag.len - i] = 0;
 | 
			
		||||
  *attr = hl_add_url(0, url);
 | 
			
		||||
  xfree(url);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -398,12 +398,13 @@ describe(':terminal', function()
 | 
			
		||||
      [100] = { url = 'https://example.com' },
 | 
			
		||||
    }
 | 
			
		||||
    local chan = api.nvim_open_term(0, {})
 | 
			
		||||
    api.nvim_chan_send(chan, '\027]8;;https://example.com\027\\Example\027]8;;\027\\')
 | 
			
		||||
    screen:expect({
 | 
			
		||||
      grid = [[
 | 
			
		||||
        {100:^Example}                                           |
 | 
			
		||||
                                                          |*6
 | 
			
		||||
      ]],
 | 
			
		||||
    })
 | 
			
		||||
    api.nvim_chan_send(
 | 
			
		||||
      chan,
 | 
			
		||||
      'This is an \027]8;;https://example.com\027\\example\027]8;;\027\\ of a link'
 | 
			
		||||
    )
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      ^This is an {100:example} of a link                      |
 | 
			
		||||
                                                        |*6
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
end)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user