linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] usb: cdnsp: fix cdnsp_decode_trb function to properly handle ret value
@ 2022-01-12  5:32 Pawel Laszczak
  2022-01-12  7:08 ` Greg KH
  0 siblings, 1 reply; 3+ messages in thread
From: Pawel Laszczak @ 2022-01-12  5:32 UTC (permalink / raw)
  To: peter.chen; +Cc: gregkh, linux-usb, linux-kernel, pawell

From: Pawel Laszczak <pawell@cadence.com>

Variable ret in function cdnsp_decode_trb is initialized but not
used. To fix this compiler warning patch adds checking whether the
data buffer has not been overflowed.

Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Pawel Laszczak <pawell@cadence.com>
---
 drivers/usb/cdns3/cdnsp-debug.h | 305 ++++++++++++++++----------------
 1 file changed, 154 insertions(+), 151 deletions(-)

diff --git a/drivers/usb/cdns3/cdnsp-debug.h b/drivers/usb/cdns3/cdnsp-debug.h
index a8776df2d4e0..f0ca865cce2a 100644
--- a/drivers/usb/cdns3/cdnsp-debug.h
+++ b/drivers/usb/cdns3/cdnsp-debug.h
@@ -182,208 +182,211 @@ static inline const char *cdnsp_decode_trb(char *str, size_t size, u32 field0,
 	int ep_id = TRB_TO_EP_INDEX(field3) - 1;
 	int type = TRB_FIELD_TO_TYPE(field3);
 	unsigned int ep_num;
-	int ret = 0;
+	int ret;
 	u32 temp;
 
 	ep_num = DIV_ROUND_UP(ep_id, 2);
 
 	switch (type) {
 	case TRB_LINK:
-		ret += snprintf(str, size,
-				"LINK %08x%08x intr %ld type '%s' flags %c:%c:%c:%c",
-				field1, field0, GET_INTR_TARGET(field2),
-				cdnsp_trb_type_string(type),
-				field3 & TRB_IOC ? 'I' : 'i',
-				field3 & TRB_CHAIN ? 'C' : 'c',
-				field3 & TRB_TC ? 'T' : 't',
-				field3 & TRB_CYCLE ? 'C' : 'c');
+		ret = snprintf(str, size,
+			       "LINK %08x%08x intr %ld type '%s' flags %c:%c:%c:%c",
+			       field1, field0, GET_INTR_TARGET(field2),
+			       cdnsp_trb_type_string(type),
+			       field3 & TRB_IOC ? 'I' : 'i',
+			       field3 & TRB_CHAIN ? 'C' : 'c',
+			       field3 & TRB_TC ? 'T' : 't',
+			       field3 & TRB_CYCLE ? 'C' : 'c');
 		break;
 	case TRB_TRANSFER:
 	case TRB_COMPLETION:
 	case TRB_PORT_STATUS:
 	case TRB_HC_EVENT:
-		ret += snprintf(str, size,
-				"ep%d%s(%d) type '%s' TRB %08x%08x status '%s'"
-				" len %ld slot %ld flags %c:%c",
-				ep_num, ep_id % 2 ? "out" : "in",
-				TRB_TO_EP_INDEX(field3),
-				cdnsp_trb_type_string(type), field1, field0,
-				cdnsp_trb_comp_code_string(GET_COMP_CODE(field2)),
-				EVENT_TRB_LEN(field2), TRB_TO_SLOT_ID(field3),
-				field3 & EVENT_DATA ? 'E' : 'e',
-				field3 & TRB_CYCLE ? 'C' : 'c');
+		ret = snprintf(str, size,
+			       "ep%d%s(%d) type '%s' TRB %08x%08x status '%s'"
+			       " len %ld slot %ld flags %c:%c",
+			       ep_num, ep_id % 2 ? "out" : "in",
+			       TRB_TO_EP_INDEX(field3),
+			       cdnsp_trb_type_string(type), field1, field0,
+			       cdnsp_trb_comp_code_string(GET_COMP_CODE(field2)),
+			       EVENT_TRB_LEN(field2), TRB_TO_SLOT_ID(field3),
+			       field3 & EVENT_DATA ? 'E' : 'e',
+			       field3 & TRB_CYCLE ? 'C' : 'c');
 		break;
 	case TRB_MFINDEX_WRAP:
-		ret += snprintf(str, size, "%s: flags %c",
-				cdnsp_trb_type_string(type),
-				field3 & TRB_CYCLE ? 'C' : 'c');
+		ret = snprintf(str, size, "%s: flags %c",
+			       cdnsp_trb_type_string(type),
+			       field3 & TRB_CYCLE ? 'C' : 'c');
 		break;
 	case TRB_SETUP:
-		ret += snprintf(str, size,
-				"type '%s' bRequestType %02x bRequest %02x "
-				"wValue %02x%02x wIndex %02x%02x wLength %d "
-				"length %ld TD size %ld intr %ld Setup ID %ld "
-				"flags %c:%c:%c",
-				cdnsp_trb_type_string(type),
-				field0 & 0xff,
-				(field0 & 0xff00) >> 8,
-				(field0 & 0xff000000) >> 24,
-				(field0 & 0xff0000) >> 16,
-				(field1 & 0xff00) >> 8,
-				field1 & 0xff,
-				(field1 & 0xff000000) >> 16 |
-				(field1 & 0xff0000) >> 16,
-				TRB_LEN(field2), GET_TD_SIZE(field2),
-				GET_INTR_TARGET(field2),
-				TRB_SETUPID_TO_TYPE(field3),
-				field3 & TRB_IDT ? 'D' : 'd',
-				field3 & TRB_IOC ? 'I' : 'i',
-				field3 & TRB_CYCLE ? 'C' : 'c');
+		ret = snprintf(str, size,
+			       "type '%s' bRequestType %02x bRequest %02x "
+			       "wValue %02x%02x wIndex %02x%02x wLength %d "
+			       "length %ld TD size %ld intr %ld Setup ID %ld "
+			       "flags %c:%c:%c",
+			       cdnsp_trb_type_string(type),
+			       field0 & 0xff,
+			       (field0 & 0xff00) >> 8,
+			       (field0 & 0xff000000) >> 24,
+			       (field0 & 0xff0000) >> 16,
+			       (field1 & 0xff00) >> 8,
+			       field1 & 0xff,
+			       (field1 & 0xff000000) >> 16 |
+			       (field1 & 0xff0000) >> 16,
+			       TRB_LEN(field2), GET_TD_SIZE(field2),
+			       GET_INTR_TARGET(field2),
+			       TRB_SETUPID_TO_TYPE(field3),
+			       field3 & TRB_IDT ? 'D' : 'd',
+			       field3 & TRB_IOC ? 'I' : 'i',
+			       field3 & TRB_CYCLE ? 'C' : 'c');
 		break;
 	case TRB_DATA:
-		ret += snprintf(str, size,
-				"type '%s' Buffer %08x%08x length %ld TD size %ld "
-				"intr %ld flags %c:%c:%c:%c:%c:%c:%c",
-				cdnsp_trb_type_string(type),
-				field1, field0, TRB_LEN(field2),
-				GET_TD_SIZE(field2),
-				GET_INTR_TARGET(field2),
-				field3 & TRB_IDT ? 'D' : 'i',
-				field3 & TRB_IOC ? 'I' : 'i',
-				field3 & TRB_CHAIN ? 'C' : 'c',
-				field3 & TRB_NO_SNOOP ? 'S' : 's',
-				field3 & TRB_ISP ? 'I' : 'i',
-				field3 & TRB_ENT ? 'E' : 'e',
-				field3 & TRB_CYCLE ? 'C' : 'c');
+		ret = snprintf(str, size,
+			       "type '%s' Buffer %08x%08x length %ld TD size %ld "
+			       "intr %ld flags %c:%c:%c:%c:%c:%c:%c",
+			       cdnsp_trb_type_string(type),
+			       field1, field0, TRB_LEN(field2),
+			       GET_TD_SIZE(field2),
+			       GET_INTR_TARGET(field2),
+			       field3 & TRB_IDT ? 'D' : 'i',
+			       field3 & TRB_IOC ? 'I' : 'i',
+			       field3 & TRB_CHAIN ? 'C' : 'c',
+			       field3 & TRB_NO_SNOOP ? 'S' : 's',
+			       field3 & TRB_ISP ? 'I' : 'i',
+			       field3 & TRB_ENT ? 'E' : 'e',
+			       field3 & TRB_CYCLE ? 'C' : 'c');
 		break;
 	case TRB_STATUS:
-		ret += snprintf(str, size,
-				"Buffer %08x%08x length %ld TD size %ld intr"
-				"%ld type '%s' flags %c:%c:%c:%c",
-				field1, field0, TRB_LEN(field2),
-				GET_TD_SIZE(field2),
-				GET_INTR_TARGET(field2),
-				cdnsp_trb_type_string(type),
-				field3 & TRB_IOC ? 'I' : 'i',
-				field3 & TRB_CHAIN ? 'C' : 'c',
-				field3 & TRB_ENT ? 'E' : 'e',
-				field3 & TRB_CYCLE ? 'C' : 'c');
+		ret = snprintf(str, size,
+			       "Buffer %08x%08x length %ld TD size %ld intr"
+			       "%ld type '%s' flags %c:%c:%c:%c",
+			       field1, field0, TRB_LEN(field2),
+			       GET_TD_SIZE(field2),
+			       GET_INTR_TARGET(field2),
+			       cdnsp_trb_type_string(type),
+			       field3 & TRB_IOC ? 'I' : 'i',
+			       field3 & TRB_CHAIN ? 'C' : 'c',
+			       field3 & TRB_ENT ? 'E' : 'e',
+			       field3 & TRB_CYCLE ? 'C' : 'c');
 		break;
 	case TRB_NORMAL:
 	case TRB_ISOC:
 	case TRB_EVENT_DATA:
 	case TRB_TR_NOOP:
-		ret += snprintf(str, size,
-				"type '%s' Buffer %08x%08x length %ld "
-				"TD size %ld intr %ld "
-				"flags %c:%c:%c:%c:%c:%c:%c:%c:%c",
-				cdnsp_trb_type_string(type),
-				field1, field0, TRB_LEN(field2),
-				GET_TD_SIZE(field2),
-				GET_INTR_TARGET(field2),
-				field3 & TRB_BEI ? 'B' : 'b',
-				field3 & TRB_IDT ? 'T' : 't',
-				field3 & TRB_IOC ? 'I' : 'i',
-				field3 & TRB_CHAIN ? 'C' : 'c',
-				field3 & TRB_NO_SNOOP ? 'S' : 's',
-				field3 & TRB_ISP ? 'I' : 'i',
-				field3 & TRB_ENT ? 'E' : 'e',
-				field3 & TRB_CYCLE ? 'C' : 'c',
-				!(field3 & TRB_EVENT_INVALIDATE) ? 'V' : 'v');
+		ret = snprintf(str, size,
+			       "type '%s' Buffer %08x%08x length %ld "
+			       "TD size %ld intr %ld "
+			       "flags %c:%c:%c:%c:%c:%c:%c:%c:%c",
+			       cdnsp_trb_type_string(type),
+			       field1, field0, TRB_LEN(field2),
+			       GET_TD_SIZE(field2),
+			       GET_INTR_TARGET(field2),
+			       field3 & TRB_BEI ? 'B' : 'b',
+			       field3 & TRB_IDT ? 'T' : 't',
+			       field3 & TRB_IOC ? 'I' : 'i',
+			       field3 & TRB_CHAIN ? 'C' : 'c',
+			       field3 & TRB_NO_SNOOP ? 'S' : 's',
+			       field3 & TRB_ISP ? 'I' : 'i',
+			       field3 & TRB_ENT ? 'E' : 'e',
+			       field3 & TRB_CYCLE ? 'C' : 'c',
+			       !(field3 & TRB_EVENT_INVALIDATE) ? 'V' : 'v');
 		break;
 	case TRB_CMD_NOOP:
 	case TRB_ENABLE_SLOT:
-		ret += snprintf(str, size, "%s: flags %c",
-				cdnsp_trb_type_string(type),
-				field3 & TRB_CYCLE ? 'C' : 'c');
+		ret = snprintf(str, size, "%s: flags %c",
+			       cdnsp_trb_type_string(type),
+			       field3 & TRB_CYCLE ? 'C' : 'c');
 		break;
 	case TRB_DISABLE_SLOT:
-		ret += snprintf(str, size, "%s: slot %ld flags %c",
-				cdnsp_trb_type_string(type),
-				TRB_TO_SLOT_ID(field3),
-				field3 & TRB_CYCLE ? 'C' : 'c');
+		ret = snprintf(str, size, "%s: slot %ld flags %c",
+			       cdnsp_trb_type_string(type),
+			       TRB_TO_SLOT_ID(field3),
+			       field3 & TRB_CYCLE ? 'C' : 'c');
 		break;
 	case TRB_ADDR_DEV:
-		ret += snprintf(str, size,
-				"%s: ctx %08x%08x slot %ld flags %c:%c",
-				cdnsp_trb_type_string(type), field1, field0,
-				TRB_TO_SLOT_ID(field3),
-				field3 & TRB_BSR ? 'B' : 'b',
-				field3 & TRB_CYCLE ? 'C' : 'c');
+		ret = snprintf(str, size,
+			       "%s: ctx %08x%08x slot %ld flags %c:%c",
+			       cdnsp_trb_type_string(type), field1, field0,
+			       TRB_TO_SLOT_ID(field3),
+			       field3 & TRB_BSR ? 'B' : 'b',
+			       field3 & TRB_CYCLE ? 'C' : 'c');
 		break;
 	case TRB_CONFIG_EP:
-		ret += snprintf(str, size,
-				"%s: ctx %08x%08x slot %ld flags %c:%c",
-				cdnsp_trb_type_string(type), field1, field0,
-				TRB_TO_SLOT_ID(field3),
-				field3 & TRB_DC ? 'D' : 'd',
-				field3 & TRB_CYCLE ? 'C' : 'c');
+		ret = snprintf(str, size,
+			       "%s: ctx %08x%08x slot %ld flags %c:%c",
+			       cdnsp_trb_type_string(type), field1, field0,
+			       TRB_TO_SLOT_ID(field3),
+			       field3 & TRB_DC ? 'D' : 'd',
+			       field3 & TRB_CYCLE ? 'C' : 'c');
 		break;
 	case TRB_EVAL_CONTEXT:
-		ret += snprintf(str, size,
-				"%s: ctx %08x%08x slot %ld flags %c",
-				cdnsp_trb_type_string(type), field1, field0,
-				TRB_TO_SLOT_ID(field3),
-				field3 & TRB_CYCLE ? 'C' : 'c');
+		ret = snprintf(str, size,
+			       "%s: ctx %08x%08x slot %ld flags %c",
+			       cdnsp_trb_type_string(type), field1, field0,
+			       TRB_TO_SLOT_ID(field3),
+			       field3 & TRB_CYCLE ? 'C' : 'c');
 		break;
 	case TRB_RESET_EP:
 	case TRB_HALT_ENDPOINT:
 	case TRB_FLUSH_ENDPOINT:
-		ret += snprintf(str, size,
-				"%s: ep%d%s(%d) ctx %08x%08x slot %ld flags %c",
-				cdnsp_trb_type_string(type),
-				ep_num, ep_id % 2 ? "out" : "in",
-				TRB_TO_EP_INDEX(field3), field1, field0,
-				TRB_TO_SLOT_ID(field3),
-				field3 & TRB_CYCLE ? 'C' : 'c');
+		ret = snprintf(str, size,
+			       "%s: ep%d%s(%d) ctx %08x%08x slot %ld flags %c",
+			       cdnsp_trb_type_string(type),
+			       ep_num, ep_id % 2 ? "out" : "in",
+			       TRB_TO_EP_INDEX(field3), field1, field0,
+			       TRB_TO_SLOT_ID(field3),
+			       field3 & TRB_CYCLE ? 'C' : 'c');
 		break;
 	case TRB_STOP_RING:
-		ret += snprintf(str, size,
-				"%s: ep%d%s(%d) slot %ld sp %d flags %c",
-				cdnsp_trb_type_string(type),
-				ep_num, ep_id % 2 ? "out" : "in",
-				TRB_TO_EP_INDEX(field3),
-				TRB_TO_SLOT_ID(field3),
-				TRB_TO_SUSPEND_PORT(field3),
-				field3 & TRB_CYCLE ? 'C' : 'c');
+		ret = snprintf(str, size,
+			       "%s: ep%d%s(%d) slot %ld sp %d flags %c",
+			       cdnsp_trb_type_string(type),
+			       ep_num, ep_id % 2 ? "out" : "in",
+			       TRB_TO_EP_INDEX(field3),
+			       TRB_TO_SLOT_ID(field3),
+			       TRB_TO_SUSPEND_PORT(field3),
+			       field3 & TRB_CYCLE ? 'C' : 'c');
 		break;
 	case TRB_SET_DEQ:
-		ret += snprintf(str, size,
-				"%s: ep%d%s(%d) deq %08x%08x stream %ld slot %ld  flags %c",
-				cdnsp_trb_type_string(type),
-				ep_num, ep_id % 2 ? "out" : "in",
-				TRB_TO_EP_INDEX(field3), field1, field0,
-				TRB_TO_STREAM_ID(field2),
-				TRB_TO_SLOT_ID(field3),
-				field3 & TRB_CYCLE ? 'C' : 'c');
+		ret = snprintf(str, size,
+			       "%s: ep%d%s(%d) deq %08x%08x stream %ld slot %ld  flags %c",
+			       cdnsp_trb_type_string(type),
+			       ep_num, ep_id % 2 ? "out" : "in",
+			       TRB_TO_EP_INDEX(field3), field1, field0,
+			       TRB_TO_STREAM_ID(field2),
+			       TRB_TO_SLOT_ID(field3),
+			       field3 & TRB_CYCLE ? 'C' : 'c');
 		break;
 	case TRB_RESET_DEV:
-		ret += snprintf(str, size, "%s: slot %ld flags %c",
-				cdnsp_trb_type_string(type),
-				TRB_TO_SLOT_ID(field3),
-				field3 & TRB_CYCLE ? 'C' : 'c');
+		ret = snprintf(str, size, "%s: slot %ld flags %c",
+			       cdnsp_trb_type_string(type),
+			       TRB_TO_SLOT_ID(field3),
+			       field3 & TRB_CYCLE ? 'C' : 'c');
 		break;
 	case TRB_ENDPOINT_NRDY:
-		temp  = TRB_TO_HOST_STREAM(field2);
-
-		ret += snprintf(str, size,
-				"%s: ep%d%s(%d) H_SID %x%s%s D_SID %lx flags %c:%c",
-				cdnsp_trb_type_string(type),
-				ep_num, ep_id % 2 ? "out" : "in",
-				TRB_TO_EP_INDEX(field3), temp,
-				temp == STREAM_PRIME_ACK ? "(PRIME)" : "",
-				temp == STREAM_REJECTED ? "(REJECTED)" : "",
-				TRB_TO_DEV_STREAM(field0),
-				field3 & TRB_STAT ? 'S' : 's',
-				field3 & TRB_CYCLE ? 'C' : 'c');
+		temp = TRB_TO_HOST_STREAM(field2);
+
+		ret = snprintf(str, size,
+			       "%s: ep%d%s(%d) H_SID %x%s%s D_SID %lx flags %c:%c",
+			       cdnsp_trb_type_string(type),
+			       ep_num, ep_id % 2 ? "out" : "in",
+			       TRB_TO_EP_INDEX(field3), temp,
+			       temp == STREAM_PRIME_ACK ? "(PRIME)" : "",
+			       temp == STREAM_REJECTED ? "(REJECTED)" : "",
+			       TRB_TO_DEV_STREAM(field0),
+			       field3 & TRB_STAT ? 'S' : 's',
+			       field3 & TRB_CYCLE ? 'C' : 'c');
 		break;
 	default:
-		ret += snprintf(str, size,
-				"type '%s' -> raw %08x %08x %08x %08x",
-				cdnsp_trb_type_string(type),
-				field0, field1, field2, field3);
+		ret = snprintf(str, size,
+			       "type '%s' -> raw %08x %08x %08x %08x",
+			       cdnsp_trb_type_string(type),
+			       field0, field1, field2, field3);
 	}
 
+	if (ret >= size)
+		pr_info("CDNSP: buffer overflowed.\n");
+
 	return str;
 }
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] usb: cdnsp: fix cdnsp_decode_trb function to properly handle ret value
  2022-01-12  5:32 [PATCH] usb: cdnsp: fix cdnsp_decode_trb function to properly handle ret value Pawel Laszczak
@ 2022-01-12  7:08 ` Greg KH
  2022-01-12  7:27   ` Pawel Laszczak
  0 siblings, 1 reply; 3+ messages in thread
From: Greg KH @ 2022-01-12  7:08 UTC (permalink / raw)
  To: Pawel Laszczak; +Cc: peter.chen, linux-usb, linux-kernel

On Wed, Jan 12, 2022 at 06:32:37AM +0100, Pawel Laszczak wrote:
> From: Pawel Laszczak <pawell@cadence.com>
> 
> Variable ret in function cdnsp_decode_trb is initialized but not
> used. To fix this compiler warning patch adds checking whether the
> data buffer has not been overflowed.
> 
> Reported-by: kernel test robot <lkp@intel.com>
> Signed-off-by: Pawel Laszczak <pawell@cadence.com>
> ---
>  drivers/usb/cdns3/cdnsp-debug.h | 305 ++++++++++++++++----------------
>  1 file changed, 154 insertions(+), 151 deletions(-)
> 
> diff --git a/drivers/usb/cdns3/cdnsp-debug.h b/drivers/usb/cdns3/cdnsp-debug.h
> index a8776df2d4e0..f0ca865cce2a 100644
> --- a/drivers/usb/cdns3/cdnsp-debug.h
> +++ b/drivers/usb/cdns3/cdnsp-debug.h
> @@ -182,208 +182,211 @@ static inline const char *cdnsp_decode_trb(char *str, size_t size, u32 field0,
>  	int ep_id = TRB_TO_EP_INDEX(field3) - 1;
>  	int type = TRB_FIELD_TO_TYPE(field3);
>  	unsigned int ep_num;
> -	int ret = 0;
> +	int ret;
>  	u32 temp;
>  
>  	ep_num = DIV_ROUND_UP(ep_id, 2);
>  
>  	switch (type) {
>  	case TRB_LINK:
> -		ret += snprintf(str, size,
> -				"LINK %08x%08x intr %ld type '%s' flags %c:%c:%c:%c",
> -				field1, field0, GET_INTR_TARGET(field2),
> -				cdnsp_trb_type_string(type),
> -				field3 & TRB_IOC ? 'I' : 'i',
> -				field3 & TRB_CHAIN ? 'C' : 'c',
> -				field3 & TRB_TC ? 'T' : 't',
> -				field3 & TRB_CYCLE ? 'C' : 'c');
> +		ret = snprintf(str, size,
> +			       "LINK %08x%08x intr %ld type '%s' flags %c:%c:%c:%c",
> +			       field1, field0, GET_INTR_TARGET(field2),
> +			       cdnsp_trb_type_string(type),
> +			       field3 & TRB_IOC ? 'I' : 'i',
> +			       field3 & TRB_CHAIN ? 'C' : 'c',
> +			       field3 & TRB_TC ? 'T' : 't',
> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>  		break;
>  	case TRB_TRANSFER:
>  	case TRB_COMPLETION:
>  	case TRB_PORT_STATUS:
>  	case TRB_HC_EVENT:
> -		ret += snprintf(str, size,
> -				"ep%d%s(%d) type '%s' TRB %08x%08x status '%s'"
> -				" len %ld slot %ld flags %c:%c",
> -				ep_num, ep_id % 2 ? "out" : "in",
> -				TRB_TO_EP_INDEX(field3),
> -				cdnsp_trb_type_string(type), field1, field0,
> -				cdnsp_trb_comp_code_string(GET_COMP_CODE(field2)),
> -				EVENT_TRB_LEN(field2), TRB_TO_SLOT_ID(field3),
> -				field3 & EVENT_DATA ? 'E' : 'e',
> -				field3 & TRB_CYCLE ? 'C' : 'c');
> +		ret = snprintf(str, size,
> +			       "ep%d%s(%d) type '%s' TRB %08x%08x status '%s'"
> +			       " len %ld slot %ld flags %c:%c",
> +			       ep_num, ep_id % 2 ? "out" : "in",
> +			       TRB_TO_EP_INDEX(field3),
> +			       cdnsp_trb_type_string(type), field1, field0,
> +			       cdnsp_trb_comp_code_string(GET_COMP_CODE(field2)),
> +			       EVENT_TRB_LEN(field2), TRB_TO_SLOT_ID(field3),
> +			       field3 & EVENT_DATA ? 'E' : 'e',
> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>  		break;
>  	case TRB_MFINDEX_WRAP:
> -		ret += snprintf(str, size, "%s: flags %c",
> -				cdnsp_trb_type_string(type),
> -				field3 & TRB_CYCLE ? 'C' : 'c');
> +		ret = snprintf(str, size, "%s: flags %c",
> +			       cdnsp_trb_type_string(type),
> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>  		break;
>  	case TRB_SETUP:
> -		ret += snprintf(str, size,
> -				"type '%s' bRequestType %02x bRequest %02x "
> -				"wValue %02x%02x wIndex %02x%02x wLength %d "
> -				"length %ld TD size %ld intr %ld Setup ID %ld "
> -				"flags %c:%c:%c",
> -				cdnsp_trb_type_string(type),
> -				field0 & 0xff,
> -				(field0 & 0xff00) >> 8,
> -				(field0 & 0xff000000) >> 24,
> -				(field0 & 0xff0000) >> 16,
> -				(field1 & 0xff00) >> 8,
> -				field1 & 0xff,
> -				(field1 & 0xff000000) >> 16 |
> -				(field1 & 0xff0000) >> 16,
> -				TRB_LEN(field2), GET_TD_SIZE(field2),
> -				GET_INTR_TARGET(field2),
> -				TRB_SETUPID_TO_TYPE(field3),
> -				field3 & TRB_IDT ? 'D' : 'd',
> -				field3 & TRB_IOC ? 'I' : 'i',
> -				field3 & TRB_CYCLE ? 'C' : 'c');
> +		ret = snprintf(str, size,
> +			       "type '%s' bRequestType %02x bRequest %02x "
> +			       "wValue %02x%02x wIndex %02x%02x wLength %d "
> +			       "length %ld TD size %ld intr %ld Setup ID %ld "
> +			       "flags %c:%c:%c",
> +			       cdnsp_trb_type_string(type),
> +			       field0 & 0xff,
> +			       (field0 & 0xff00) >> 8,
> +			       (field0 & 0xff000000) >> 24,
> +			       (field0 & 0xff0000) >> 16,
> +			       (field1 & 0xff00) >> 8,
> +			       field1 & 0xff,
> +			       (field1 & 0xff000000) >> 16 |
> +			       (field1 & 0xff0000) >> 16,
> +			       TRB_LEN(field2), GET_TD_SIZE(field2),
> +			       GET_INTR_TARGET(field2),
> +			       TRB_SETUPID_TO_TYPE(field3),
> +			       field3 & TRB_IDT ? 'D' : 'd',
> +			       field3 & TRB_IOC ? 'I' : 'i',
> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>  		break;
>  	case TRB_DATA:
> -		ret += snprintf(str, size,
> -				"type '%s' Buffer %08x%08x length %ld TD size %ld "
> -				"intr %ld flags %c:%c:%c:%c:%c:%c:%c",
> -				cdnsp_trb_type_string(type),
> -				field1, field0, TRB_LEN(field2),
> -				GET_TD_SIZE(field2),
> -				GET_INTR_TARGET(field2),
> -				field3 & TRB_IDT ? 'D' : 'i',
> -				field3 & TRB_IOC ? 'I' : 'i',
> -				field3 & TRB_CHAIN ? 'C' : 'c',
> -				field3 & TRB_NO_SNOOP ? 'S' : 's',
> -				field3 & TRB_ISP ? 'I' : 'i',
> -				field3 & TRB_ENT ? 'E' : 'e',
> -				field3 & TRB_CYCLE ? 'C' : 'c');
> +		ret = snprintf(str, size,
> +			       "type '%s' Buffer %08x%08x length %ld TD size %ld "
> +			       "intr %ld flags %c:%c:%c:%c:%c:%c:%c",
> +			       cdnsp_trb_type_string(type),
> +			       field1, field0, TRB_LEN(field2),
> +			       GET_TD_SIZE(field2),
> +			       GET_INTR_TARGET(field2),
> +			       field3 & TRB_IDT ? 'D' : 'i',
> +			       field3 & TRB_IOC ? 'I' : 'i',
> +			       field3 & TRB_CHAIN ? 'C' : 'c',
> +			       field3 & TRB_NO_SNOOP ? 'S' : 's',
> +			       field3 & TRB_ISP ? 'I' : 'i',
> +			       field3 & TRB_ENT ? 'E' : 'e',
> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>  		break;
>  	case TRB_STATUS:
> -		ret += snprintf(str, size,
> -				"Buffer %08x%08x length %ld TD size %ld intr"
> -				"%ld type '%s' flags %c:%c:%c:%c",
> -				field1, field0, TRB_LEN(field2),
> -				GET_TD_SIZE(field2),
> -				GET_INTR_TARGET(field2),
> -				cdnsp_trb_type_string(type),
> -				field3 & TRB_IOC ? 'I' : 'i',
> -				field3 & TRB_CHAIN ? 'C' : 'c',
> -				field3 & TRB_ENT ? 'E' : 'e',
> -				field3 & TRB_CYCLE ? 'C' : 'c');
> +		ret = snprintf(str, size,
> +			       "Buffer %08x%08x length %ld TD size %ld intr"
> +			       "%ld type '%s' flags %c:%c:%c:%c",
> +			       field1, field0, TRB_LEN(field2),
> +			       GET_TD_SIZE(field2),
> +			       GET_INTR_TARGET(field2),
> +			       cdnsp_trb_type_string(type),
> +			       field3 & TRB_IOC ? 'I' : 'i',
> +			       field3 & TRB_CHAIN ? 'C' : 'c',
> +			       field3 & TRB_ENT ? 'E' : 'e',
> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>  		break;
>  	case TRB_NORMAL:
>  	case TRB_ISOC:
>  	case TRB_EVENT_DATA:
>  	case TRB_TR_NOOP:
> -		ret += snprintf(str, size,
> -				"type '%s' Buffer %08x%08x length %ld "
> -				"TD size %ld intr %ld "
> -				"flags %c:%c:%c:%c:%c:%c:%c:%c:%c",
> -				cdnsp_trb_type_string(type),
> -				field1, field0, TRB_LEN(field2),
> -				GET_TD_SIZE(field2),
> -				GET_INTR_TARGET(field2),
> -				field3 & TRB_BEI ? 'B' : 'b',
> -				field3 & TRB_IDT ? 'T' : 't',
> -				field3 & TRB_IOC ? 'I' : 'i',
> -				field3 & TRB_CHAIN ? 'C' : 'c',
> -				field3 & TRB_NO_SNOOP ? 'S' : 's',
> -				field3 & TRB_ISP ? 'I' : 'i',
> -				field3 & TRB_ENT ? 'E' : 'e',
> -				field3 & TRB_CYCLE ? 'C' : 'c',
> -				!(field3 & TRB_EVENT_INVALIDATE) ? 'V' : 'v');
> +		ret = snprintf(str, size,
> +			       "type '%s' Buffer %08x%08x length %ld "
> +			       "TD size %ld intr %ld "
> +			       "flags %c:%c:%c:%c:%c:%c:%c:%c:%c",
> +			       cdnsp_trb_type_string(type),
> +			       field1, field0, TRB_LEN(field2),
> +			       GET_TD_SIZE(field2),
> +			       GET_INTR_TARGET(field2),
> +			       field3 & TRB_BEI ? 'B' : 'b',
> +			       field3 & TRB_IDT ? 'T' : 't',
> +			       field3 & TRB_IOC ? 'I' : 'i',
> +			       field3 & TRB_CHAIN ? 'C' : 'c',
> +			       field3 & TRB_NO_SNOOP ? 'S' : 's',
> +			       field3 & TRB_ISP ? 'I' : 'i',
> +			       field3 & TRB_ENT ? 'E' : 'e',
> +			       field3 & TRB_CYCLE ? 'C' : 'c',
> +			       !(field3 & TRB_EVENT_INVALIDATE) ? 'V' : 'v');
>  		break;
>  	case TRB_CMD_NOOP:
>  	case TRB_ENABLE_SLOT:
> -		ret += snprintf(str, size, "%s: flags %c",
> -				cdnsp_trb_type_string(type),
> -				field3 & TRB_CYCLE ? 'C' : 'c');
> +		ret = snprintf(str, size, "%s: flags %c",
> +			       cdnsp_trb_type_string(type),
> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>  		break;
>  	case TRB_DISABLE_SLOT:
> -		ret += snprintf(str, size, "%s: slot %ld flags %c",
> -				cdnsp_trb_type_string(type),
> -				TRB_TO_SLOT_ID(field3),
> -				field3 & TRB_CYCLE ? 'C' : 'c');
> +		ret = snprintf(str, size, "%s: slot %ld flags %c",
> +			       cdnsp_trb_type_string(type),
> +			       TRB_TO_SLOT_ID(field3),
> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>  		break;
>  	case TRB_ADDR_DEV:
> -		ret += snprintf(str, size,
> -				"%s: ctx %08x%08x slot %ld flags %c:%c",
> -				cdnsp_trb_type_string(type), field1, field0,
> -				TRB_TO_SLOT_ID(field3),
> -				field3 & TRB_BSR ? 'B' : 'b',
> -				field3 & TRB_CYCLE ? 'C' : 'c');
> +		ret = snprintf(str, size,
> +			       "%s: ctx %08x%08x slot %ld flags %c:%c",
> +			       cdnsp_trb_type_string(type), field1, field0,
> +			       TRB_TO_SLOT_ID(field3),
> +			       field3 & TRB_BSR ? 'B' : 'b',
> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>  		break;
>  	case TRB_CONFIG_EP:
> -		ret += snprintf(str, size,
> -				"%s: ctx %08x%08x slot %ld flags %c:%c",
> -				cdnsp_trb_type_string(type), field1, field0,
> -				TRB_TO_SLOT_ID(field3),
> -				field3 & TRB_DC ? 'D' : 'd',
> -				field3 & TRB_CYCLE ? 'C' : 'c');
> +		ret = snprintf(str, size,
> +			       "%s: ctx %08x%08x slot %ld flags %c:%c",
> +			       cdnsp_trb_type_string(type), field1, field0,
> +			       TRB_TO_SLOT_ID(field3),
> +			       field3 & TRB_DC ? 'D' : 'd',
> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>  		break;
>  	case TRB_EVAL_CONTEXT:
> -		ret += snprintf(str, size,
> -				"%s: ctx %08x%08x slot %ld flags %c",
> -				cdnsp_trb_type_string(type), field1, field0,
> -				TRB_TO_SLOT_ID(field3),
> -				field3 & TRB_CYCLE ? 'C' : 'c');
> +		ret = snprintf(str, size,
> +			       "%s: ctx %08x%08x slot %ld flags %c",
> +			       cdnsp_trb_type_string(type), field1, field0,
> +			       TRB_TO_SLOT_ID(field3),
> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>  		break;
>  	case TRB_RESET_EP:
>  	case TRB_HALT_ENDPOINT:
>  	case TRB_FLUSH_ENDPOINT:
> -		ret += snprintf(str, size,
> -				"%s: ep%d%s(%d) ctx %08x%08x slot %ld flags %c",
> -				cdnsp_trb_type_string(type),
> -				ep_num, ep_id % 2 ? "out" : "in",
> -				TRB_TO_EP_INDEX(field3), field1, field0,
> -				TRB_TO_SLOT_ID(field3),
> -				field3 & TRB_CYCLE ? 'C' : 'c');
> +		ret = snprintf(str, size,
> +			       "%s: ep%d%s(%d) ctx %08x%08x slot %ld flags %c",
> +			       cdnsp_trb_type_string(type),
> +			       ep_num, ep_id % 2 ? "out" : "in",
> +			       TRB_TO_EP_INDEX(field3), field1, field0,
> +			       TRB_TO_SLOT_ID(field3),
> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>  		break;
>  	case TRB_STOP_RING:
> -		ret += snprintf(str, size,
> -				"%s: ep%d%s(%d) slot %ld sp %d flags %c",
> -				cdnsp_trb_type_string(type),
> -				ep_num, ep_id % 2 ? "out" : "in",
> -				TRB_TO_EP_INDEX(field3),
> -				TRB_TO_SLOT_ID(field3),
> -				TRB_TO_SUSPEND_PORT(field3),
> -				field3 & TRB_CYCLE ? 'C' : 'c');
> +		ret = snprintf(str, size,
> +			       "%s: ep%d%s(%d) slot %ld sp %d flags %c",
> +			       cdnsp_trb_type_string(type),
> +			       ep_num, ep_id % 2 ? "out" : "in",
> +			       TRB_TO_EP_INDEX(field3),
> +			       TRB_TO_SLOT_ID(field3),
> +			       TRB_TO_SUSPEND_PORT(field3),
> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>  		break;
>  	case TRB_SET_DEQ:
> -		ret += snprintf(str, size,
> -				"%s: ep%d%s(%d) deq %08x%08x stream %ld slot %ld  flags %c",
> -				cdnsp_trb_type_string(type),
> -				ep_num, ep_id % 2 ? "out" : "in",
> -				TRB_TO_EP_INDEX(field3), field1, field0,
> -				TRB_TO_STREAM_ID(field2),
> -				TRB_TO_SLOT_ID(field3),
> -				field3 & TRB_CYCLE ? 'C' : 'c');
> +		ret = snprintf(str, size,
> +			       "%s: ep%d%s(%d) deq %08x%08x stream %ld slot %ld  flags %c",
> +			       cdnsp_trb_type_string(type),
> +			       ep_num, ep_id % 2 ? "out" : "in",
> +			       TRB_TO_EP_INDEX(field3), field1, field0,
> +			       TRB_TO_STREAM_ID(field2),
> +			       TRB_TO_SLOT_ID(field3),
> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>  		break;
>  	case TRB_RESET_DEV:
> -		ret += snprintf(str, size, "%s: slot %ld flags %c",
> -				cdnsp_trb_type_string(type),
> -				TRB_TO_SLOT_ID(field3),
> -				field3 & TRB_CYCLE ? 'C' : 'c');
> +		ret = snprintf(str, size, "%s: slot %ld flags %c",
> +			       cdnsp_trb_type_string(type),
> +			       TRB_TO_SLOT_ID(field3),
> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>  		break;
>  	case TRB_ENDPOINT_NRDY:
> -		temp  = TRB_TO_HOST_STREAM(field2);
> -
> -		ret += snprintf(str, size,
> -				"%s: ep%d%s(%d) H_SID %x%s%s D_SID %lx flags %c:%c",
> -				cdnsp_trb_type_string(type),
> -				ep_num, ep_id % 2 ? "out" : "in",
> -				TRB_TO_EP_INDEX(field3), temp,
> -				temp == STREAM_PRIME_ACK ? "(PRIME)" : "",
> -				temp == STREAM_REJECTED ? "(REJECTED)" : "",
> -				TRB_TO_DEV_STREAM(field0),
> -				field3 & TRB_STAT ? 'S' : 's',
> -				field3 & TRB_CYCLE ? 'C' : 'c');
> +		temp = TRB_TO_HOST_STREAM(field2);
> +
> +		ret = snprintf(str, size,
> +			       "%s: ep%d%s(%d) H_SID %x%s%s D_SID %lx flags %c:%c",
> +			       cdnsp_trb_type_string(type),
> +			       ep_num, ep_id % 2 ? "out" : "in",
> +			       TRB_TO_EP_INDEX(field3), temp,
> +			       temp == STREAM_PRIME_ACK ? "(PRIME)" : "",
> +			       temp == STREAM_REJECTED ? "(REJECTED)" : "",
> +			       TRB_TO_DEV_STREAM(field0),
> +			       field3 & TRB_STAT ? 'S' : 's',
> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>  		break;
>  	default:
> -		ret += snprintf(str, size,
> -				"type '%s' -> raw %08x %08x %08x %08x",
> -				cdnsp_trb_type_string(type),
> -				field0, field1, field2, field3);
> +		ret = snprintf(str, size,
> +			       "type '%s' -> raw %08x %08x %08x %08x",
> +			       cdnsp_trb_type_string(type),
> +			       field0, field1, field2, field3);
>  	}
>  
> +	if (ret >= size)
> +		pr_info("CDNSP: buffer overflowed.\n");

"info"?

If the buffer overflows, was it properly truncated?  Or did we just
crash something else by passing on an overflowed buffer?

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 3+ messages in thread

* RE: [PATCH] usb: cdnsp: fix cdnsp_decode_trb function to properly handle ret value
  2022-01-12  7:08 ` Greg KH
