static int cma_bind_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
                         const struct sockaddr *dst_addr)
 {
-       if (!src_addr || !src_addr->sa_family) {
-               src_addr = (struct sockaddr *) &id->route.addr.src_addr;
-               src_addr->sa_family = dst_addr->sa_family;
-               if (IS_ENABLED(CONFIG_IPV6) &&
-                   dst_addr->sa_family == AF_INET6) {
-                       struct sockaddr_in6 *src_addr6 = (struct sockaddr_in6 *) src_addr;
-                       struct sockaddr_in6 *dst_addr6 = (struct sockaddr_in6 *) dst_addr;
-                       src_addr6->sin6_scope_id = dst_addr6->sin6_scope_id;
-                       if (ipv6_addr_type(&dst_addr6->sin6_addr) & IPV6_ADDR_LINKLOCAL)
-                               id->route.addr.dev_addr.bound_dev_if = dst_addr6->sin6_scope_id;
-               } else if (dst_addr->sa_family == AF_IB) {
-                       ((struct sockaddr_ib *) src_addr)->sib_pkey =
-                               ((struct sockaddr_ib *) dst_addr)->sib_pkey;
-               }
-       }
-       return rdma_bind_addr(id, src_addr);
+       struct sockaddr_storage zero_sock = {};
+
+       if (src_addr && src_addr->sa_family)
+               return rdma_bind_addr(id, src_addr);
+
+       /*
+        * When the src_addr is not specified, automatically supply an any addr
+        */
+       zero_sock.ss_family = dst_addr->sa_family;
+       if (IS_ENABLED(CONFIG_IPV6) && dst_addr->sa_family == AF_INET6) {
+               struct sockaddr_in6 *src_addr6 =
+                       (struct sockaddr_in6 *)&zero_sock;
+               struct sockaddr_in6 *dst_addr6 =
+                       (struct sockaddr_in6 *)dst_addr;
+
+               src_addr6->sin6_scope_id = dst_addr6->sin6_scope_id;
+               if (ipv6_addr_type(&dst_addr6->sin6_addr) & IPV6_ADDR_LINKLOCAL)
+                       id->route.addr.dev_addr.bound_dev_if =
+                               dst_addr6->sin6_scope_id;
+       } else if (dst_addr->sa_family == AF_IB) {
+               ((struct sockaddr_ib *)&zero_sock)->sib_pkey =
+                       ((struct sockaddr_ib *)dst_addr)->sib_pkey;
+       }
+       return rdma_bind_addr(id, (struct sockaddr *)&zero_sock);
 }
 
 /*