opensm/osm_sa_multipath_record.c: Fix seg fault in mpr_rcv_get_apm_paths
PATCH 1/1 opensm/osm_sa_multipath_record.c: Fix seg fault in mpr_rcv_get_apm_paths
When routing fails, mpr_rcv_get_apm_port_pair_paths returns NULL and this is not handled in mpr_rcv_get_apm_paths
---
opensm/osm_sa_multipath_record.c +56 -32
@@ -1415,26 +1415,46 @@ static void mpr_rcv_get_apm_paths(IN osm_sa_t * sa,OSM_LOG (sa->p_log,OSM_LOG_DEBUG ,"APM matrix:\n" "\t{0,0} 0x%X->0x%X (%d)\t| {0,1} 0x%X->0x%X (%d)\n" "\t{1,0} 0x%X->0x%X (%d)\t| {1,1} 0x%X->0x%X (%d)\n" , - matrix[0 ][0 ]->resp.mpr_rec.path_rec.slid, - matrix[0 ][0 ]->resp.mpr_rec.path_rec.dlid, - matrix[0 ][0 ]->resp.mpr_rec.hops, - matrix[0 ][1 ]->resp.mpr_rec.path_rec.slid, - matrix[0 ][1 ]->resp.mpr_rec.path_rec.dlid, - matrix[0 ][1 ]->resp.mpr_rec.hops, - matrix[1 ][0 ]->resp.mpr_rec.path_rec.slid, - matrix[1 ][0 ]->resp.mpr_rec.path_rec.dlid, - matrix[1 ][0 ]->resp.mpr_rec.hops, - matrix[1 ][1 ]->resp.mpr_rec.path_rec.slid, - matrix[1 ][1 ]->resp.mpr_rec.path_rec.dlid, - matrix[1 ][1 ]->resp.mpr_rec.hops); + matrix[0 ][0 ] ? matrix[0 ][0 ]->resp.mpr_rec.path_rec.slid :0 , + matrix[0 ][0 ] ? matrix[0 ][0 ]->resp.mpr_rec.path_rec.dlid :0 , + matrix[0 ][0 ] ? matrix[0 ][0 ]->resp.mpr_rec.hops :0 , + matrix[0 ][1 ] ? matrix[0 ][1 ]->resp.mpr_rec.path_rec.slid :0 , + matrix[0 ][1 ] ? matrix[0 ][1 ]->resp.mpr_rec.path_rec.dlid :0 , + matrix[0 ][1 ] ? matrix[0 ][1 ]->resp.mpr_rec.hops :0 , + matrix[1 ][0 ] ? matrix[1 ][0 ]->resp.mpr_rec.path_rec.slid :0 , + matrix[1 ][0 ] ? matrix[1 ][0 ]->resp.mpr_rec.path_rec.dlid :0 , + matrix[1 ][0 ] ? matrix[1 ][0 ]->resp.mpr_rec.hops :0 , + matrix[1 ][1 ] ? matrix[1 ][1 ]->resp.mpr_rec.path_rec.slid :0 , + matrix[1 ][1 ] ? matrix[1 ][1 ]->resp.mpr_rec.path_rec.dlid :0 , + matrix[1 ][1 ] ? matrix[1 ][1 ]->resp.mpr_rec.hops :0 ); + + sumA = minA = sumB = minB =0 ;/* check diagonal A {(0,0), (1,1)} */ - sumA = matrix[0 ][0 ]->resp.mpr_rec.hops + matrix[1 ][1 ]->resp.mpr_rec.hops; - minA =min (matrix[0 ][0 ]->resp.mpr_rec.hops, matrix[1 ][1 ]->resp.mpr_rec.hops); +if (matrix[0 ][0 ]) { + sumA += matrix[0 ][0 ]->resp.mpr_rec.hops; + minA = matrix[0 ][0 ]->resp.mpr_rec.hops; + } +if (matrix[1 ][1 ]) { + sumA += matrix[1 ][1 ]->resp.mpr_rec.hops; +if (minA) + minA =min (minA, matrix[1 ][1 ]->resp.mpr_rec.hops); +else + minA = matrix[1 ][1 ]->resp.mpr_rec.hops; + }/* check diagonal B {(0,1), (1,0)} */ - sumB = matrix[0 ][1 ]->resp.mpr_rec.hops + matrix[1 ][0 ]->resp.mpr_rec.hops; - minB =min (matrix[0 ][1 ]->resp.mpr_rec.hops, matrix[1 ][0 ]->resp.mpr_rec.hops); +if (matrix[0 ][1 ]) { + sumB += matrix[0 ][1 ]->resp.mpr_rec.hops; + minB = matrix[0 ][1 ]->resp.mpr_rec.hops; + } +if (matrix[1 ][0 ]) { + sumB += matrix[1 ][0 ]->resp.mpr_rec.hops; +if (minB) + minB =min (minB, matrix[1 ][0 ]->resp.mpr_rec.hops); +else + minB = matrix[1 ][0 ]->resp.mpr_rec.hops; + }/* and the winner is... */ if (minA <= minB || (minA == minB && sumA < sumB)) {
@@ -1442,14 +1462,16 @@ static void mpr_rcv_get_apm_paths(IN osm_sa_t * sa,OSM_LOG (sa->p_log,OSM_LOG_DEBUG ,"Diag {0,0} & {1,1} is the best:\n" "\t{0,0} 0x%X->0x%X (%d)\t & {1,1} 0x%X->0x%X (%d)\n" , - matrix[0 ][0 ]->resp.mpr_rec.path_rec.slid, - matrix[0 ][0 ]->resp.mpr_rec.path_rec.dlid, - matrix[0 ][0 ]->resp.mpr_rec.hops, - matrix[1 ][1 ]->resp.mpr_rec.path_rec.slid, - matrix[1 ][1 ]->resp.mpr_rec.path_rec.dlid, - matrix[1 ][1 ]->resp.mpr_rec.hops); -cl_qlist_insert_tail (p_list, &matrix[0 ][0 ]->list_item); -cl_qlist_insert_tail (p_list, &matrix[1 ][1 ]->list_item); + matrix[0 ][0 ] ? matrix[0 ][0 ]->resp.mpr_rec.path_rec.slid :0 , + matrix[0 ][0 ] ? matrix[0 ][0 ]->resp.mpr_rec.path_rec.dlid :0 , + matrix[0 ][0 ] ? matrix[0 ][0 ]->resp.mpr_rec.hops :0 , + matrix[1 ][1 ] ? matrix[1 ][1 ]->resp.mpr_rec.path_rec.slid :0 , + matrix[1 ][1 ] ? matrix[1 ][1 ]->resp.mpr_rec.path_rec.dlid :0 , + matrix[1 ][1 ] ? matrix[1 ][1 ]->resp.mpr_rec.hops :0 ); +if (matrix[0 ][0 ]) +cl_qlist_insert_tail (p_list, &matrix[0 ][0 ]->list_item); +if (matrix[1 ][1 ]) +cl_qlist_insert_tail (p_list, &matrix[1 ][1 ]->list_item);free (matrix[0 ][1 ]);free (matrix[1 ][0 ]); }else {
@@ -1457,14 +1479,16 @@ static void mpr_rcv_get_apm_paths(IN osm_sa_t * sa,OSM_LOG (sa->p_log,OSM_LOG_DEBUG ,"Diag {0,1} & {1,0} is the best:\n" "\t{0,1} 0x%X->0x%X (%d)\t & {1,0} 0x%X->0x%X (%d)\n" , - matrix[0 ][1 ]->resp.mpr_rec.path_rec.slid, - matrix[0 ][1 ]->resp.mpr_rec.path_rec.dlid, - matrix[0 ][1 ]->resp.mpr_rec.hops, - matrix[1 ][0 ]->resp.mpr_rec.path_rec.slid, - matrix[1 ][0 ]->resp.mpr_rec.path_rec.dlid, - matrix[1 ][0 ]->resp.mpr_rec.hops); -cl_qlist_insert_tail (p_list, &matrix[0 ][1 ]->list_item); -cl_qlist_insert_tail (p_list, &matrix[1 ][0 ]->list_item); + matrix[0 ][1 ] ? matrix[0 ][1 ]->resp.mpr_rec.path_rec.slid :0 , + matrix[0 ][1 ] ? matrix[0 ][1 ]->resp.mpr_rec.path_rec.dlid :0 , + matrix[0 ][1 ] ? matrix[0 ][1 ]->resp.mpr_rec.hops :0 , + matrix[1 ][0 ] ? matrix[1 ][0 ]->resp.mpr_rec.path_rec.slid :0 , + matrix[1 ][0 ] ? matrix[1 ][0 ]->resp.mpr_rec.path_rec.dlid:0 , + matrix[1 ][0 ] ? matrix[1 ][0 ]->resp.mpr_rec.hops :0 ); +if (matrix[0 ][1 ]) +cl_qlist_insert_tail (p_list, &matrix[0 ][1 ]->list_item); +if (matrix[1 ][0 ]) +cl_qlist_insert_tail (p_list, &matrix[1 ][0 ]->list_item);free (matrix[0 ][0 ]);free (matrix[1 ][1 ]); }
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html