From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BFAEE20B3E; Tue, 23 Apr 2024 21:42:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713908527; cv=none; b=ZGOGS5K/yUBi7jbGveJlar57LO0kIKmccEWdTg8AdWgxpESDIoxmBDJg+4C7vo5Z3ug1qJT2p4+yYXXjOs59eOoy7l7qUo6SjhK2xTrGwA7Z2mMEudazFfsUW7Y6npkk9YTJEby/ONefaSiLZD8RNNeRkaIuZgreNC0En2BRBIM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713908527; c=relaxed/simple; bh=QZ+qqX+IJqkvqScY+qTQMSgoygtADBJRzWQHuMw++MQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cpV4caDi6mCgF+Isuw89pI3d4q+ASmYx/tiJ9WtGArAbX8qquJpYNGd4ItjrTGESNVxzmdWb++n/PoNF3/sGxnrLM4y8XlTg5pZM7lm2x2k9rpTCck3uQT+oBBbFjiMdBjEiqpWdQY+OG7jRV2YLPTWqq1GSl/1TcQ/xZwPeQv0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linuxfoundation.org header.i=@linuxfoundation.org header.b=Jv7uA21w; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linuxfoundation.org header.i=@linuxfoundation.org header.b="Jv7uA21w" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9482DC116B1; Tue, 23 Apr 2024 21:42:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1713908527; bh=QZ+qqX+IJqkvqScY+qTQMSgoygtADBJRzWQHuMw++MQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Jv7uA21wx0jNLgxogJ2N8LhNrNnW5MQRsVFXCXbKmYCFfEP4zUC4SR0q6lGz3dbTH MSgxaVNKWi4uAQdMlubhENPnfaJWp4rC/aA/HuTfryPaSJvaSxmnJJ7WFY7nTGq5v9 YwZ5XzlHKtImHWrQevJpsY8OoAewQYCoaO3Xle0E= From: Greg Kroah-Hartman To: stable@vger.kernel.org Cc: Greg Kroah-Hartman , patches@lists.linux.dev, Kyle Tso , Heikki Krogerus Subject: [PATCH 6.8 120/158] usb: typec: tcpm: Correct the PDO counting in pd_set Date: Tue, 23 Apr 2024 14:39:02 -0700 Message-ID: <20240423213859.818971117@linuxfoundation.org> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240423213855.824778126@linuxfoundation.org> References: <20240423213855.824778126@linuxfoundation.org> User-Agent: quilt/0.67 X-stable: review X-Patchwork-Hint: ignore Precedence: bulk X-Mailing-List: stable@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 6.8-stable review patch. If anyone has any objections, please let me know. ------------------ From: Kyle Tso commit c4128304c2169b4664ed6fb6200f228cead2ab70 upstream. Off-by-one errors happen because nr_snk_pdo and nr_src_pdo are incorrectly added one. The index of the loop is equal to the number of PDOs to be updated when leaving the loop and it doesn't need to be added one. When doing the power negotiation, TCPM relies on the "nr_snk_pdo" as the size of the local sink PDO array to match the Source capabilities of the partner port. If the off-by-one overflow occurs, a wrong RDO might be sent and unexpected power transfer might happen such as over voltage or over current (than expected). "nr_src_pdo" is used to set the Rp level when the port is in Source role. It is also the array size of the local Source capabilities when filling up the buffer which will be sent as the Source PDOs (such as in Power Negotiation). If the off-by-one overflow occurs, a wrong Rp level might be set and wrong Source PDOs will be sent to the partner port. This could potentially cause over current or port resets. Fixes: cd099cde4ed2 ("usb: typec: tcpm: Support multiple capabilities") Cc: stable@vger.kernel.org Signed-off-by: Kyle Tso Reviewed-by: Heikki Krogerus Link: https://lore.kernel.org/r/20240404133517.2707955-1-kyletso@google.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/typec/tcpm/tcpm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c @@ -6111,14 +6111,14 @@ static int tcpm_pd_set(struct typec_port if (data->sink_desc.pdo[0]) { for (i = 0; i < PDO_MAX_OBJECTS && data->sink_desc.pdo[i]; i++) port->snk_pdo[i] = data->sink_desc.pdo[i]; - port->nr_snk_pdo = i + 1; + port->nr_snk_pdo = i; port->operating_snk_mw = data->operating_snk_mw; } if (data->source_desc.pdo[0]) { for (i = 0; i < PDO_MAX_OBJECTS && data->source_desc.pdo[i]; i++) port->src_pdo[i] = data->source_desc.pdo[i]; - port->nr_src_pdo = i + 1; + port->nr_src_pdo = i; } switch (port->state) {