All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kyle Tso <kyletso@google.com>
To: badhri@google.com, heikki.krogerus@linux.intel.com,
	 gregkh@linuxfoundation.org, kyletso@google.com
Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org,
	 stable@vger.kernel.org
Subject: [PATCH v1] usb: typec: tcpm: Fix out-of-bounds read of the pds and pd_list arrays
Date: Tue, 13 Oct 2026 08:15:49 +0000	[thread overview]
Message-ID: <20261013081549.2375441-1-kyletso@google.com> (raw)

select_usb_power_delivery_show() iterates through port->pds (via the
pd_get() callback) and tcpm_find_pd_data() iterates through
port->pd_list until they find a NULL entry. However, tcpm_fw_get_caps()
allocates only port->pd_count entries for each array, and
tcpm_port_register_pd() fills all of them. Without a NULL terminator,
both loops read and dereference one entry past the end:

  Unable to handle kernel paging request at virtual address
  adacafaea9a8ac1a
  Internal error: Oops: 0000000096000004 [#1] PREEMPT SMP
  pc : select_usb_power_delivery_show+0xa4/0x110
  lr : select_usb_power_delivery_show+0x90/0x110
  Call trace:
   select_usb_power_delivery_show+0xa4/0x110
   dev_attr_show+0x38/0x74
   sysfs_kf_seq_show+0xb4/0x130
   kernfs_seq_show+0x44/0x54
   seq_read_iter+0x158/0x4ec
   kernfs_fop_read_iter+0x68/0x1bc
   vfs_read+0x230/0x2c0
   ksys_read+0x78/0xe8
   __arm64_sys_read+0x1c/0x2c
   invoke_syscall+0x58/0x118
   el0_svc_common+0xb4/0xf4
   do_el0_svc+0x24/0x80
   el0_svc+0x2c/0x90
   el0t_64_sync_handler+0x68/0xb4
   el0t_64_sync+0x1a4/0x1a8

Allocate one extra, zeroed entry for both arrays so that they are
always NULL-terminated.

Fixes: cd099cde4ed2 ("usb: typec: tcpm: Support multiple capabilities")
Cc: stable@vger.kernel.org
Reviewed-by: Badhri Jagan Sridharan <badhri@google.com>
Signed-off-by: Kyle Tso <kyletso@google.com>
---
 drivers/usb/typec/tcpm/tcpm.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index d721baef5210..8f4e10ec6d66 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -8376,14 +8376,21 @@ static int tcpm_fw_get_caps(struct tcpm_port *port, struct fwnode_handle *fwnode
 		}
 	}
 
-	port->pds = devm_kcalloc(port->dev, port->pd_count, sizeof(struct usb_power_delivery *),
+	/*
+	 * Allocate one extra entry for each array to keep them NULL-terminated.
+	 * select_usb_power_delivery_show() iterates through port->pds (via the
+	 * pd_get callback) until it finds a NULL entry. Similarly,
+	 * tcpm_find_pd_data() iterates through port->pd_list until it finds a
+	 * NULL entry.
+	 */
+	port->pds = devm_kcalloc(port->dev, port->pd_count + 1, sizeof(struct usb_power_delivery *),
 				 GFP_KERNEL);
 	if (!port->pds) {
 		ret = -ENOMEM;
 		goto put_capabilities;
 	}
 
-	port->pd_list = devm_kcalloc(port->dev, port->pd_count, sizeof(struct pd_data *),
+	port->pd_list = devm_kcalloc(port->dev, port->pd_count + 1, sizeof(struct pd_data *),
 				     GFP_KERNEL);
 	if (!port->pd_list) {
 		ret = -ENOMEM;
-- 
2.56.0.385.gd3acb90ef8-goog


             reply	other threads:[~2026-10-13  8:16 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-13  8:15 Kyle Tso [this message]
2026-10-13  8:29 ` [PATCH v1] usb: typec: tcpm: Fix out-of-bounds read of the pds and pd_list arrays sashiko-bot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261013081549.2375441-1-kyletso@google.com \
    --to=kyletso@google.com \
    --cc=badhri@google.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=heikki.krogerus@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.