From 971d89f5116baa1746b33aedb91a11b1e8af2bbd Mon Sep 17 00:00:00 2001 From: Adam Dybkowski Date: Tue, 23 Jul 2019 11:53:28 +0200 Subject: [PATCH] app/compress-perf: prevent output buffer overflow This patch fixes the issue of memory overwrite after the end of the output buffer by calculating its size as the number of all segments multipled by the output segment size. Additionally buffer overflow errors returned by PMD driver are detected and shown, ending the test. Also the output buffer size multiplier was increased from 105% to 110% to allow running the tests on noncompressible files that expand to over 107% of original size during the compression. The changes were made in the verification part of the flow and they don't affect the benchmark results. Fixes: 424dd6c8c1 ("app/compress-perf: add weak functions for multicore test") Signed-off-by: Adam Dybkowski Acked-by: Fiona Trahe --- app/test-compress-perf/comp_perf_options.h | 2 +- .../comp_perf_test_common.c | 7 +++--- .../comp_perf_test_verify.c | 23 ++++++++++++++++--- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/app/test-compress-perf/comp_perf_options.h b/app/test-compress-perf/comp_perf_options.h index 5a32ed3a6b..651cbea4e2 100644 --- a/app/test-compress-perf/comp_perf_options.h +++ b/app/test-compress-perf/comp_perf_options.h @@ -7,7 +7,7 @@ #define MAX_LIST 32 #define MIN_COMPRESSED_BUF_SIZE 8 -#define EXPANSE_RATIO 1.05 +#define EXPANSE_RATIO 1.1 #define MAX_MBUF_DATA_SIZE (UINT16_MAX - RTE_PKTMBUF_HEADROOM) #define MAX_SEG_SIZE ((int)(MAX_MBUF_DATA_SIZE / EXPANSE_RATIO)) diff --git a/app/test-compress-perf/comp_perf_test_common.c b/app/test-compress-perf/comp_perf_test_common.c index 28be9f257d..6edc40f044 100644 --- a/app/test-compress-perf/comp_perf_test_common.c +++ b/app/test-compress-perf/comp_perf_test_common.c @@ -147,8 +147,10 @@ comp_perf_allocate_memory(struct comp_test_data *test_data, * if data cannot be compressed */ mem->compressed_data = rte_zmalloc_socket(NULL, - test_data->input_data_sz * EXPANSE_RATIO - + MIN_COMPRESSED_BUF_SIZE, 0, + RTE_MAX( + (size_t) test_data->out_seg_sz * total_segs, + (size_t) MIN_COMPRESSED_BUF_SIZE), + 0, rte_socket_id()); if (mem->compressed_data == NULL) { RTE_LOG(ERR, USER1, "Memory to hold the data from the input " @@ -287,7 +289,6 @@ prepare_bufs(struct comp_test_data *test_data, struct cperf_mem_resources *mem) data_addr = (uint8_t *)rte_pktmbuf_append(next_seg, test_data->out_seg_sz); - if (data_addr == NULL) { RTE_LOG(ERR, USER1, "Could not append data\n"); return -1; diff --git a/app/test-compress-perf/comp_perf_test_verify.c b/app/test-compress-perf/comp_perf_test_verify.c index 37ac38da68..f66f95ff7c 100644 --- a/app/test-compress-perf/comp_perf_test_verify.c +++ b/app/test-compress-perf/comp_perf_test_verify.c @@ -217,7 +217,16 @@ main_loop(struct cperf_verify_ctx *ctx, enum rte_comp_xform_type type) for (i = 0; i < num_deq; i++) { struct rte_comp_op *op = deq_ops[i]; - if (op->status != RTE_COMP_OP_STATUS_SUCCESS) { + if (op->status == + RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED || + op->status == + RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE) { + RTE_LOG(ERR, USER1, +"Out of space error occurred due to uncompressible input data expanding to larger than destination buffer. Increase the EXPANSE_RATIO constant to use this data.\n"); + res = -1; + goto end; + } else if (op->status != + RTE_COMP_OP_STATUS_SUCCESS) { RTE_LOG(ERR, USER1, "Some operations were not successful\n"); goto end; @@ -293,12 +302,20 @@ main_loop(struct cperf_verify_ctx *ctx, enum rte_comp_xform_type type) for (i = 0; i < num_deq; i++) { struct rte_comp_op *op = deq_ops[i]; - if (op->status != RTE_COMP_OP_STATUS_SUCCESS) { + if (op->status == + RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED || + op->status == + RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE) { + RTE_LOG(ERR, USER1, +"Out of space error occurred due to uncompressible input data expanding to larger than destination buffer. Increase the EXPANSE_RATIO constant to use this data.\n"); + res = -1; + goto end; + } else if (op->status != + RTE_COMP_OP_STATUS_SUCCESS) { RTE_LOG(ERR, USER1, "Some operations were not successful\n"); goto end; } - const void *read_data_addr = rte_pktmbuf_read(op->m_dst, op->dst.offset, -- 2.20.1