summaryrefslogtreecommitdiff
path: root/drivers/net/mctp/mctp-serial.c
diff options
context:
space:
mode:
authorMatt Johnston <matt@codeconstruct.com.au>2024-08-29 15:43:46 +0800
committerDavid S. Miller <davem@davemloft.net>2024-09-01 18:14:01 +0100
commitf962e8361adfa84e8252d3fc3e5e6bb879f029b1 (patch)
tree1e5947123c77cf599e0033ce0042167f0d8356d1 /drivers/net/mctp/mctp-serial.c
parent4fa9c5181cfe083d0beefb5157a643560e7bd152 (diff)
net: mctp-serial: Fix missing escapes on transmit
0x7d and 0x7e bytes are meant to be escaped in the data portion of frames, but this didn't occur since next_chunk_len() had an off-by-one error. That also resulted in the final byte of a payload being written as a separate tty write op. The chunk prior to an escaped byte would be one byte short, and the next call would never test the txpos+1 case, which is where the escaped byte was located. That meant it never hit the escaping case in mctp_serial_tx_work(). Example Input: 01 00 08 c8 7e 80 02 Previous incorrect chunks from next_chunk_len(): 01 00 08 c8 7e 80 02 With this fix: 01 00 08 c8 7e 80 02 Cc: stable@vger.kernel.org Fixes: a0c2ccd9b5ad ("mctp: Add MCTP-over-serial transport binding") Signed-off-by: Matt Johnston <matt@codeconstruct.com.au> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/mctp/mctp-serial.c')
-rw-r--r--drivers/net/mctp/mctp-serial.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/net/mctp/mctp-serial.c b/drivers/net/mctp/mctp-serial.c
index 7a40d07ff77b..f39bbe255497 100644
--- a/drivers/net/mctp/mctp-serial.c
+++ b/drivers/net/mctp/mctp-serial.c
@@ -91,8 +91,8 @@ static int next_chunk_len(struct mctp_serial *dev)
* will be those non-escaped bytes, and does not include the escaped
* byte.
*/
- for (i = 1; i + dev->txpos + 1 < dev->txlen; i++) {
- if (needs_escape(dev->txbuf[dev->txpos + i + 1]))
+ for (i = 1; i + dev->txpos < dev->txlen; i++) {
+ if (needs_escape(dev->txbuf[dev->txpos + i]))
break;
}