| @@ -210,9 +210,24 @@ Status Tensor::CreateFromNpArray(const py::array &arr, std::shared_ptr<Tensor> * | |||||
| if (is_strided) { | if (is_strided) { | ||||
| RETURN_IF_NOT_OK(CopyStridedArray((*out)->data_, data, shape, strides, (*out)->type_.SizeInBytes())); | RETURN_IF_NOT_OK(CopyStridedArray((*out)->data_, data, shape, strides, (*out)->type_.SizeInBytes())); | ||||
| } else { | } else { | ||||
| int ret_code = memcpy_s((*out)->data_, byte_size, data, byte_size); | |||||
| if (ret_code != 0) { | |||||
| RETURN_STATUS_UNEXPECTED("Failed to copy data into Tensor."); | |||||
| // fix: memcpy_s will fail when byte_size > 2^31 - 1 | |||||
| uint32_t step = 1; | |||||
| while (byte_size > (step * kDeMaxDim)) { | |||||
| int ret_code = | |||||
| memcpy_s((*out)->data_ + (step - 1) * kDeMaxDim, kDeMaxDim, data + (step - 1) * kDeMaxDim, kDeMaxDim); | |||||
| if (ret_code != 0) { | |||||
| RETURN_STATUS_UNEXPECTED("Failed to copy data into Tensor."); | |||||
| } | |||||
| step++; | |||||
| } | |||||
| // copy the last | |||||
| if (byte_size > ((step - 1) * kDeMaxDim) && byte_size <= (step * kDeMaxDim)) { | |||||
| int ret_code = memcpy_s((*out)->data_ + (step - 1) * kDeMaxDim, byte_size - ((step - 1) * kDeMaxDim), | |||||
| data + (step - 1) * kDeMaxDim, byte_size - ((step - 1) * kDeMaxDim)); | |||||
| if (ret_code != 0) { | |||||
| RETURN_STATUS_UNEXPECTED("Failed to copy data into Tensor."); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||