RDMA/ucma: reject AF_IB ip multicast requests
PATCH 1/1 RDMA/ucma: reject AF_IB ip multicast requests
syzbot discovered that ucma_join_ip_multicast() mishandles AF_IB request addresses. If an RDMA_USER_CM_CMD_JOIN_IP_MCAST request has cmd.addr.sa_family=AF_IB then ucma_join_ip_multicast() reads beyond the end of its cmd.addr.
Reject non IP RDMA_USER_CM_CMD_JOIN_IP_MCAST requests. RDMA_USER_CM_CMD_JOIN_MCAST is interface for AF_IB multicast.
And add a buffer length safety check.
--- drivers/infiniband/core/ucma.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/infiniband/core/ucma.c +9 -1
@@ -1423,11 +1423,19 @@ static ssize_t ucma_join_ip_multicast(struct ucma_file *file,if (copy_from_user (&cmd, inbuf,sizeof (cmd)))return -EFAULT ; +switch (cmd.addr.sin6_family) { +case AF_INET : +case AF_INET6 : +break ; +default : +return -EINVAL ; + } + join_cmd.response = cmd.response; join_cmd.uid = cmd.uid; join_cmd.id = cmd.id; join_cmd.addr_size =rdma_addr_size ((struct sockaddr *) &cmd.addr); -if (!join_cmd.addr_size) +if (!join_cmd.addr_size || join_cmd.addr_size >sizeof (cmd.addr))return -EINVAL ; join_cmd.join_flags =RDMA_MC_JOIN_FLAG_FULLMEMBER ;
Signature · 1 line
2.17.0.rc1.321.gba9d0f2565-goog
Quoted 8 lines · Greg Thelen
syzbot discovered that
ucma_join_ip_multicast()mishandlesAF_IBrequest addresses. If anRDMA_USER_CM_CMD_JOIN_IP_MCASTrequest has cmd.addr.sa_family=AF_IB thenucma_join_ip_multicast()reads beyond the end of its cmd.addr.Reject non IP
RDMA_USER_CM_CMD_JOIN_IP_MCASTrequests.RDMA_USER_CM_CMD_JOIN_MCASTis interface forAF_IBmulticast.
Quoted 7 lines
And add a buffer length safety check.
Fixes 5bc2b7b397b0 ("RDMA/ucma: Allow user space to specify AF_IB when joining multicast")Signed-off-by Greg Thelen <[email protected]>--- drivers/infiniband/core/ucma.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
My patch is no longer needed. linus/master recently picked up 84652aefb347 ("RDMA/ucma: Introduce safer rdma_addr_size() variants") which fixes the same issue.
Quoted 28 lines
drivers/infiniband/core/ucma.c +9
-2@@ -1423,11 +1423,19 @@ static ssize_t ucma_join_ip_multicast(struct ucma_file *file,if (copy_from_user (&cmd, inbuf,sizeof (cmd)))return -EFAULT ; +switch (cmd.addr.sin6_family) { +case AF_INET : +case AF_INET6 : +break ; +default : +return -EINVAL ; + } + join_cmd.response = cmd.response; join_cmd.uid = cmd.uid; join_cmd.id = cmd.id; join_cmd.addr_size =rdma_addr_size ((struct sockaddr *) &cmd.addr); -if (!join_cmd.addr_size) +if (!join_cmd.addr_size || join_cmd.addr_size >sizeof (cmd.addr))return -EINVAL ; join_cmd.join_flags =RDMA_MC_JOIN_FLAG_FULLMEMBER ; --2.17.0.rc1.321.gba9d0f2565-goog