[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(); auto* tss = top_view->get_sub_source();
tss->toggle_apply_filters(); tss->toggle_apply_filters();
top_view->reload_data();
break; break;
} }
case ' ': { 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()); fs.set_filter_enabled(tf, !tf->is_enabled());
tss->text_filters_changed(); tss->text_filters_changed();
lv.reload_data(); lv.reload_data();
top_view->reload_data();
return true; return true;
} }
case 't': { case 't': {
@ -123,6 +125,7 @@ filter_sub_source::list_input_handle_key(listview_curses& lv, int ch)
tss->text_filters_changed(); tss->text_filters_changed();
lv.reload_data(); lv.reload_data();
top_view->reload_data();
return true; return true;
} }
case 'D': { case 'D': {
@ -139,6 +142,7 @@ filter_sub_source::list_input_handle_key(listview_curses& lv, int ch)
fs.delete_filter(tf->get_id()); fs.delete_filter(tf->get_id());
lv.reload_data(); lv.reload_data();
tss->text_filters_changed(); tss->text_filters_changed();
top_view->reload_data();
return true; return true;
} }
case 'i': { case 'i': {
@ -576,6 +580,7 @@ filter_sub_source::rl_perform(readline_curses* rc)
lnav_data.ld_filter_help_status_source.fss_prompt.clear(); lnav_data.ld_filter_help_status_source.fss_prompt.clear();
this->fss_editing = false; this->fss_editing = false;
this->fss_editor->set_visible(false); this->fss_editor->set_visible(false);
top_view->reload_data();
this->tss_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()) { if (rend_iter == this->tss_rendered_files.end()) {
auto* lfo = dynamic_cast<line_filter_observer*>( auto* lfo = dynamic_cast<line_filter_observer*>(
lf->get_logline_observer()); lf->get_logline_observer());
auto read_result = lf->read_line( if (line < 0 || line >= lfo->lfo_filter_state.tfs_index.size()) {
lf->begin() + lfo->lfo_filter_state.tfs_index[line]); value_out.clear();
if (read_result.isOk()) { } else {
value_out = to_string(read_result.unwrap()); 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 { } else {
rend_iter->second.rf_text_source->text_value_for_line( 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()) { if (rend_iter == this->tss_rendered_files.end()) {
auto* lfo = dynamic_cast<line_filter_observer*>( auto* lfo = dynamic_cast<line_filter_observer*>(
lf->get_logline_observer()); lf->get_logline_observer());
retval = lf->line_length(lf->begin() if (line < 0 || line >= lfo->lfo_filter_state.tfs_index.size()) {
+ lfo->lfo_filter_state.tfs_index[line]); } else {
retval = lf->line_length(
lf->begin() + lfo->lfo_filter_state.tfs_index[line]);
}
} else { } else {
retval = rend_iter->second.rf_text_source->text_size_for_line( retval = rend_iter->second.rf_text_source->text_size_for_line(
tc, line, flags); tc, line, flags);
@ -325,6 +332,9 @@ textfile_sub_source::text_crumbs_for_line(
if (meta_iter != this->tss_doc_metadata.end()) { if (meta_iter != this->tss_doc_metadata.end()) {
auto* lfo auto* lfo
= dynamic_cast<line_filter_observer*>(lf->get_logline_observer()); = 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_iter = lf->begin() + lfo->lfo_filter_state.tfs_index[line];
auto ll_next_iter = ll_iter + 1; auto ll_next_iter = ll_iter + 1;
auto end_offset = (ll_next_iter == lf->end()) 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()); 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_iter = lf->begin() + lfo->lfo_filter_state.tfs_index[vl];
auto ll_next_iter = ll_iter + 1; auto ll_next_iter = ll_iter + 1;
auto end_offset = (ll_next_iter == lf->end()) auto end_offset = (ll_next_iter == lf->end())