[text] add some missing bound check on the filtered line index for the TEXT view

Fixes #1056
This commit is contained in:
Tim Stack 2022-09-15 21:22:11 -07:00
parent eb0bd4ac9a
commit bf3fe7fc2c
2 changed files with 24 additions and 6 deletions

View File

@ -86,6 +86,7 @@ filter_sub_source::list_input_handle_key(listview_curses& lv, int ch)
auto* tss = top_view->get_sub_source();
tss->toggle_apply_filters();
top_view->reload_data();
break;
}
case ' ': {
@ -102,6 +103,7 @@ filter_sub_source::list_input_handle_key(listview_curses& lv, int ch)
fs.set_filter_enabled(tf, !tf->is_enabled());
tss->text_filters_changed();
lv.reload_data();
top_view->reload_data();
return true;
}
case 't': {
@ -123,6 +125,7 @@ filter_sub_source::list_input_handle_key(listview_curses& lv, int ch)
tss->text_filters_changed();
lv.reload_data();
top_view->reload_data();
return true;
}
case 'D': {
@ -139,6 +142,7 @@ filter_sub_source::list_input_handle_key(listview_curses& lv, int ch)
fs.delete_filter(tf->get_id());
lv.reload_data();
tss->text_filters_changed();
top_view->reload_data();
return true;
}
case 'i': {
@ -576,6 +580,7 @@ filter_sub_source::rl_perform(readline_curses* rc)
lnav_data.ld_filter_help_status_source.fss_prompt.clear();
this->fss_editing = false;
this->fss_editor->set_visible(false);
top_view->reload_data();
this->tss_view->reload_data();
}

View File

@ -72,10 +72,14 @@ textfile_sub_source::text_value_for_line(textview_curses& tc,
if (rend_iter == this->tss_rendered_files.end()) {
auto* lfo = dynamic_cast<line_filter_observer*>(
lf->get_logline_observer());
auto read_result = lf->read_line(
lf->begin() + lfo->lfo_filter_state.tfs_index[line]);
if (read_result.isOk()) {
value_out = to_string(read_result.unwrap());
if (line < 0 || line >= lfo->lfo_filter_state.tfs_index.size()) {
value_out.clear();
} else {
auto read_result = lf->read_line(
lf->begin() + lfo->lfo_filter_state.tfs_index[line]);
if (read_result.isOk()) {
value_out = to_string(read_result.unwrap());
}
}
} else {
rend_iter->second.rf_text_source->text_value_for_line(
@ -122,8 +126,11 @@ textfile_sub_source::text_size_for_line(textview_curses& tc,
if (rend_iter == this->tss_rendered_files.end()) {
auto* lfo = dynamic_cast<line_filter_observer*>(
lf->get_logline_observer());
retval = lf->line_length(lf->begin()
+ lfo->lfo_filter_state.tfs_index[line]);
if (line < 0 || line >= lfo->lfo_filter_state.tfs_index.size()) {
} else {
retval = lf->line_length(
lf->begin() + lfo->lfo_filter_state.tfs_index[line]);
}
} else {
retval = rend_iter->second.rf_text_source->text_size_for_line(
tc, line, flags);
@ -325,6 +332,9 @@ textfile_sub_source::text_crumbs_for_line(
if (meta_iter != this->tss_doc_metadata.end()) {
auto* lfo
= dynamic_cast<line_filter_observer*>(lf->get_logline_observer());
if (line < 0 || line >= lfo->lfo_filter_state.tfs_index.size()) {
return;
}
auto ll_iter = lf->begin() + lfo->lfo_filter_state.tfs_index[line];
auto ll_next_iter = ll_iter + 1;
auto end_offset = (ll_next_iter == lf->end())
@ -766,6 +776,9 @@ textfile_sub_source::anchor_for_row(vis_line_t vl)
}
auto* lfo = dynamic_cast<line_filter_observer*>(lf->get_logline_observer());
if (vl >= lfo->lfo_filter_state.tfs_index.size()) {
return retval;
}
auto ll_iter = lf->begin() + lfo->lfo_filter_state.tfs_index[vl];
auto ll_next_iter = ll_iter + 1;
auto end_offset = (ll_next_iter == lf->end())