From 1c2a74ca306680b40ca41812c2d008b926189b97 Mon Sep 17 00:00:00 2001 From: Artem Polyakov Date: Wed, 20 Dec 2017 10:03:24 +0700 Subject: [PATCH] fix #2 1. Fix the memory corruption caused by improper space allocation 2. Fix iov access, need indexing, otherwise its the same element --- src/ucp/core/ucp_request.c | 4 ++-- src/ucp/proto/proto_dt.c | 18 +++++++----------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/ucp/core/ucp_request.c b/src/ucp/core/ucp_request.c index 0b1b80e19d4..2c8ffdf98d5 100644 --- a/src/ucp/core/ucp_request.c +++ b/src/ucp/core/ucp_request.c @@ -283,9 +283,9 @@ UCS_PROFILE_FUNC(ucs_status_t, ucp_request_memory_reg, goto err; } for (iov_it = 0; iov_it < iovcnt; ++iov_it) { - size_t iov_len = ucp_dt_extent(iov->dt, iov->count, NULL, NULL); + size_t iov_len = ucp_dt_extent(iov[iov_it].dt, iov[iov_it].count, NULL, NULL); if (iov_len) { - status = uct_md_mem_reg(uct_md, iov->buffer, iov_len, 0, + status = uct_md_mem_reg(uct_md, iov[iov_it].buffer, iov_len, 0, &memh[iov_it]); if (status != UCS_OK) { /* unregister previously registered memory */ diff --git a/src/ucp/proto/proto_dt.c b/src/ucp/proto/proto_dt.c index 0da39bab71e..904eef53720 100644 --- a/src/ucp/proto/proto_dt.c +++ b/src/ucp/proto/proto_dt.c @@ -149,18 +149,10 @@ ucs_status_t ucp_dt_reusable_create(uct_ep_h ep, void *buffer, size_t length, size_t uct_iovcnt = 0; size_t length_it = 0; - dt_ex->reusable.nc_iov = ucs_malloc(sizeof(uct_iov_t) * uct_iovcnt, "reusable_iov"); - if (!dt_ex->reusable.nc_iov) { - return UCS_ERR_NO_MEMORY; - } - switch (datatype & UCP_DATATYPE_CLASS_MASK) { case UCP_DATATYPE_STRIDE_R: uct_iovcnt = ucp_dt_count_uct_iov(datatype, 1, buffer, NULL); // TODO: "half-state"? - dt_ex->reusable.length = ucp_dt_stride_copy_uct(dt_ex->reusable.nc_iov, - &dt_ex->reusable.nc_iovcnt, uct_iovcnt, state, buffer, datatype, length); break; - case UCP_DATATYPE_IOV_R: iov_it = buffer; while (length_it < length) { @@ -168,9 +160,6 @@ ucs_status_t ucp_dt_reusable_create(uct_ep_h ep, void *buffer, size_t length, uct_iovcnt += ucp_dt_count_uct_iov(iov_it->dt, iov_it->count, iov_it->buffer, NULL); iov_it++; } - - dt_ex->reusable.length = ucp_dt_iov_copy_uct(dt_ex->reusable.nc_iov, - &dt_ex->reusable.nc_iovcnt, uct_iovcnt, state, buffer, datatype, length); break; default: @@ -179,6 +168,13 @@ ucs_status_t ucp_dt_reusable_create(uct_ep_h ep, void *buffer, size_t length, return UCS_ERR_INVALID_PARAM; } + dt_ex->reusable.nc_iov = ucs_malloc(sizeof(uct_iov_t) * uct_iovcnt, "reusable_iov"); + if (!dt_ex->reusable.nc_iov) { + return UCS_ERR_NO_MEMORY; + } + dt_ex->reusable.length = ucp_dt_iov_copy_uct(dt_ex->reusable.nc_iov, + &dt_ex->reusable.nc_iovcnt, uct_iovcnt, state, buffer, datatype, length); + dt_ex->reusable.nc_comp.func = ucp_dt_reusable_completion; return uct_ep_mem_reg_nc(ep, dt_ex->reusable.nc_iov, dt_ex->reusable.nc_iovcnt, &dt_ex->reusable.nc_md, &dt_ex->reusable.nc_memh, &dt_ex->reusable.nc_comp);