From 8d55f4c6d9a29f4b3483231f6d88458333ee36ed Mon Sep 17 00:00:00 2001 From: Alex Elder Date: Thu, 20 Nov 2014 15:37:07 -0600 Subject: [PATCH] greybus: complete overflow responses If a response arrives for an operation request and the allotted buffer isn't big enough we report the error, but we don't finish processing the response. Instead, set the operation result, but then finish processing the response (no different from any other operation error). This will allow the normal completion handling to occur for this error case. Signed-off-by: Alex Elder Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/operation.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/drivers/staging/greybus/operation.c b/drivers/staging/greybus/operation.c index 3e3fc73a881c..d91cd5b4b65a 100644 --- a/drivers/staging/greybus/operation.c +++ b/drivers/staging/greybus/operation.c @@ -526,16 +526,15 @@ static void gb_connection_recv_response(struct gb_connection *connection, gb_pending_operation_remove(operation); message = &operation->response; - if (size > message->buffer_size) { - operation->result = GB_OP_OVERFLOW; + if (size <= message->buffer_size) { + /* Transfer the operation result from the response header */ + header = message->buffer; + operation->result = header->result; + } else { gb_connection_err(connection, "recv buffer too small"); - return; /* XXX Should still complete operation */ + operation->result = GB_OP_OVERFLOW; } - /* The status in the response is the result of the operation */ - header = message->buffer; - operation->result = header->result; - /* We must ignore the payload if a bad status is returned */ if (operation->result == GB_OP_SUCCESS) memcpy(message->buffer, data, size); -- 2.39.2