Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit e7e9219

Browse files
amitsd2gregkh
authored andcommitted
usb: typec: tcpm: fix use-after-free case in tcpm_register_source_caps
There could be a potential use-after-free case in tcpm_register_source_caps(). This could happen when: * new (say invalid) source caps are advertised * the existing source caps are unregistered * tcpm_register_source_caps() returns with an error as usb_power_delivery_register_capabilities() fails This causes port->partner_source_caps to hold on to the now freed source caps. Reset port->partner_source_caps value to NULL after unregistering existing source caps. Fixes: 230ecdf ("usb: typec: tcpm: unregister existing source caps before re-registration") Cc: stable@vger.kernel.org Signed-off-by: Amit Sunil Dhamne <amitsd@google.com> Reviewed-by: Ondrej Jirman <megi@xff.cz> Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Link: https://lore.kernel.org/r/20240514220134.2143181-1-amitsd@google.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 8475ffc commit e7e9219

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

drivers/usb/typec/tcpm/tcpm.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3014,8 +3014,10 @@ static int tcpm_register_source_caps(struct tcpm_port *port)
30143014
memcpy(caps.pdo, port->source_caps, sizeof(u32) * port->nr_source_caps);
30153015
caps.role = TYPEC_SOURCE;
30163016

3017-
if (cap)
3017+
if (cap) {
30183018
usb_power_delivery_unregister_capabilities(cap);
3019+
port->partner_source_caps = NULL;
3020+
}
30193021

30203022
cap = usb_power_delivery_register_capabilities(port->partner_pd, &caps);
30213023
if (IS_ERR(cap))

0 commit comments

Comments
 (0)