mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 19:13:47 +02:00
usb: typec: ucsi: validate connector number in ucsi_connector_change()
The connector number in a UCSI CCI notification is a 7-bit field supplied by the PPM. ucsi_connector_change() uses it to index the ucsi->connector[] array without checking it against the number of connectors the PPM reported at init time, so a buggy or malicious PPM (EC firmware, or an I2C-attached UCSI controller on the ccg / stm32g0 / glink transports) can drive schedule_work() on memory past the end of the array. Reject connector numbers that are zero or exceed cap.num_connectors before dereferencing the array. Assisted-by: gkh_clanker_t1000 Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com> Cc: Benson Leung <bleung@chromium.org> Cc: Jameson Thies <jthies@google.com> Cc: Nathan Rebello <nathan.c.rebello@gmail.com> Cc: Johan Hovold <johan@kernel.org> Cc: Pooja Katiyar <pooja.katiyar@intel.com> Cc: Hsin-Te Yuan <yuanhsinte@chromium.org> Cc: Abel Vesa <abelvesa@kernel.org> Cc: stable <stable@kernel.org> Reviewed-by: Abel Vesa <abel.vesa@oss.qualcomm.com> Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Reviewed-by: Benson Leung <bleung@chromium.org> Link: https://patch.msgid.link/2026051351-truck-steadfast-df48@gregkh Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
167dd8d122
commit
288a81a850
|
|
@ -1380,13 +1380,22 @@ static void ucsi_handle_connector_change(struct work_struct *work)
|
|||
*/
|
||||
void ucsi_connector_change(struct ucsi *ucsi, u8 num)
|
||||
{
|
||||
struct ucsi_connector *con = &ucsi->connector[num - 1];
|
||||
struct ucsi_connector *con;
|
||||
|
||||
if (!(ucsi->ntfy & UCSI_ENABLE_NTFY_CONNECTOR_CHANGE)) {
|
||||
dev_dbg(ucsi->dev, "Early connector change event\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!num || num > ucsi->cap.num_connectors) {
|
||||
dev_warn_ratelimited(ucsi->dev,
|
||||
"Bogus connector change on %u (max %u)\n",
|
||||
num, ucsi->cap.num_connectors);
|
||||
return;
|
||||
}
|
||||
|
||||
con = &ucsi->connector[num - 1];
|
||||
|
||||
if (!test_and_set_bit(EVENT_PENDING, &ucsi->flags))
|
||||
schedule_work(&con->work);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user