Skip to content

Commit ab8f322

Browse files
committed
fix: avoid crash when accessing selected item
We should check the length before using the index to access it.
1 parent a6cf14b commit ab8f322

File tree

2 files changed

+45
-36
lines changed

2 files changed

+45
-36
lines changed

tokio-console/src/view/mod.rs

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -132,12 +132,14 @@ impl View {
132132
// mutate the currently selected view.
133133
match event {
134134
key!(Enter) => {
135-
if let Some(task) = self.tasks_list.selected_item().upgrade() {
136-
update_kind = UpdateKind::SelectTask(task.borrow().span_id());
137-
self.state = TaskInstance(self::task::TaskView::new(
138-
task,
139-
state.task_details_ref(),
140-
));
135+
if let Some(task_weak) = self.tasks_list.selected_item() {
136+
if let Some(task) = task_weak.upgrade() {
137+
update_kind = UpdateKind::SelectTask(task.borrow().span_id());
138+
self.state = TaskInstance(self::task::TaskView::new(
139+
task,
140+
state.task_details_ref(),
141+
));
142+
}
141143
}
142144
}
143145
_ => {
@@ -149,9 +151,12 @@ impl View {
149151
ResourcesList => {
150152
match event {
151153
key!(Enter) => {
152-
if let Some(res) = self.resources_list.selected_item().upgrade() {
153-
update_kind = UpdateKind::SelectResource(res.borrow().span_id());
154-
self.state = ResourceInstance(self::resource::ResourceView::new(res));
154+
if let Some(res_weak) = self.resources_list.selected_item() {
155+
if let Some(res) = res_weak.upgrade() {
156+
update_kind = UpdateKind::SelectResource(res.borrow().span_id());
157+
self.state =
158+
ResourceInstance(self::resource::ResourceView::new(res));
159+
}
155160
}
156161
}
157162
_ => {
@@ -169,21 +174,24 @@ impl View {
169174
update_kind = UpdateKind::Other;
170175
}
171176
key!(Enter) => {
172-
if let Some(op) = view.async_ops_table.selected_item().upgrade() {
173-
if let Some(task_id) = op.borrow().task_id() {
174-
let task = self
175-
.tasks_list
176-
.sorted_items
177-
.iter()
178-
.filter_map(|i| i.upgrade())
179-
.find(|t| task_id == t.borrow().id());
177+
if let Some(op_weak) = view.async_ops_table.selected_item() {
178+
if let Some(op) = op_weak.upgrade() {
179+
if let Some(task_id) = op.borrow().task_id() {
180+
let task = self
181+
.tasks_list
182+
.sorted_items
183+
.iter()
184+
.filter_map(|i| i.upgrade())
185+
.find(|t| task_id == t.borrow().id());
180186

181-
if let Some(task) = task {
182-
update_kind = UpdateKind::SelectTask(task.borrow().span_id());
183-
self.state = TaskInstance(self::task::TaskView::new(
184-
task,
185-
state.task_details_ref(),
186-
));
187+
if let Some(task) = task {
188+
update_kind =
189+
UpdateKind::SelectTask(task.borrow().span_id());
190+
self.state = TaskInstance(self::task::TaskView::new(
191+
task,
192+
state.task_details_ref(),
193+
));
194+
}
187195
}
188196
}
189197
}

tokio-console/src/view/table.rs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -154,19 +154,20 @@ impl<T: TableList<N>, const N: usize> TableListState<T, N> {
154154
self.scroll_with(|_, _| 0)
155155
}
156156

157-
pub(in crate::view) fn selected_item(&self) -> Weak<RefCell<T::Row>> {
158-
self.table_state
159-
.selected()
160-
.map(|i| {
161-
let selected = if self.sort_descending {
162-
i
163-
} else {
164-
self.sorted_items.len() - i - 1
165-
};
166-
self.sorted_items[selected].clone()
167-
})
168-
.unwrap_or_default()
169-
}
157+
pub(in crate::view) fn selected_item(&self) -> Option<Weak<RefCell<T::Row>>> {
158+
self.table_state.selected().and_then(|i| {
159+
if self.sort_descending {
160+
if i < self.sorted_items.len() {
161+
Some(self.sorted_items[i].clone())
162+
} else {
163+
None
164+
}
165+
} else {
166+
let adjusted_index = self.sorted_items.len().checked_sub(i + 1)?;
167+
self.sorted_items.get(adjusted_index).cloned()
168+
}
169+
})
170+
}
170171

171172
pub(in crate::view) fn render(
172173
&mut self,

0 commit comments

Comments
 (0)