diff mbox series

pipeline: fix emit instruction for invalid headers

Message ID 20220427215652.49229-1-cristian.dumitrescu@intel.com (mailing list archive)
State Accepted
Delegated to: Thomas Monjalon
Headers show
Series pipeline: fix emit instruction for invalid headers | expand

Checks

Context Check Description
ci/iol-abi-testing success Testing PASS
ci/iol-x86_64-compile-testing success Testing PASS
ci/iol-aarch64-compile-testing success Testing PASS
ci/iol-x86_64-unit-testing success Testing PASS
ci/iol-aarch64-unit-testing success Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/github-robot: build success github build: passed
ci/intel-Testing success Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS
ci/Intel-compilation success Compilation OK
ci/checkpatch success coding style OK

Commit Message

Dumitrescu, Cristian April 27, 2022, 9:56 p.m. UTC
Fix the emit instruction for the pathological case of all headers to
be emitted being invalid. In this case, the for loop was essentially
skipped and the last emitted header (or an invalid memory location)
getting corrupted by setting its size to 0 through the assignment to
ho->n_bytes right after the for loop.

Fixes: d60dbdc88a3e ("pipeline: create inline functions for emit instruction")
Cc: stable@dpdk.org

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Signed-off-by: Venkata Suresh Kumar P <venkata.suresh.kumar.p@intel.com>
Signed-off-by: Yogesh Jangra <yogesh.jangra@intel.com>
---
 lib/pipeline/rte_swx_pipeline_internal.h | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

Comments

Thomas Monjalon June 1, 2022, 11:55 a.m. UTC | #1
27/04/2022 23:56, Cristian Dumitrescu:
> Fix the emit instruction for the pathological case of all headers to
> be emitted being invalid. In this case, the for loop was essentially
> skipped and the last emitted header (or an invalid memory location)
> getting corrupted by setting its size to 0 through the assignment to
> ho->n_bytes right after the for loop.
> 
> Fixes: d60dbdc88a3e ("pipeline: create inline functions for emit instruction")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> Signed-off-by: Venkata Suresh Kumar P <venkata.suresh.kumar.p@intel.com>
> Signed-off-by: Yogesh Jangra <yogesh.jangra@intel.com>

Applied, thanks.
diff mbox series

Patch

diff --git a/lib/pipeline/rte_swx_pipeline_internal.h b/lib/pipeline/rte_swx_pipeline_internal.h
index f8a6661f75..dd1d499f57 100644
--- a/lib/pipeline/rte_swx_pipeline_internal.h
+++ b/lib/pipeline/rte_swx_pipeline_internal.h
@@ -2010,9 +2010,9 @@  __instr_hdr_emit_many_exec(struct rte_swx_pipeline *p __rte_unused,
 {
 	uint64_t valid_headers = t->valid_headers;
 	uint32_t n_headers_out = t->n_headers_out;
-	struct header_out_runtime *ho = &t->headers_out[n_headers_out - 1];
+	struct header_out_runtime *ho = NULL;
 	uint8_t *ho_ptr = NULL;
-	uint32_t ho_nbytes = 0, first = 1, i;
+	uint32_t ho_nbytes = 0, i;
 
 	for (i = 0; i < n_emit; i++) {
 		uint32_t header_id = ip->io.hdr.header_id[i];
@@ -2024,18 +2024,21 @@  __instr_hdr_emit_many_exec(struct rte_swx_pipeline *p __rte_unused,
 
 		uint8_t *hi_ptr = t->structs[struct_id];
 
-		if (!MASK64_BIT_GET(valid_headers, header_id))
+		if (!MASK64_BIT_GET(valid_headers, header_id)) {
+			TRACE("[Thread %2u]: emit header %u (invalid)\n",
+			      p->thread_id,
+			      header_id);
+
 			continue;
+		}
 
-		TRACE("[Thread %2u]: emit header %u\n",
+		TRACE("[Thread %2u]: emit header %u (valid)\n",
 		      p->thread_id,
 		      header_id);
 
 		/* Headers. */
-		if (first) {
-			first = 0;
-
-			if (!t->n_headers_out) {
+		if (!ho) {
+			if (!n_headers_out) {
 				ho = &t->headers_out[0];
 
 				ho->ptr0 = hi_ptr0;
@@ -2048,6 +2051,8 @@  __instr_hdr_emit_many_exec(struct rte_swx_pipeline *p __rte_unused,
 
 				continue;
 			} else {
+				ho = &t->headers_out[n_headers_out - 1];
+
 				ho_ptr = ho->ptr;
 				ho_nbytes = ho->n_bytes;
 			}
@@ -2069,7 +2074,8 @@  __instr_hdr_emit_many_exec(struct rte_swx_pipeline *p __rte_unused,
 		}
 	}
 
-	ho->n_bytes = ho_nbytes;
+	if (ho)
+		ho->n_bytes = ho_nbytes;
 	t->n_headers_out = n_headers_out;
 }