]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
be2iscsi: Fix MCC WRB leak in open_connection
authorJitendra Bhivare <jitendra.bhivare@broadcom.com>
Thu, 4 Feb 2016 10:19:16 +0000 (15:49 +0530)
committerChuck Anderson <chuck.anderson@oracle.com>
Thu, 10 Mar 2016 15:21:56 +0000 (07:21 -0800)
Orabug: 22725588

In open with IP of unknown address family, only tag is freed and error
returned. MCC WRB allocated for the operation is not freed.

Added check for supported family of IP in the beginning before
allocating the tag and WRB.

Signed-off-by: Jitendra Bhivare <jitendra.bhivare@broadcom.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Dan Duval <dan.duval@oracle.com>
drivers/scsi/be2iscsi/be_mgmt.c

index 505d01a9279dc096d6dbddd783b25a83ab7b35cf..54ed7cf604ee52b2a17dac9da1c3f365efc344fc 100644 (file)
@@ -829,6 +829,13 @@ int mgmt_open_connection(struct beiscsi_hba *phba,
        unsigned short cid = beiscsi_ep->ep_cid;
        struct be_sge *sge;
 
+       if (dst_addr->sa_family != PF_INET && dst_addr->sa_family != PF_INET6) {
+               beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
+                           "BG_%d : unknown addr family %d\n",
+                           dst_addr->sa_family);
+               return -EINVAL;
+       }
+
        phwi_ctrlr = phba->phwi_ctrlr;
        phwi_context = phwi_ctrlr->phwi_ctxt;
 
@@ -868,7 +875,8 @@ int mgmt_open_connection(struct beiscsi_hba *phba,
                beiscsi_ep->dst_addr = daddr_in->sin_addr.s_addr;
                beiscsi_ep->dst_tcpport = ntohs(daddr_in->sin_port);
                beiscsi_ep->ip_type = BE2_IPV4;
-       } else if (dst_addr->sa_family == PF_INET6) {
+       } else {
+               /* else its PF_INET6 family */
                req->ip_address.ip_type = BE2_IPV6;
                memcpy(&req->ip_address.addr,
                       &daddr_in6->sin6_addr.in6_u.u6_addr8, 16);
@@ -877,14 +885,6 @@ int mgmt_open_connection(struct beiscsi_hba *phba,
                memcpy(&beiscsi_ep->dst6_addr,
                       &daddr_in6->sin6_addr.in6_u.u6_addr8, 16);
                beiscsi_ep->ip_type = BE2_IPV6;
-       } else{
-               beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
-                           "BG_%d : unknown addr family %d\n",
-                           dst_addr->sa_family);
-               mutex_unlock(&ctrl->mbox_lock);
-               free_mcc_tag(&phba->ctrl, tag);
-               return -EINVAL;
-
        }
        req->cid = cid;
        i = phba->nxt_cqid++;