summaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
authorTaras Kondratiuk <takondra@cisco.com>2019-07-29 18:15:07 -0400
committerDavid S. Miller <davem@davemloft.net>2019-08-01 18:14:00 -0400
commit4da5f0018eef4c0de31675b670c80e82e13e99d1 (patch)
tree0a09e1d7c63b8043c873d6c46281278224d5f1f7 /net/tipc
parent18601078957b8b9e529a2cc99e72617923e21a55 (diff)
tipc: compat: allow tipc commands without arguments
Commit 2753ca5d9009 ("tipc: fix uninit-value in tipc_nl_compat_doit") broke older tipc tools that use compat interface (e.g. tipc-config from tipcutils package): % tipc-config -p operation not supported The commit started to reject TIPC netlink compat messages that do not have attributes. It is too restrictive because some of such messages are valid (they don't need any arguments): % grep 'tx none' include/uapi/linux/tipc_config.h #define TIPC_CMD_NOOP 0x0000 /* tx none, rx none */ #define TIPC_CMD_GET_MEDIA_NAMES 0x0002 /* tx none, rx media_name(s) */ #define TIPC_CMD_GET_BEARER_NAMES 0x0003 /* tx none, rx bearer_name(s) */ #define TIPC_CMD_SHOW_PORTS 0x0006 /* tx none, rx ultra_string */ #define TIPC_CMD_GET_REMOTE_MNG 0x4003 /* tx none, rx unsigned */ #define TIPC_CMD_GET_MAX_PORTS 0x4004 /* tx none, rx unsigned */ #define TIPC_CMD_GET_NETID 0x400B /* tx none, rx unsigned */ #define TIPC_CMD_NOT_NET_ADMIN 0xC001 /* tx none, rx none */ This patch relaxes the original fix and rejects messages without arguments only if such arguments are expected by a command (reg_type is non zero). Fixes: 2753ca5d9009 ("tipc: fix uninit-value in tipc_nl_compat_doit") Cc: stable@vger.kernel.org Signed-off-by: Taras Kondratiuk <takondra@cisco.com> Acked-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/netlink_compat.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/net/tipc/netlink_compat.c b/net/tipc/netlink_compat.c
index d86030ef1232..e135d4e11231 100644
--- a/net/tipc/netlink_compat.c
+++ b/net/tipc/netlink_compat.c
@@ -55,6 +55,7 @@ struct tipc_nl_compat_msg {
55 int rep_type; 55 int rep_type;
56 int rep_size; 56 int rep_size;
57 int req_type; 57 int req_type;
58 int req_size;
58 struct net *net; 59 struct net *net;
59 struct sk_buff *rep; 60 struct sk_buff *rep;
60 struct tlv_desc *req; 61 struct tlv_desc *req;
@@ -257,7 +258,8 @@ static int tipc_nl_compat_dumpit(struct tipc_nl_compat_cmd_dump *cmd,
257 int err; 258 int err;
258 struct sk_buff *arg; 259 struct sk_buff *arg;
259 260
260 if (msg->req_type && !TLV_CHECK_TYPE(msg->req, msg->req_type)) 261 if (msg->req_type && (!msg->req_size ||
262 !TLV_CHECK_TYPE(msg->req, msg->req_type)))
261 return -EINVAL; 263 return -EINVAL;
262 264
263 msg->rep = tipc_tlv_alloc(msg->rep_size); 265 msg->rep = tipc_tlv_alloc(msg->rep_size);
@@ -354,7 +356,8 @@ static int tipc_nl_compat_doit(struct tipc_nl_compat_cmd_doit *cmd,
354{ 356{
355 int err; 357 int err;
356 358
357 if (msg->req_type && !TLV_CHECK_TYPE(msg->req, msg->req_type)) 359 if (msg->req_type && (!msg->req_size ||
360 !TLV_CHECK_TYPE(msg->req, msg->req_type)))
358 return -EINVAL; 361 return -EINVAL;
359 362
360 err = __tipc_nl_compat_doit(cmd, msg); 363 err = __tipc_nl_compat_doit(cmd, msg);
@@ -1278,8 +1281,8 @@ static int tipc_nl_compat_recv(struct sk_buff *skb, struct genl_info *info)
1278 goto send; 1281 goto send;
1279 } 1282 }
1280 1283
1281 len = nlmsg_attrlen(req_nlh, GENL_HDRLEN + TIPC_GENL_HDRLEN); 1284 msg.req_size = nlmsg_attrlen(req_nlh, GENL_HDRLEN + TIPC_GENL_HDRLEN);
1282 if (!len || !TLV_OK(msg.req, len)) { 1285 if (msg.req_size && !TLV_OK(msg.req, msg.req_size)) {
1283 msg.rep = tipc_get_err_tlv(TIPC_CFG_NOT_SUPPORTED); 1286 msg.rep = tipc_get_err_tlv(TIPC_CFG_NOT_SUPPORTED);
1284 err = -EOPNOTSUPP; 1287 err = -EOPNOTSUPP;
1285 goto send; 1288 goto send;