Skip to content

Commit c4a8bfa

Browse files
Heikki Krogerusgregkh
authored andcommitted
usb: typec: ucsi: Fix command cancellation
The Cancel command was passed to the write callback as the offset instead of as the actual command which caused NULL pointer dereference. Reported-by: Stephan Bolten <stephan.bolten@gmx.net> Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217517 Fixes: 094902b ("usb: typec: ucsi: Always cancel the command if PPM reports BUSY condition") Cc: stable@vger.kernel.org Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Message-ID: <20230606115802.79339-1-heikki.krogerus@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent e3dbb65 commit c4a8bfa

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

drivers/usb/typec/ucsi/ucsi.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,8 @@ static int ucsi_exec_command(struct ucsi *ucsi, u64 cmd)
132132
if (ret)
133133
return ret;
134134

135-
if (cci & UCSI_CCI_BUSY) {
136-
ucsi->ops->async_write(ucsi, UCSI_CANCEL, NULL, 0);
137-
return -EBUSY;
138-
}
135+
if (cmd != UCSI_CANCEL && cci & UCSI_CCI_BUSY)
136+
return ucsi_exec_command(ucsi, UCSI_CANCEL);
139137

140138
if (!(cci & UCSI_CCI_COMMAND_COMPLETE))
141139
return -EIO;
@@ -149,6 +147,11 @@ static int ucsi_exec_command(struct ucsi *ucsi, u64 cmd)
149147
return ucsi_read_error(ucsi);
150148
}
151149

150+
if (cmd == UCSI_CANCEL && cci & UCSI_CCI_CANCEL_COMPLETE) {
151+
ret = ucsi_acknowledge_command(ucsi);
152+
return ret ? ret : -EBUSY;
153+
}
154+
152155
return UCSI_CCI_LENGTH(cci);
153156
}
154157

0 commit comments

Comments
 (0)