@ 2022-01-12  7:27   ` Pawel Laszczak
  0 siblings, 0 replies; 3+ messages in thread
From: Pawel Laszczak @ 2022-01-12  7:27 UTC (permalink / raw)
  To: Greg KH; +Cc: peter.chen, linux-usb, linux-kernel

>
>
>On Wed, Jan 12, 2022 at 06:32:37AM +0100, Pawel Laszczak wrote:
>> From: Pawel Laszczak <pawell@cadence.com>
>>
>> Variable ret in function cdnsp_decode_trb is initialized but not
>> used. To fix this compiler warning patch adds checking whether the
>> data buffer has not been overflowed.
>>
>> Reported-by: kernel test robot <lkp@intel.com>
>> Signed-off-by: Pawel Laszczak <pawell@cadence.com>
>> ---
>>  drivers/usb/cdns3/cdnsp-debug.h | 305 ++++++++++++++++----------------
>>  1 file changed, 154 insertions(+), 151 deletions(-)
>>
>> diff --git a/drivers/usb/cdns3/cdnsp-debug.h b/drivers/usb/cdns3/cdnsp-debug.h
>> index a8776df2d4e0..f0ca865cce2a 100644
>> --- a/drivers/usb/cdns3/cdnsp-debug.h
>> +++ b/drivers/usb/cdns3/cdnsp-debug.h
>> @@ -182,208 +182,211 @@ static inline const char *cdnsp_decode_trb(char *str, size_t size, u32 field0,
>>  	int ep_id = TRB_TO_EP_INDEX(field3) - 1;
>>  	int type = TRB_FIELD_TO_TYPE(field3);
>>  	unsigned int ep_num;
>> -	int ret = 0;
>> +	int ret;
>>  	u32 temp;
>>
>>  	ep_num = DIV_ROUND_UP(ep_id, 2);
>>
>>  	switch (type) {
>>  	case TRB_LINK:
>> -		ret += snprintf(str, size,
>> -				"LINK %08x%08x intr %ld type '%s' flags %c:%c:%c:%c",
>> -				field1, field0, GET_INTR_TARGET(field2),
>> -				cdnsp_trb_type_string(type),
>> -				field3 & TRB_IOC ? 'I' : 'i',
>> -				field3 & TRB_CHAIN ? 'C' : 'c',
>> -				field3 & TRB_TC ? 'T' : 't',
>> -				field3 & TRB_CYCLE ? 'C' : 'c');
>> +		ret = snprintf(str, size,
>> +			       "LINK %08x%08x intr %ld type '%s' flags %c:%c:%c:%c",
>> +			       field1, field0, GET_INTR_TARGET(field2),
>> +			       cdnsp_trb_type_string(type),
>> +			       field3 & TRB_IOC ? 'I' : 'i',
>> +			       field3 & TRB_CHAIN ? 'C' : 'c',
>> +			       field3 & TRB_TC ? 'T' : 't',
>> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>>  		break;
>>  	case TRB_TRANSFER:
>>  	case TRB_COMPLETION:
>>  	case TRB_PORT_STATUS:
>>  	case TRB_HC_EVENT:
>> -		ret += snprintf(str, size,
>> -				"ep%d%s(%d) type '%s' TRB %08x%08x status '%s'"
>> -				" len %ld slot %ld flags %c:%c",
>> -				ep_num, ep_id % 2 ? "out" : "in",
>> -				TRB_TO_EP_INDEX(field3),
>> -				cdnsp_trb_type_string(type), field1, field0,
>> -				cdnsp_trb_comp_code_string(GET_COMP_CODE(field2)),
>> -				EVENT_TRB_LEN(field2), TRB_TO_SLOT_ID(field3),
>> -				field3 & EVENT_DATA ? 'E' : 'e',
>> -				field3 & TRB_CYCLE ? 'C' : 'c');
>> +		ret = snprintf(str, size,
>> +			       "ep%d%s(%d) type '%s' TRB %08x%08x status '%s'"
>> +			       " len %ld slot %ld flags %c:%c",
>> +			       ep_num, ep_id % 2 ? "out" : "in",
>> +			       TRB_TO_EP_INDEX(field3),
>> +			       cdnsp_trb_type_string(type), field1, field0,
>> +			       cdnsp_trb_comp_code_string(GET_COMP_CODE(field2)),
>> +			       EVENT_TRB_LEN(field2), TRB_TO_SLOT_ID(field3),
>> +			       field3 & EVENT_DATA ? 'E' : 'e',
>> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>>  		break;
>>  	case TRB_MFINDEX_WRAP:
>> -		ret += snprintf(str, size, "%s: flags %c",
>> -				cdnsp_trb_type_string(type),
>> -				field3 & TRB_CYCLE ? 'C' : 'c');
>> +		ret = snprintf(str, size, "%s: flags %c",
>> +			       cdnsp_trb_type_string(type),
>> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>>  		break;
>>  	case TRB_SETUP:
>> -		ret += snprintf(str, size,
>> -				"type '%s' bRequestType %02x bRequest %02x "
>> -				"wValue %02x%02x wIndex %02x%02x wLength %d "
>> -				"length %ld TD size %ld intr %ld Setup ID %ld "
>> -				"flags %c:%c:%c",
>> -				cdnsp_trb_type_string(type),
>> -				field0 & 0xff,
>> -				(field0 & 0xff00) >> 8,
>> -				(field0 & 0xff000000) >> 24,
>> -				(field0 & 0xff0000) >> 16,
>> -				(field1 & 0xff00) >> 8,
>> -				field1 & 0xff,
>> -				(field1 & 0xff000000) >> 16 |
>> -				(field1 & 0xff0000) >> 16,
>> -				TRB_LEN(field2), GET_TD_SIZE(field2),
>> -				GET_INTR_TARGET(field2),
>> -				TRB_SETUPID_TO_TYPE(field3),
>> -				field3 & TRB_IDT ? 'D' : 'd',
>> -				field3 & TRB_IOC ? 'I' : 'i',
>> -				field3 & TRB_CYCLE ? 'C' : 'c');
>> +		ret = snprintf(str, size,
>> +			       "type '%s' bRequestType %02x bRequest %02x "
>> +			       "wValue %02x%02x wIndex %02x%02x wLength %d "
>> +			       "length %ld TD size %ld intr %ld Setup ID %ld "
>> +			       "flags %c:%c:%c",
>> +			       cdnsp_trb_type_string(type),
>> +			       field0 & 0xff,
>> +			       (field0 & 0xff00) >> 8,
>> +			       (field0 & 0xff000000) >> 24,
>> +			       (field0 & 0xff0000) >> 16,
>> +			       (field1 & 0xff00) >> 8,
>> +			       field1 & 0xff,
>> +			       (field1 & 0xff000000) >> 16 |
>> +			       (field1 & 0xff0000) >> 16,
>> +			       TRB_LEN(field2), GET_TD_SIZE(field2),
>> +			       GET_INTR_TARGET(field2),
>> +			       TRB_SETUPID_TO_TYPE(field3),
>> +			       field3 & TRB_IDT ? 'D' : 'd',
>> +			       field3 & TRB_IOC ? 'I' : 'i',
>> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>>  		break;
>>  	case TRB_DATA:
>> -		ret += snprintf(str, size,
>> -				"type '%s' Buffer %08x%08x length %ld TD size %ld "
>> -				"intr %ld flags %c:%c:%c:%c:%c:%c:%c",
>> -				cdnsp_trb_type_string(type),
>> -				field1, field0, TRB_LEN(field2),
>> -				GET_TD_SIZE(field2),
>> -				GET_INTR_TARGET(field2),
>> -				field3 & TRB_IDT ? 'D' : 'i',
>> -				field3 & TRB_IOC ? 'I' : 'i',
>> -				field3 & TRB_CHAIN ? 'C' : 'c',
>> -				field3 & TRB_NO_SNOOP ? 'S' : 's',
>> -				field3 & TRB_ISP ? 'I' : 'i',
>> -				field3 & TRB_ENT ? 'E' : 'e',
>> -				field3 & TRB_CYCLE ? 'C' : 'c');
>> +		ret = snprintf(str, size,
>> +			       "type '%s' Buffer %08x%08x length %ld TD size %ld "
>> +			       "intr %ld flags %c:%c:%c:%c:%c:%c:%c",
>> +			       cdnsp_trb_type_string(type),
>> +			       field1, field0, TRB_LEN(field2),
>> +			       GET_TD_SIZE(field2),
>> +			       GET_INTR_TARGET(field2),
>> +			       field3 & TRB_IDT ? 'D' : 'i',
>> +			       field3 & TRB_IOC ? 'I' : 'i',
>> +			       field3 & TRB_CHAIN ? 'C' : 'c',
>> +			       field3 & TRB_NO_SNOOP ? 'S' : 's',
>> +			       field3 & TRB_ISP ? 'I' : 'i',
>> +			       field3 & TRB_ENT ? 'E' : 'e',
>> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>>  		break;
>>  	case TRB_STATUS:
>> -		ret += snprintf(str, size,
>> -				"Buffer %08x%08x length %ld TD size %ld intr"
>> -				"%ld type '%s' flags %c:%c:%c:%c",
>> -				field1, field0, TRB_LEN(field2),
>> -				GET_TD_SIZE(field2),
>> -				GET_INTR_TARGET(field2),
>> -				cdnsp_trb_type_string(type),
>> -				field3 & TRB_IOC ? 'I' : 'i',
>> -				field3 & TRB_CHAIN ? 'C' : 'c',
>> -				field3 & TRB_ENT ? 'E' : 'e',
>> -				field3 & TRB_CYCLE ? 'C' : 'c');
>> +		ret = snprintf(str, size,
>> +			       "Buffer %08x%08x length %ld TD size %ld intr"
>> +			       "%ld type '%s' flags %c:%c:%c:%c",
>> +			       field1, field0, TRB_LEN(field2),
>> +			       GET_TD_SIZE(field2),
>> +			       GET_INTR_TARGET(field2),
>> +			       cdnsp_trb_type_string(type),
>> +			       field3 & TRB_IOC ? 'I' : 'i',
>> +			       field3 & TRB_CHAIN ? 'C' : 'c',
>> +			       field3 & TRB_ENT ? 'E' : 'e',
>> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>>  		break;
>>  	case TRB_NORMAL:
>>  	case TRB_ISOC:
>>  	case TRB_EVENT_DATA:
>>  	case TRB_TR_NOOP:
>> -		ret += snprintf(str, size,
>> -				"type '%s' Buffer %08x%08x length %ld "
>> -				"TD size %ld intr %ld "
>> -				"flags %c:%c:%c:%c:%c:%c:%c:%c:%c",
>> -				cdnsp_trb_type_string(type),
>> -				field1, field0, TRB_LEN(field2),
>> -				GET_TD_SIZE(field2),
>> -				GET_INTR_TARGET(field2),
>> -				field3 & TRB_BEI ? 'B' : 'b',
>> -				field3 & TRB_IDT ? 'T' : 't',
>> -				field3 & TRB_IOC ? 'I' : 'i',
>> -				field3 & TRB_CHAIN ? 'C' : 'c',
>> -				field3 & TRB_NO_SNOOP ? 'S' : 's',
>> -				field3 & TRB_ISP ? 'I' : 'i',
>> -				field3 & TRB_ENT ? 'E' : 'e',
>> -				field3 & TRB_CYCLE ? 'C' : 'c',
>> -				!(field3 & TRB_EVENT_INVALIDATE) ? 'V' : 'v');
>> +		ret = snprintf(str, size,
>> +			       "type '%s' Buffer %08x%08x length %ld "
>> +			       "TD size %ld intr %ld "
>> +			       "flags %c:%c:%c:%c:%c:%c:%c:%c:%c",
>> +			       cdnsp_trb_type_string(type),
>> +			       field1, field0, TRB_LEN(field2),
>> +			       GET_TD_SIZE(field2),
>> +			       GET_INTR_TARGET(field2),
>> +			       field3 & TRB_BEI ? 'B' : 'b',
>> +			       field3 & TRB_IDT ? 'T' : 't',
>> +			       field3 & TRB_IOC ? 'I' : 'i',
>> +			       field3 & TRB_CHAIN ? 'C' : 'c',
>> +			       field3 & TRB_NO_SNOOP ? 'S' : 's',
>> +			       field3 & TRB_ISP ? 'I' : 'i',
>> +			       field3 & TRB_ENT ? 'E' : 'e',
>> +			       field3 & TRB_CYCLE ? 'C' : 'c',
>> +			       !(field3 & TRB_EVENT_INVALIDATE) ? 'V' : 'v');
>>  		break;
>>  	case TRB_CMD_NOOP:
>>  	case TRB_ENABLE_SLOT:
>> -		ret += snprintf(str, size, "%s: flags %c",
>> -				cdnsp_trb_type_string(type),
>> -				field3 & TRB_CYCLE ? 'C' : 'c');
>> +		ret = snprintf(str, size, "%s: flags %c",
>> +			       cdnsp_trb_type_string(type),
>> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>>  		break;
>>  	case TRB_DISABLE_SLOT:
>> -		ret += snprintf(str, size, "%s: slot %ld flags %c",
>> -				cdnsp_trb_type_string(type),
>> -				TRB_TO_SLOT_ID(field3),
>> -				field3 & TRB_CYCLE ? 'C' : 'c');
>> +		ret = snprintf(str, size, "%s: slot %ld flags %c",
>> +			       cdnsp_trb_type_string(type),
>> +			       TRB_TO_SLOT_ID(field3),
>> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>>  		break;
>>  	case TRB_ADDR_DEV:
>> -		ret += snprintf(str, size,
>> -				"%s: ctx %08x%08x slot %ld flags %c:%c",
>> -				cdnsp_trb_type_string(type), field1, field0,
>> -				TRB_TO_SLOT_ID(field3),
>> -				field3 & TRB_BSR ? 'B' : 'b',
>> -				field3 & TRB_CYCLE ? 'C' : 'c');
>> +		ret = snprintf(str, size,
>> +			       "%s: ctx %08x%08x slot %ld flags %c:%c",
>> +			       cdnsp_trb_type_string(type), field1, field0,
>> +			       TRB_TO_SLOT_ID(field3),
>> +			       field3 & TRB_BSR ? 'B' : 'b',
>> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>>  		break;
>>  	case TRB_CONFIG_EP:
>> -		ret += snprintf(str, size,
>> -				"%s: ctx %08x%08x slot %ld flags %c:%c",
>> -				cdnsp_trb_type_string(type), field1, field0,
>> -				TRB_TO_SLOT_ID(field3),
>> -				field3 & TRB_DC ? 'D' : 'd',
>> -				field3 & TRB_CYCLE ? 'C' : 'c');
>> +		ret = snprintf(str, size,
>> +			       "%s: ctx %08x%08x slot %ld flags %c:%c",
>> +			       cdnsp_trb_type_string(type), field1, field0,
>> +			       TRB_TO_SLOT_ID(field3),
>> +			       field3 & TRB_DC ? 'D' : 'd',
>> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>>  		break;
>>  	case TRB_EVAL_CONTEXT:
>> -		ret += snprintf(str, size,
>> -				"%s: ctx %08x%08x slot %ld flags %c",
>> -				cdnsp_trb_type_string(type), field1, field0,
>> -				TRB_TO_SLOT_ID(field3),
>> -				field3 & TRB_CYCLE ? 'C' : 'c');
>> +		ret = snprintf(str, size,
>> +			       "%s: ctx %08x%08x slot %ld flags %c",
>> +			       cdnsp_trb_type_string(type), field1, field0,
>> +			       TRB_TO_SLOT_ID(field3),
>> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>>  		break;
>>  	case TRB_RESET_EP:
>>  	case TRB_HALT_ENDPOINT:
>>  	case TRB_FLUSH_ENDPOINT:
>> -		ret += snprintf(str, size,
>> -				"%s: ep%d%s(%d) ctx %08x%08x slot %ld flags %c",
>> -				cdnsp_trb_type_string(type),
>> -				ep_num, ep_id % 2 ? "out" : "in",
>> -				TRB_TO_EP_INDEX(field3), field1, field0,
>> -				TRB_TO_SLOT_ID(field3),
>> -				field3 & TRB_CYCLE ? 'C' : 'c');
>> +		ret = snprintf(str, size,
>> +			       "%s: ep%d%s(%d) ctx %08x%08x slot %ld flags %c",
>> +			       cdnsp_trb_type_string(type),
>> +			       ep_num, ep_id % 2 ? "out" : "in",
>> +			       TRB_TO_EP_INDEX(field3), field1, field0,
>> +			       TRB_TO_SLOT_ID(field3),
>> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>>  		break;
>>  	case TRB_STOP_RING:
>> -		ret += snprintf(str, size,
>> -				"%s: ep%d%s(%d) slot %ld sp %d flags %c",
>> -				cdnsp_trb_type_string(type),
>> -				ep_num, ep_id % 2 ? "out" : "in",
>> -				TRB_TO_EP_INDEX(field3),
>> -				TRB_TO_SLOT_ID(field3),
>> -				TRB_TO_SUSPEND_PORT(field3),
>> -				field3 & TRB_CYCLE ? 'C' : 'c');
>> +		ret = snprintf(str, size,
>> +			       "%s: ep%d%s(%d) slot %ld sp %d flags %c",
>> +			       cdnsp_trb_type_string(type),
>> +			       ep_num, ep_id % 2 ? "out" : "in",
>> +			       TRB_TO_EP_INDEX(field3),
>> +			       TRB_TO_SLOT_ID(field3),
>> +			       TRB_TO_SUSPEND_PORT(field3),
>> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>>  		break;
>>  	case TRB_SET_DEQ:
>> -		ret += snprintf(str, size,
>> -				"%s: ep%d%s(%d) deq %08x%08x stream %ld slot %ld  flags %c",
>> -				cdnsp_trb_type_string(type),
>> -				ep_num, ep_id % 2 ? "out" : "in",
>> -				TRB_TO_EP_INDEX(field3), field1, field0,
>> -				TRB_TO_STREAM_ID(field2),
>> -				TRB_TO_SLOT_ID(field3),
>> -				field3 & TRB_CYCLE ? 'C' : 'c');
>> +		ret = snprintf(str, size,
>> +			       "%s: ep%d%s(%d) deq %08x%08x stream %ld slot %ld  flags %c",
>> +			       cdnsp_trb_type_string(type),
>> +			       ep_num, ep_id % 2 ? "out" : "in",
>> +			       TRB_TO_EP_INDEX(field3), field1, field0,
>> +			       TRB_TO_STREAM_ID(field2),
>> +			       TRB_TO_SLOT_ID(field3),
>> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>>  		break;
>>  	case TRB_RESET_DEV:
>> -		ret += snprintf(str, size, "%s: slot %ld flags %c",
>> -				cdnsp_trb_type_string(type),
>> -				TRB_TO_SLOT_ID(field3),
>> -				field3 & TRB_CYCLE ? 'C' : 'c');
>> +		ret = snprintf(str, size, "%s: slot %ld flags %c",
>> +			       cdnsp_trb_type_string(type),
>> +			       TRB_TO_SLOT_ID(field3),
>> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>>  		break;
>>  	case TRB_ENDPOINT_NRDY:
>> -		temp  = TRB_TO_HOST_STREAM(field2);
>> -
>> -		ret += snprintf(str, size,
>> -				"%s: ep%d%s(%d) H_SID %x%s%s D_SID %lx flags %c:%c",
>> -				cdnsp_trb_type_string(type),
>> -				ep_num, ep_id % 2 ? "out" : "in",
>> -				TRB_TO_EP_INDEX(field3), temp,
>> -				temp == STREAM_PRIME_ACK ? "(PRIME)" : "",
>> -				temp == STREAM_REJECTED ? "(REJECTED)" : "",
>> -				TRB_TO_DEV_STREAM(field0),
>> -				field3 & TRB_STAT ? 'S' : 's',
>> -				field3 & TRB_CYCLE ? 'C' : 'c');
>> +		temp = TRB_TO_HOST_STREAM(field2);
>> +
>> +		ret = snprintf(str, size,
>> +			       "%s: ep%d%s(%d) H_SID %x%s%s D_SID %lx flags %c:%c",
>> +			       cdnsp_trb_type_string(type),
>> +			       ep_num, ep_id % 2 ? "out" : "in",
>> +			       TRB_TO_EP_INDEX(field3), temp,
>> +			       temp == STREAM_PRIME_ACK ? "(PRIME)" : "",
>> +			       temp == STREAM_REJECTED ? "(REJECTED)" : "",
>> +			       TRB_TO_DEV_STREAM(field0),
>> +			       field3 & TRB_STAT ? 'S' : 's',
>> +			       field3 & TRB_CYCLE ? 'C' : 'c');
>>  		break;
>>  	default:
>> -		ret += snprintf(str, size,
>> -				"type '%s' -> raw %08x %08x %08x %08x",
>> -				cdnsp_trb_type_string(type),
>> -				field0, field1, field2, field3);
>> +		ret = snprintf(str, size,
>> +			       "type '%s' -> raw %08x %08x %08x %08x",
>> +			       cdnsp_trb_type_string(type),
>> +			       field0, field1, field2, field3);
>>  	}
>>
>> +	if (ret >= size)
>> +		pr_info("CDNSP: buffer overflowed.\n");
>
>"info"?
>
>If the buffer overflows, was it properly truncated?  Or did we just
>crash something else by passing on an overflowed buffer?

Yes, data will be properly truncated. Driver and kernel will not crash. 
So, I added only information that some debug date may have been truncated.

Thanks,

Pawel Laszczak

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-01-12  7:27 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-12  5:32 [PATCH] usb: cdnsp: fix cdnsp_decode_trb function to properly handle ret value Pawel Laszczak
2022-01-12  7:08 ` Greg KH
2022-01-12  7:27   ` Pawel Laszczak

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).