If doing ASAN build GCC warns:
ixgbe_e610.c:59:41: warning: 'strncat' output may be truncated
copying between 43 and 118 bytes from a string of length 127
The truncation is bogus, debug_portion is always 5 characters.
Rather than fighting with GCC rewrite the loop to
use a single snprintf() at a running offset.
I know this is base/ code but even upstream code needs to
be able to build clean with all compiler options.
Fixes: 12648d0a5afc ("net/ixgbe/base: add admin interface debug printouts")
Cc: [email protected]
Signed-off-by: Stephen Hemminger <[email protected]>
---
drivers/net/intel/ixgbe/base/ixgbe_e610.c | 57 ++++++++++-------------
1 file changed, 24 insertions(+), 33 deletions(-)
diff --git a/drivers/net/intel/ixgbe/base/ixgbe_e610.c
b/drivers/net/intel/ixgbe/base/ixgbe_e610.c
index 06a69d1d62..4e2dac989f 100644
--- a/drivers/net/intel/ixgbe/base/ixgbe_e610.c
+++ b/drivers/net/intel/ixgbe/base/ixgbe_e610.c
@@ -42,41 +42,32 @@ void ixgbe_shutdown_aci(struct ixgbe_hw *hw)
STATIC void ixgbe_aci_debug_array(struct ixgbe_hw *hw, u16 row_size, u8 *buf,
u16 buf_size)
{
- char debug_portion[IXGBE_ACI_MAX_DEBUG_STRING_LENGTH] = {'\0'};
- char debug_string[IXGBE_ACI_MAX_DEBUG_STRING_LENGTH] = {'\0'};
- u16 i = 0, j = 0;
- s16 remaining_space = IXGBE_ACI_MAX_DEBUG_STRING_LENGTH - 1;
- s16 nbytes = 0;
- if (!hw)
+ char debug_string[IXGBE_ACI_MAX_DEBUG_STRING_LENGTH];
+ u16 i, j, row;
+ int offset, nbytes;
+
+ if (!hw || !buf || !buf_size || !row_size)
return;
- if (buf && buf_size && row_size) {
- if (buf_size >= row_size) {
- for (i = 0; i < (buf_size - row_size); i += row_size) {
- nbytes = snprintf(debug_string,
sizeof(debug_string), "0x%04X : ", i);
- remaining_space =
IXGBE_ACI_MAX_DEBUG_STRING_LENGTH - nbytes - 1;
- for (j = 0; j < row_size; j++) {
- nbytes = snprintf(debug_portion,
sizeof(debug_portion), "0x%02X ", buf[i + j]);
- strncat(debug_string, debug_portion,
remaining_space);
- remaining_space -= nbytes;
- if (remaining_space <= 0) break;
- }
- strncat(debug_string, "\n", remaining_space);
- DEBUGOUT1("%s", debug_string);
- memset(debug_string, 0,
IXGBE_ACI_MAX_DEBUG_STRING_LENGTH);
- }
- }
- if (i < buf_size) {
- nbytes = snprintf(debug_string, sizeof(debug_string),
"0x%04X : ", i);
- remaining_space = IXGBE_ACI_MAX_DEBUG_STRING_LENGTH -
nbytes - 1;
- for (j = 0; j < (buf_size - i); j++) {
- nbytes = snprintf(debug_portion,
sizeof(debug_portion), "0x%02X ", buf[i + j]);
- strncat(debug_string, debug_portion,
remaining_space);
- remaining_space -= nbytes;
- if (remaining_space <= 0) break;
- }
- strncat(debug_string, "\n", remaining_space);
- DEBUGOUT1("%s", debug_string);
+
+ for (i = 0; i < buf_size; i += row_size) {
+ row = buf_size - i;
+ if (row > row_size)
+ row = row_size;
+
+ offset = snprintf(debug_string, sizeof(debug_string),
+ "0x%04X : ", i);
+
+ for (j = 0; j < row; j++) {
+ nbytes = snprintf(debug_string + offset,
+ sizeof(debug_string) - offset,
+ "0x%02X ", buf[i + j]);
+ if (nbytes < 0 ||
+ (size_t)nbytes >= sizeof(debug_string) - offset)
+ break;
+ offset += nbytes;
}
+
+ DEBUGOUT1("%s\n", debug_string);
}
}
--
2.53.0