Blob Blame History Raw
From: Leon Romanovsky <leon@kernel.org>
Date: Fri, 8 Sep 2017 13:02:26 +0300
Subject: RDAM/netlink: Fix out-of-bound access while checking message validity
Patch-mainline: v4.14-rc1
Git-commit: 8b2c7e7a3cb2093bf3257c146c5822437fdf3124
References: bsc#1046306 FATE#322942

The netlink message sent with type == 0, which doesn't have any client
behind it, caused to the overflow in max_num_ops array.

Fix it by declaring zero number of ops for the first client.

Fixes: c9901724a2f1 ("RDMA/netlink: Remove netlink clients infrastructure")
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
---
 drivers/infiniband/core/netlink.c |    7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

--- a/drivers/infiniband/core/netlink.c
+++ b/drivers/infiniband/core/netlink.c
@@ -57,7 +57,8 @@ EXPORT_SYMBOL(rdma_nl_chk_listeners);
 
 static bool is_nl_msg_valid(unsigned int type, unsigned int op)
 {
-	static const unsigned int max_num_ops[RDMA_NL_NUM_CLIENTS - 1] = {
+	static const unsigned int max_num_ops[RDMA_NL_NUM_CLIENTS] = {
+				  0,
 				  RDMA_NL_RDMA_CM_NUM_OPS,
 				  RDMA_NL_IWPM_NUM_OPS,
 				  0,
@@ -70,10 +71,10 @@ static bool is_nl_msg_valid(unsigned int
 	 */
 	BUILD_BUG_ON(RDMA_NL_NUM_CLIENTS != 6);
 
-	if (type > RDMA_NL_NUM_CLIENTS - 1)
+	if (type >= RDMA_NL_NUM_CLIENTS)
 		return false;
 
-	return (op < max_num_ops[type - 1]) ? true : false;
+	return (op < max_num_ops[type]) ? true : false;
 }
 
 static bool is_nl_valid(unsigned int type, unsigned int op)