From 774a0ac11890401d483896ef83a8ef19ade71ec9 Mon Sep 17 00:00:00 2001 From: Red Bear OS Date: Tue, 7 Jul 2026 02:07:46 +0300 Subject: [PATCH] =?UTF-8?q?xhcid:=20P0-A4=20=E2=80=94=20bounds-check=20roo?= =?UTF-8?q?t=5Fhub=5Fport=5Findex()=20calls?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace 5 bare unwrap() / index-operator sites on root_hub_port_index() with bounded access: get_pls(): expect() with diagnostic (returns u8, can't use ?) poll(): match None → continue print_port: match None → continue reset_port(): ok_or_else(|| Error::new(EINVAL))? (returns Result) attach: ok_or_else(|| Error::new(EINVAL))? (returns Result) Added EINVAL to syscall::error import. --- drivers/usb/xhcid/src/xhci/mod.rs | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/drivers/usb/xhcid/src/xhci/mod.rs b/drivers/usb/xhcid/src/xhci/mod.rs index f214367639..db59bbe819 100644 --- a/drivers/usb/xhcid/src/xhci/mod.rs +++ b/drivers/usb/xhcid/src/xhci/mod.rs @@ -16,7 +16,7 @@ use std::sync::atomic::AtomicUsize; use std::sync::{Arc, Mutex}; use std::{mem, process, slice, thread}; -use syscall::error::{Error, Result, EBADF, EBADMSG, EIO, ENOENT}; +use syscall::error::{Error, Result, EBADF, EBADMSG, EINVAL, EIO, ENOENT}; use syscall::{EAGAIN, PAGE_SIZE}; use chashmap::CHashMap; @@ -600,7 +600,8 @@ impl Xhci { pub fn get_pls(&self, port_id: PortId) -> u8 { let mut ports = self.ports.lock().unwrap(); - let port = ports.get_mut(port_id.root_hub_port_index()).unwrap(); + let port = ports.get_mut(port_id.root_hub_port_index()) + .expect("get_pls: port index out of range"); port.state() } @@ -618,7 +619,10 @@ impl Xhci { //Get the CCS and CSC flags let (ccs, csc, flags) = { let mut ports = self.ports.lock().unwrap(); - let port = &mut ports[port_id.root_hub_port_index()]; + let port = match ports.get_mut(port_id.root_hub_port_index()) { + Some(p) => p, + None => continue, + }; let flags = port.flags(); let ccs = flags.contains(PortFlags::CCS); let csc = flags.contains(PortFlags::CSC); @@ -660,7 +664,10 @@ impl Xhci { { let mut ports = self.ports.lock().unwrap(); - flags = ports[port_id.root_hub_port_index()].flags(); + flags = match ports.get(port_id.root_hub_port_index()) { + Some(p) => p.flags(), + None => continue, + }; } match self.supported_protocol(port_id) { @@ -686,7 +693,8 @@ impl Xhci { //TODO handle the second unwrap let mut ports = self.ports.lock().unwrap(); - let port = ports.get_mut(port_id.root_hub_port_index()).unwrap(); + let port = ports.get_mut(port_id.root_hub_port_index()) + .ok_or_else(|| Error::new(EINVAL))?; let instant = std::time::Instant::now(); debug!("Port {} Link State: {}", port_id, port.state()); @@ -799,7 +807,9 @@ impl Xhci { } let (data, state, speed, flags) = { - let port = &self.ports.lock().unwrap()[port_id.root_hub_port_index()]; + let port = self.ports.lock().unwrap(); + let port = port.get(port_id.root_hub_port_index()) + .ok_or_else(|| Error::new(EINVAL))?; (port.read(), port.state(), port.speed(), port.flags()) };