]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
[IBAL] fix using of ual_get_gid_index()
authorleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Mon, 1 Sep 2008 12:45:34 +0000 (12:45 +0000)
committerleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Mon, 1 Sep 2008 12:45:34 +0000 (12:45 +0000)
The patch fixes accessing p_user_attr field which lead to access violation, the actual field is p_pnp_attr.
It also moves port checking to the head of the function stack.

git-svn-id: svn://openib.tc.cornell.edu/gen1@1538 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

branches/WOF2-0/trunk/core/al/al_av.c
branches/WOF2-0/trunk/core/al/user/ual_av.c

index fff207c1fe54555391044d0a28aeb2ca5f710590..b94162e4a19db23a68e9e0acea2f81fab7b3b1d7 100644 (file)
@@ -112,6 +112,22 @@ av_dtor(
 }\r
 \r
 \r
+static ib_api_status_t\r
+__check_av_port(\r
+       IN              const   al_ci_ca_t*     const                   p_ci_ca,\r
+       IN              const   ib_av_attr_t* const                     p_av_attr )\r
+{\r
+       ib_api_status_t status = IB_SUCCESS;\r
+\r
+       if (p_av_attr->port_num == 0 || p_av_attr->port_num > p_ci_ca->num_ports)\r
+       {\r
+               AL_PRINT(TRACE_LEVEL_WARNING ,AL_DBG_AV,\r
+                       ("invalid port number specified (%d)\n", p_av_attr->port_num) );\r
+               status = IB_INVALID_PORT;\r
+       }\r
+       return status;\r
+}\r
+\r
 \r
 ib_api_status_t\r
 create_av(\r
@@ -137,6 +153,13 @@ create_av(
                return IB_INVALID_PD_HANDLE;\r
        }\r
 \r
+       status = __check_av_port(h_pd->obj.p_ci_ca, p_av_attr);\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               AL_PRINT_EXIT( TRACE_LEVEL_ERROR, AL_DBG_ERROR, ("IB_INVALID_PORT\n") );\r
+               return status;\r
+       }\r
+       \r
        /* Get an AV tracking structure. */\r
        h_av = alloc_av();\r
        if( !h_av )\r
@@ -302,6 +325,13 @@ modify_av(
                return IB_INVALID_PARAMETER;\r
        }\r
 \r
+       status = __check_av_port(h_av->obj.p_ci_ca, p_av_mod);\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               AL_PRINT_EXIT( TRACE_LEVEL_ERROR, AL_DBG_ERROR, ("IB_INVALID_PORT\n") );\r
+               return status;\r
+       }\r
+\r
        status = verbs_modify_av(h_av, p_av_mod);\r
 \r
        /* Record av for special qp access */\r
index 8ce7f34e36d4cbdc19d1f61664ef70f2ef348baa..03d9df7ed3e35aa3f67c72fa5aac567e58787da7 100644 (file)
@@ -58,17 +58,7 @@ ual_get_gid_index(
        uint16_t                        i;\r
 \r
        ci_ca_lock_attr( p_ci_ca );\r
-\r
-       // sanity check\r
-       if (port_num == 0 || port_num > p_ci_ca->p_user_attr->num_ports)\r
-       {\r
-               AL_PRINT(TRACE_LEVEL_WARNING ,AL_DBG_AV,\r
-                       ("UAL_GET_GID_INDEX: invalid port number specified (%d)\n", port_num) );\r
-               status = IB_INVALID_PORT;\r
-               goto out;\r
-       }\r
-\r
-       p_port_attr = &p_ci_ca->p_user_attr->p_port_attr[port_num];\r
+       p_port_attr = &p_ci_ca->p_pnp_attr->p_port_attr[port_num-1];\r
        for( i = 0; i < p_port_attr->num_gids; i++ )\r
        {\r
                if( !cl_memcmp(p_gid, &p_port_attr->p_gid_table[i], sizeof(ib_gid_t)) )\r
@@ -78,8 +68,6 @@ ual_get_gid_index(
                        break;\r
                }\r
        }\r
-\r
-out:\r
        ci_ca_unlock_attr( p_ci_ca );\r
 \r
        return status;\r