[PATCH 53/60] Send error response when an unknown command is received.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



If an invalid Op Code is received (i.e. neither a Standard Op Code
nor a Clock Synchronization Protocol Op Code), we will send an reply
using an "Invalid Op Code" and the Op Code field to ERROR_RSP
---
 mcap/mcap.c |   49 +++++++++++++++++++++++++------------------------
 1 files changed, 25 insertions(+), 24 deletions(-)

diff --git a/mcap/mcap.c b/mcap/mcap.c
index 30e0827..788b565 100644
--- a/mcap/mcap.c
+++ b/mcap/mcap.c
@@ -934,27 +934,6 @@ bdaddr_t mcap_mcl_get_addr(struct mcap_mcl *mcl)
 	return mcl->addr;
 }
 
-static void error_cmd_rsp(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
-{
-	uint16_t mdlr;
-
-	if (cmd[0] <= MCAP_MD_DELETE_MDL_RSP) {
-		/* Standard Op Code request is invalid in current state */
-		error("Invalid cmd received (op code = %d) in state %d",
-							cmd[0],	mcl->state);
-		/* Get previously mdlid sent to generate an appropriate
-		 * response if it is possible */
-		mdlr = len < sizeof(mcap_md_req) ? MCAP_MDLID_RESERVED :
-					ntohs(((mcap_md_req *)cmd)->mdl);
-		send4B_cmd(mcl, cmd[0]+1, MCAP_INVALID_OPERATION, mdlr);
-	} else {
-		error("Unknown cmd request received (op code = %d) in state %d",
-							cmd[0], mcl->state);
-		send4B_cmd(mcl, MCAP_ERROR_RSP, MCAP_INVALID_OP_CODE,
-							MCAP_MDLID_RESERVED);
-	}
-}
-
 static void mcap_delete_mdl(gpointer elem, gpointer user_data)
 {
 	struct mcap_mdl *mdl = elem;
@@ -1194,6 +1173,19 @@ resp:
 	send4B_cmd(mcl, MCAP_MD_DELETE_MDL_RSP, MCAP_SUCCESS, mdlid);
 }
 
+static void invalid_req_state(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
+{
+	uint16_t mdlr;
+
+	error("Invalid cmd received (op code = %d) in state %d", cmd[0],
+								mcl->state);
+	/* Get previously mdlid sent to generate an appropriate
+	 * response if it is possible */
+	mdlr = len < sizeof(mcap_md_req) ? MCAP_MDLID_RESERVED :
+					ntohs(((mcap_md_req *)cmd)->mdl);
+	send4B_cmd(mcl, cmd[0]+1, MCAP_INVALID_OPERATION, mdlr);
+}
+
 /* Function used to process commands depending of MCL state */
 static void proc_req_connected(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
 {
@@ -1208,7 +1200,7 @@ static void proc_req_connected(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
 		process_md_delete_mdl_req(mcl, cmd, len);
 		break;
 	default:
-		error_cmd_rsp(mcl, cmd, len);
+		invalid_req_state(mcl, cmd, len);
 	}
 }
 
@@ -1217,7 +1209,7 @@ static void proc_req_pending(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
 	if (cmd[0] == MCAP_MD_ABORT_MDL_REQ)
 		process_md_abort_mdl_req(mcl, cmd, len);
 	else
-		error_cmd_rsp(mcl, cmd, len);
+		invalid_req_state(mcl, cmd, len);
 }
 
 static void proc_req_active(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
@@ -1233,7 +1225,7 @@ static void proc_req_active(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
 		process_md_delete_mdl_req(mcl, cmd, len);
 		break;
 	default:
-		error_cmd_rsp(mcl, cmd, len);
+		invalid_req_state(mcl, cmd, len);
 	}
 }
 
@@ -1521,6 +1513,15 @@ static void proc_cmd(struct mcap_mcl *mcl, uint8_t *cmd, uint32_t len)
 {
 	GError *gerr = NULL;
 
+	if (cmd[0] > MCAP_MD_SYNC_INFO_IND ||
+					(cmd[0] > MCAP_MD_DELETE_MDL_RSP &&
+					cmd[0] < MCAP_MD_SYNC_CAP_REQ)) {
+		error("Unknown cmd received (op code = %d)", cmd[0]);
+		send4B_cmd(mcl, MCAP_ERROR_RSP, MCAP_INVALID_OP_CODE,
+							MCAP_MDLID_RESERVED);
+		return;
+	}
+
 	if ((cmd[0] >= MCAP_MD_SYNC_CAP_REQ) &&
 					(cmd[0] <= MCAP_MD_SYNC_INFO_IND)) {
 		proc_sync_cmd(mcl, cmd, len);
-- 
1.6.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux