mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-17 06:39:37 +02:00
usb: typec: fix up incorrectly backported "usb: typec: tcpm: unregister existing source caps before re-registration"
In commitb16abab1fb
("usb: typec: tcpm: unregister existing source caps before re-registration"), quilt, and git, applied the diff to the incorrect function, which would cause bad problems if exercised in a device with these capabilities. Fix this all up (including the follow-up fix in commit04c05d50fa
("usb: typec: tcpm: fix use-after-free case in tcpm_register_source_caps") to be in the correct function. Fixes:04c05d50fa
("usb: typec: tcpm: fix use-after-free case in tcpm_register_source_caps") Fixes:b16abab1fb
("usb: typec: tcpm: unregister existing source caps before re-registration") Reported-by: Charles Yo <charlesyo@google.com> Cc: Kyle Tso <kyletso@google.com> Cc: Amit Sunil Dhamne <amitsd@google.com> Cc: Ondrej Jirman <megi@xff.cz> Cc: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
4ed03758dd
commit
d967f6ae31
|
@ -2403,7 +2403,7 @@ static int tcpm_register_source_caps(struct tcpm_port *port)
|
|||
{
|
||||
struct usb_power_delivery_desc desc = { port->negotiated_rev };
|
||||
struct usb_power_delivery_capabilities_desc caps = { };
|
||||
struct usb_power_delivery_capabilities *cap;
|
||||
struct usb_power_delivery_capabilities *cap = port->partner_source_caps;
|
||||
|
||||
if (!port->partner_pd)
|
||||
port->partner_pd = usb_power_delivery_register(NULL, &desc);
|
||||
|
@ -2413,6 +2413,11 @@ static int tcpm_register_source_caps(struct tcpm_port *port)
|
|||
memcpy(caps.pdo, port->source_caps, sizeof(u32) * port->nr_source_caps);
|
||||
caps.role = TYPEC_SOURCE;
|
||||
|
||||
if (cap) {
|
||||
usb_power_delivery_unregister_capabilities(cap);
|
||||
port->partner_source_caps = NULL;
|
||||
}
|
||||
|
||||
cap = usb_power_delivery_register_capabilities(port->partner_pd, &caps);
|
||||
if (IS_ERR(cap))
|
||||
return PTR_ERR(cap);
|
||||
|
@ -2426,7 +2431,7 @@ static int tcpm_register_sink_caps(struct tcpm_port *port)
|
|||
{
|
||||
struct usb_power_delivery_desc desc = { port->negotiated_rev };
|
||||
struct usb_power_delivery_capabilities_desc caps = { };
|
||||
struct usb_power_delivery_capabilities *cap = port->partner_source_caps;
|
||||
struct usb_power_delivery_capabilities *cap;
|
||||
|
||||
if (!port->partner_pd)
|
||||
port->partner_pd = usb_power_delivery_register(NULL, &desc);
|
||||
|
@ -2436,11 +2441,6 @@ static int tcpm_register_sink_caps(struct tcpm_port *port)
|
|||
memcpy(caps.pdo, port->sink_caps, sizeof(u32) * port->nr_sink_caps);
|
||||
caps.role = TYPEC_SINK;
|
||||
|
||||
if (cap) {
|
||||
usb_power_delivery_unregister_capabilities(cap);
|
||||
port->partner_source_caps = NULL;
|
||||
}
|
||||
|
||||
cap = usb_power_delivery_register_capabilities(port->partner_pd, &caps);
|
||||
if (IS_ERR(cap))
|
||||
return PTR_ERR(cap);
|
||||
|
|
Loading…
Reference in New Issue
Block a user