> -----Original Message----- > From: Radu Nicolau <[email protected]> > Sent: Friday 27 February 2026 09:48 > To: [email protected] > Cc: Marat Khalili <[email protected]>; Radu Nicolau > <[email protected]>; [email protected]; > [email protected]; Yipeng Wang <[email protected]>; Sameh > Gobriel > <[email protected]>; Bruce Richardson <[email protected]>; > Vladimir Medvedkin > <[email protected]>; Pablo de Lara > <[email protected]>; Yerden Zhumabekov > <[email protected]> > Subject: [PATCH v2] hash: fix pointer alignment > > rte_hash_crc assumes input pointer address is 8 byte aligned > which may not be always the case. > This fix aligns the input pointer before proceeding to process it > in 8 byte chunks. > > Fixes: 504a29af13a7 ("hash: fix strict-aliasing for CRC") > Cc: [email protected] > Cc: [email protected] > > Signed-off-by: Radu Nicolau <[email protected]> > --- > v2: reverse the order of alignment adjustment calls > > lib/hash/rte_hash_crc.h | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/lib/hash/rte_hash_crc.h b/lib/hash/rte_hash_crc.h > index fa07c97685..d61420868a 100644 > --- a/lib/hash/rte_hash_crc.h > +++ b/lib/hash/rte_hash_crc.h > @@ -127,6 +127,24 @@ rte_hash_crc(const void *data, uint32_t data_len, > uint32_t init_val) > unsigned i; > uintptr_t pd = (uintptr_t) data; > > + /* align input to 8 byte boundary if needed */ > + if ((pd & 0x7) && data_len >= 8) { > + uintptr_t unaligned_bytes = 8 - (pd & 0x7); > + data_len -= unaligned_bytes; > + if (unaligned_bytes & 0x1) { > + init_val = rte_hash_crc_1byte(*(const uint8_t *)pd, > init_val); > + pd += 1; > + } > + if (unaligned_bytes & 0x2) { > + init_val = rte_hash_crc_2byte(*(const uint16_t *)pd, > init_val); > + pd += 2; > + } > + if (unaligned_bytes & 0x4) { > + init_val = rte_hash_crc_4byte(*(const uint32_t *)pd, > init_val); > + pd += 4; > + } > + } > + > for (i = 0; i < data_len / 8; i++) { > init_val = rte_hash_crc_8byte(*(const uint64_t *)pd, init_val); > pd += 8; > -- > 2.52.0 >
Surprisingly, we do not seem to have any tests calling rte_hash_crc with misaligned data. I tried to tweak existing ones in test_hash.c and test_hash_functions.c, and found out that rte_hash_crc still fails (with ubsan) for sizes less than 8 in one of the last 3 if's, and also that jhash has the same problems. Still this commit is a step in the right direction IMO, so: Acked-by: Marat Khalili <[email protected]>

