term.ui: fix panic from missing cursor pos response (#24468)

This commit is contained in:
Adam Stringer 2025-05-12 20:19:21 +01:00 committed by GitHub
parent 81b238e6f7
commit 0b7a20d938
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 66 additions and 0 deletions

View File

@ -168,6 +168,9 @@ fn get_cursor_position() (int, int) {
buf[len] = 0 buf[len] = 0
s = tos(buf, len) s = tos(buf, len)
} }
if s.len == 0 {
return -1, -1
}
a := s[2..].split(';') a := s[2..].split(';')
if a.len != 2 { if a.len != 2 {
return -1, -1 return -1, -1

View File

@ -0,0 +1,63 @@
module ui
fn test_get_cursor_position_reads_valid_row_column_data() ! {
mut pipeset := [0, 0]
mut original_stdin_fd := -1
unsafe {
if C.pipe(&pipeset[0]) == -1 {
return error('unable to create pipe: ${C.strerror(C.errno)}')
}
fake_cursor_pos_data := '\033[45;70R'
written_bytes := C.write(pipeset[1], fake_cursor_pos_data.str, fake_cursor_pos_data.len)
if written_bytes == -1 {
C.close(pipeset[0])
C.close(pipeset[1])
return error('error writing into pipe: ${C.strerror(C.errno)}')
}
C.close(pipeset[1])
if C.dup2(pipeset[0], C.STDIN_FILENO) == -1 {
C.close(pipeset[0])
return error('error redirecting stdin with dup2: ${C.strerror(C.errno)}')
}
C.close(pipeset[0])
cursor_pos_x, cursor_pos_y := get_cursor_position()
assert cursor_pos_x == 45
assert cursor_pos_y == 70
}
}
fn test_get_cursor_position_reads_empty_position_data() ! {
mut pipeset := [0, 0]
mut original_stdin_fd := -1
unsafe {
if C.pipe(&pipeset[0]) == -1 {
return error('unable to create pipe: ${C.strerror(C.errno)}')
}
fake_cursor_pos_data := ''
written_bytes := C.write(pipeset[1], fake_cursor_pos_data.str, fake_cursor_pos_data.len)
if written_bytes == -1 {
C.close(pipeset[0])
C.close(pipeset[1])
return error('error writing into pipe: ${C.strerror(C.errno)}')
}
C.close(pipeset[1])
if C.dup2(pipeset[0], C.STDIN_FILENO) == -1 {
C.close(pipeset[0])
return error('error redirecting stdin with dup2: ${C.strerror(C.errno)}')
}
C.close(pipeset[0])
cursor_pos_x, cursor_pos_y := get_cursor_position()
assert cursor_pos_x == -1
assert cursor_pos_y == -1
}
}