The common function sa_query should pass the correct data size to mad_build_pkt for it's internal memcpy.
Signed-off-by: Ira Weiny <wei...@llnl.gov> --- include/ibdiag_common.h | 2 +- src/ibdiag_common.c | 5 +++-- src/saquery.c | 34 ++++++++++++++++++---------------- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/include/ibdiag_common.h b/include/ibdiag_common.h index 6dade10..7e6d5c1 100644 --- a/include/ibdiag_common.h +++ b/include/ibdiag_common.h @@ -122,7 +122,7 @@ struct sa_query_result { }; int sa_query(struct bind_handle *h, uint8_t method, uint16_t attr, uint32_t mod, uint64_t comp_mask, uint64_t sm_key, - void *data, struct sa_query_result *result); + void *data, size_t datasz, struct sa_query_result *result); void sa_free_result_mad(struct sa_query_result *result); void *sa_get_query_rec(void *mad, unsigned i); void sa_report_err(int status); diff --git a/src/ibdiag_common.c b/src/ibdiag_common.c index e242175..6b8aea0 100644 --- a/src/ibdiag_common.c +++ b/src/ibdiag_common.c @@ -725,7 +725,8 @@ void sa_free_bind_handle(bind_handle_t h) int sa_query(bind_handle_t h, uint8_t method, uint16_t attr, uint32_t mod, uint64_t comp_mask, - uint64_t sm_key, void *data, struct sa_query_result *result) + uint64_t sm_key, void *data, size_t datasz, + struct sa_query_result *result) { ib_rpc_t rpc; void *umad, *mad; @@ -737,7 +738,7 @@ int sa_query(bind_handle_t h, uint8_t method, rpc.attr.id = attr; rpc.attr.mod = mod; rpc.mask = comp_mask; - rpc.datasz = IB_SA_DATA_SIZE; + rpc.datasz = datasz; rpc.dataoffs = IB_SA_DATA_OFFS; umad = calloc(1, len + umad_size()); diff --git a/src/saquery.c b/src/saquery.c index 6e09374..c599e0c 100644 --- a/src/saquery.c +++ b/src/saquery.c @@ -724,10 +724,11 @@ static void dump_results(struct sa_query_result *r, void (*dump_func) (void *)) static int get_any_records(bind_handle_t h, uint16_t attr_id, uint32_t attr_mod, ib_net64_t comp_mask, void *attr, + size_t attr_size, struct sa_query_result *result) { int ret = sa_query(h, IB_MAD_METHOD_GET_TABLE, attr_id, attr_mod, - cl_ntoh64(comp_mask), ibd_sakey, attr, result); + cl_ntoh64(comp_mask), ibd_sakey, attr, attr_size, result); if (ret) { fprintf(stderr, "Query SA failed: %s\n", strerror(ret)); return ret; @@ -744,11 +745,12 @@ static int get_any_records(bind_handle_t h, static int get_and_dump_any_records(bind_handle_t h, uint16_t attr_id, uint32_t attr_mod, ib_net64_t comp_mask, void *attr, + size_t attr_size, void (*dump_func) (void *)) { struct sa_query_result result; int ret = get_any_records(h, attr_id, attr_mod, comp_mask, attr, - &result); + attr_size, &result); if (ret) return ret; @@ -763,7 +765,7 @@ static int get_and_dump_any_records(bind_handle_t h, uint16_t attr_id, static int get_all_records(bind_handle_t h, uint16_t attr_id, struct sa_query_result *result) { - return get_any_records(h, attr_id, 0, 0, NULL, result); + return get_any_records(h, attr_id, 0, 0, NULL, 0, result); } static int get_and_dump_all_records(bind_handle_t h, uint16_t attr_id, @@ -890,7 +892,7 @@ static int get_issm_records(bind_handle_t h, ib_net32_t capability_mask, attr.port_info.capability_mask = capability_mask; return get_any_records(h, IB_SA_ATTR_PORTINFORECORD, 1 << 31, - IB_PIR_COMPMASK_CAPMASK, &attr, result); + IB_PIR_COMPMASK_CAPMASK, &attr, sizeof(attr), result); } static int print_node_records(bind_handle_t h) @@ -942,7 +944,7 @@ static int get_print_class_port_info(bind_handle_t h) { struct sa_query_result result; int ret = sa_query(h, IB_MAD_METHOD_GET, CLASS_PORT_INFO, 0, 0, - ibd_sakey, NULL, &result); + ibd_sakey, NULL, 0, &result); if (ret) { fprintf(stderr, "ERROR: Query SA failed: %s\n", strerror(ret)); return ret; @@ -989,7 +991,7 @@ static int query_path_records(const struct query_cmd *q, bind_handle_t h, SELEC); return get_and_dump_any_records(h, IB_SA_ATTR_PATHRECORD, 0, comp_mask, - &pr, dump_path_record); + &pr, sizeof(pr), dump_path_record); } static int print_issm_records(bind_handle_t h) @@ -1074,7 +1076,7 @@ static int query_node_records(const struct query_cmd *q, bind_handle_t h, CHECK_AND_SET_VAL(lid, 16, 0, nr.lid, NR, LID); return get_and_dump_any_records(h, IB_SA_ATTR_NODERECORD, 0, comp_mask, - &nr, dump_node_record); + &nr, sizeof(nr), dump_node_record); } static int query_portinfo_records(const struct query_cmd *q, @@ -1094,7 +1096,7 @@ static int query_portinfo_records(const struct query_cmd *q, CHECK_AND_SET_VAL(options, 8, -1, pir.options, PIR, OPTIONS); return get_and_dump_any_records(h, IB_SA_ATTR_PORTINFORECORD, 0, - comp_mask, &pir, + comp_mask, &pir, sizeof(pir), dump_one_portinfo_record); } @@ -1127,7 +1129,7 @@ static int query_mcmember_records(const struct query_cmd *q, CHECK_AND_SET_VAL(p->proxy_join, 8, -1, mr.proxy_join, MCR, PROXY); return get_and_dump_any_records(h, IB_SA_ATTR_MCRECORD, 0, comp_mask, - &mr, dump_one_mcmember_record); + &mr, sizeof(mr), dump_one_mcmember_record); } static int query_service_records(const struct query_cmd *q, bind_handle_t h, @@ -1165,7 +1167,7 @@ static int query_link_records(const struct query_cmd *q, bind_handle_t h, CHECK_AND_SET_VAL(to_port, 8, -1, lr.to_port_num, LR, TO_PORT); return get_and_dump_any_records(h, IB_SA_ATTR_LINKRECORD, 0, comp_mask, - &lr, dump_one_link_record); + &lr, sizeof(lr), dump_one_link_record); } static int query_sl2vl_records(const struct query_cmd *q, bind_handle_t h, @@ -1184,7 +1186,7 @@ static int query_sl2vl_records(const struct query_cmd *q, bind_handle_t h, CHECK_AND_SET_VAL(out_port, 8, -1, slvl.out_port_num, SLVL, OUT_PORT); return get_and_dump_any_records(h, IB_SA_ATTR_SL2VLTABLERECORD, 0, - comp_mask, &slvl, + comp_mask, &slvl, sizeof(slvl), dump_one_slvl_record); } @@ -1204,7 +1206,7 @@ static int query_vlarb_records(const struct query_cmd *q, bind_handle_t h, CHECK_AND_SET_VAL(block, 8, -1, vlarb.block_num, VLA, BLOCK); return get_and_dump_any_records(h, IB_SA_ATTR_VLARBTABLERECORD, 0, - comp_mask, &vlarb, + comp_mask, &vlarb, sizeof(vlarb), dump_one_vlarb_record); } @@ -1225,7 +1227,7 @@ static int query_pkey_tbl_records(const struct query_cmd *q, CHECK_AND_SET_VAL(block, 16, -1, pktr.block_num, PKEY, BLOCK); return get_and_dump_any_records(h, IB_SA_ATTR_PKEYTABLERECORD, 0, - comp_mask, &pktr, + comp_mask, &pktr, sizeof(pktr), dump_one_pkey_tbl_record); } @@ -1244,7 +1246,7 @@ static int query_lft_records(const struct query_cmd *q, bind_handle_t h, CHECK_AND_SET_VAL(block, 16, -1, lftr.block_num, LFTR, BLOCK); return get_and_dump_any_records(h, IB_SA_ATTR_LFTRECORD, 0, comp_mask, - &lftr, dump_one_lft_record); + &lftr, sizeof(lftr), dump_one_lft_record); } static int query_guidinfo_records(const struct query_cmd *q, bind_handle_t h, @@ -1262,7 +1264,7 @@ static int query_guidinfo_records(const struct query_cmd *q, bind_handle_t h, CHECK_AND_SET_VAL(block, 8, -1, gir.block_num, GIR, BLOCKNUM); return get_and_dump_any_records(h, IB_SA_ATTR_GUIDINFORECORD, 0, - comp_mask, &gir, + comp_mask, &gir, sizeof(gir), dump_one_guidinfo_record); } @@ -1285,7 +1287,7 @@ static int query_mft_records(const struct query_cmd *q, bind_handle_t h, mftr.position_block_num |= cl_hton16(pos << 12); return get_and_dump_any_records(h, IB_SA_ATTR_MFTRECORD, 0, comp_mask, - &mftr, dump_one_mft_record); + &mftr, sizeof(mftr), dump_one_mft_record); } static const struct query_cmd query_cmds[] = { -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html