Commit fffc1513 authored by Johan Hovold's avatar Johan Hovold Committed by Greg Kroah-Hartman

greybus: operation: fix another cancellation use-after-free

An incoming operation could already be scheduled even if
gb_operation_result_set succeeds as its initial status is -EINPROGRESS.

Avoid potential use-after-free by never dropping the reference count for
incoming operations as part of cancellation.
Signed-off-by: default avatarJohan Hovold <johan@hovoldconsulting.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent a5192032
...@@ -853,12 +853,17 @@ void gb_connection_recv(struct gb_connection *connection, ...@@ -853,12 +853,17 @@ void gb_connection_recv(struct gb_connection *connection,
*/ */
void gb_operation_cancel(struct gb_operation *operation, int errno) void gb_operation_cancel(struct gb_operation *operation, int errno)
{ {
if (gb_operation_result_set(operation, errno)) { if (gb_operation_is_incoming(operation)) {
gb_message_cancel(operation->request); /* Cancel response if it has been allocated */
gb_operation_put(operation); if (!gb_operation_result_set(operation, errno) &&
} else if (gb_operation_is_incoming(operation)) { !gb_operation_is_unidirectional(operation)) {
if (!gb_operation_is_unidirectional(operation))
gb_message_cancel(operation->response); gb_message_cancel(operation->response);
}
} else {
if (gb_operation_result_set(operation, errno)) {
gb_message_cancel(operation->request);
gb_operation_put(operation);
}
} }
} }
EXPORT_SYMBOL_GPL(gb_operation_cancel); EXPORT_SYMBOL_GPL(gb_operation_cancel);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment