Do not call range_line_() with unsafe parameters in find_cmd_output
This commit is contained in:
parent
6afaec1d62
commit
e771e1ea8a
@ -2240,6 +2240,14 @@ range_line_(Screen *self, int y) {
|
|||||||
return self->linebuf->line;
|
return self->linebuf->line;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Line*
|
||||||
|
checked_range_line(Screen *self, int y) {
|
||||||
|
if (
|
||||||
|
(y < 0 && -(y + 1) >= (int)self->historybuf->count) || y >= (int)self->lines
|
||||||
|
) return NULL;
|
||||||
|
return range_line_(self, y);
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
selection_is_left_to_right(const Selection *self) {
|
selection_is_left_to_right(const Selection *self) {
|
||||||
return self->input_start.x < self->input_current.x || (self->input_start.x == self->input_current.x && self->input_start.in_left_half_of_cell);
|
return self->input_start.x < self->input_current.x || (self->input_start.x == self->input_current.x && self->input_start.in_left_half_of_cell);
|
||||||
@ -2658,15 +2666,16 @@ find_cmd_output(Screen *self, OutputOffset *oo, index_type start_y, unsigned int
|
|||||||
const int upward_limit = -self->historybuf->count;
|
const int upward_limit = -self->historybuf->count;
|
||||||
const int downward_limit = self->lines - 1;
|
const int downward_limit = self->lines - 1;
|
||||||
const int screen_limit = -scrolled_by + downward_limit;
|
const int screen_limit = -scrolled_by + downward_limit;
|
||||||
|
Line *line = NULL;
|
||||||
|
|
||||||
// find around
|
// find around
|
||||||
if (direction == 0) {
|
if (direction == 0) {
|
||||||
Line *line = range_line_(self, y1);
|
line = checked_range_line(self, y1);
|
||||||
if (line->attrs.prompt_kind == PROMPT_START) {
|
if (line && line->attrs.prompt_kind == PROMPT_START) {
|
||||||
found_prompt = true;
|
found_prompt = true;
|
||||||
// change direction to downwards to find command output
|
// change direction to downwards to find command output
|
||||||
direction = 1;
|
direction = 1;
|
||||||
} else if (line->attrs.prompt_kind == OUTPUT_START) {
|
} else if (line && line->attrs.prompt_kind == OUTPUT_START) {
|
||||||
found_output = true; start = y1;
|
found_output = true; start = y1;
|
||||||
found_prompt = true;
|
found_prompt = true;
|
||||||
// keep finding the first output start upwards
|
// keep finding the first output start upwards
|
||||||
@ -2679,15 +2688,15 @@ find_cmd_output(Screen *self, OutputOffset *oo, index_type start_y, unsigned int
|
|||||||
// find around: only needs to find the first output start
|
// find around: only needs to find the first output start
|
||||||
// find upwards: find prompt after the output, and the first output
|
// find upwards: find prompt after the output, and the first output
|
||||||
while (y1 >= upward_limit) {
|
while (y1 >= upward_limit) {
|
||||||
Line *line = range_line_(self, y1);
|
line = checked_range_line(self, y1);
|
||||||
if (line->attrs.prompt_kind == PROMPT_START) {
|
if (line && line->attrs.prompt_kind == PROMPT_START) {
|
||||||
if (direction == 0) {
|
if (direction == 0) {
|
||||||
// find around: stop at prompt start
|
// find around: stop at prompt start
|
||||||
start = y1 + 1;
|
start = y1 + 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
found_next_prompt = true; end = y1;
|
found_next_prompt = true; end = y1;
|
||||||
} else if (line->attrs.prompt_kind == OUTPUT_START) {
|
} else if (line && line->attrs.prompt_kind == OUTPUT_START) {
|
||||||
start = y1;
|
start = y1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2699,8 +2708,8 @@ find_cmd_output(Screen *self, OutputOffset *oo, index_type start_y, unsigned int
|
|||||||
// resizing screen can cause multiple consecutive output start lines,
|
// resizing screen can cause multiple consecutive output start lines,
|
||||||
// so find the first one
|
// so find the first one
|
||||||
while (start > upward_limit) {
|
while (start > upward_limit) {
|
||||||
Line *line = range_line_(self, start - 1);
|
line = checked_range_line(self, start - 1);
|
||||||
if (line->attrs.prompt_kind != OUTPUT_START) break;
|
if (line && line->attrs.prompt_kind != OUTPUT_START) break;
|
||||||
start--;
|
start--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2712,14 +2721,14 @@ find_cmd_output(Screen *self, OutputOffset *oo, index_type start_y, unsigned int
|
|||||||
if (direction >= 0) {
|
if (direction >= 0) {
|
||||||
while (y2 <= downward_limit) {
|
while (y2 <= downward_limit) {
|
||||||
if (on_screen_only && !found_output && y2 > screen_limit) break;
|
if (on_screen_only && !found_output && y2 > screen_limit) break;
|
||||||
Line *line = range_line_(self, y2);
|
line = checked_range_line(self, y2);
|
||||||
if (line->attrs.prompt_kind == PROMPT_START) {
|
if (line && line->attrs.prompt_kind == PROMPT_START) {
|
||||||
if (!found_prompt) found_prompt = true;
|
if (!found_prompt) found_prompt = true;
|
||||||
else if (found_output && !found_next_prompt) {
|
else if (found_output && !found_next_prompt) {
|
||||||
found_next_prompt = true; end = y2;
|
found_next_prompt = true; end = y2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (line->attrs.prompt_kind == OUTPUT_START && found_prompt && !found_output) {
|
} else if (line && line->attrs.prompt_kind == OUTPUT_START && found_prompt && !found_output) {
|
||||||
found_output = true; start = y2;
|
found_output = true; start = y2;
|
||||||
}
|
}
|
||||||
y2++;
|
y2++;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user