Whamcloud - gitweb
LU-10391 socklnd: large processid for ksocknal_get_peer_info 22/44622/4
authorMr NeilBrown <neilb@suse.de>
Wed, 9 Jun 2021 00:27:38 +0000 (10:27 +1000)
committerOleg Drokin <green@whamcloud.com>
Mon, 30 May 2022 19:03:24 +0000 (19:03 +0000)
Have ksocknal_launch_packet() report a 'struct lnet_processid'
with a large address.

Test-Parameters: trivial testlist=sanity-lnet
Test-Parameters: serverversion=2.12 serverdistro=el7.9 testlist=runtests
Test-Parameters: clientversion=2.12 testlist=runtests
Signed-off-by: Mr NeilBrown <neilb@suse.de>
Change-Id: I6dd4b11e0361d893dea519287448028ca0a1ab97
Reviewed-on: https://review.whamcloud.com/44622
Reviewed-by: James Simmons <jsimmons@infradead.org>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Chris Horn <chris.horn@hpe.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lnet/klnds/socklnd/socklnd.c

index 4d6907e..9005154 100644 (file)
@@ -291,7 +291,7 @@ ksocknal_unlink_peer_locked(struct ksock_peer_ni *peer_ni)
 
 static int
 ksocknal_get_peer_info(struct lnet_ni *ni, int index,
-                      struct lnet_process_id *id, __u32 *myip, __u32 *peer_ip,
+                      struct lnet_processid *id, __u32 *myip, __u32 *peer_ip,
                       int *port, int *conn_count, int *share_count)
 {
        struct ksock_peer_ni *peer_ni;
@@ -312,8 +312,7 @@ ksocknal_get_peer_info(struct lnet_ni *ni, int index,
                        if (index-- > 0)
                                continue;
 
-                       id->pid = peer_ni->ksnp_id.pid;
-                       id->nid = lnet_nid_to_nid4(&peer_ni->ksnp_id.nid);
+                       *id = peer_ni->ksnp_id;
                        *myip = 0;
                        *peer_ip = 0;
                        *port = 0;
@@ -327,8 +326,7 @@ ksocknal_get_peer_info(struct lnet_ni *ni, int index,
                        if (index-- > 0)
                                continue;
 
-                       id->pid = peer_ni->ksnp_id.pid;
-                       id->nid = lnet_nid_to_nid4(&peer_ni->ksnp_id.nid);
+                       *id = peer_ni->ksnp_id;
                        *myip = peer_ni->ksnp_passive_ips[j];
                        *peer_ip = 0;
                        *port = 0;
@@ -344,8 +342,7 @@ ksocknal_get_peer_info(struct lnet_ni *ni, int index,
 
                        conn_cb = peer_ni->ksnp_conn_cb;
 
-                       id->pid = peer_ni->ksnp_id.pid;
-                       id->nid = lnet_nid_to_nid4(&peer_ni->ksnp_id.nid);
+                       *id = peer_ni->ksnp_id;
                        if (conn_cb->ksnr_addr.ss_family == AF_INET) {
                                struct sockaddr_in *sa =
                                        (void *)&conn_cb->ksnr_addr;
@@ -1792,18 +1789,19 @@ ksocknal_ctl(struct lnet_ni *ni, unsigned int cmd, void *arg)
                int share_count = 0;
 
                rc = ksocknal_get_peer_info(ni, data->ioc_count,
-                                           &id4, &myip, &ip, &port,
+                                           &id, &myip, &ip, &port,
                                            &conn_count,  &share_count);
                if (rc != 0)
                        return rc;
-
-               data->ioc_nid    = id4.nid;
+               if (!nid_is_nid4(&id.nid))
+                       return -EINVAL;
+               data->ioc_nid    = lnet_nid_to_nid4(&id.nid);
                data->ioc_count  = share_count;
                data->ioc_u32[0] = ip;
                data->ioc_u32[1] = port;
                data->ioc_u32[2] = myip;
                data->ioc_u32[3] = conn_count;
-               data->ioc_u32[4] = id4.pid;
+               data->ioc_u32[4] = id.pid;
                return 0;
        }