Received: by 2002:a05:7412:31a9:b0:e2:908c:2ebd with SMTP id et41csp4368010rdb; Thu, 14 Sep 2023 23:00:56 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFjNvkeeZ/ByX/aKyDq4EvJhs0eie09VJhYVuwj7tvF/yElxS9g3MEs6uHn+sBc3souEykZ X-Received: by 2002:a17:902:9b83:b0:1bf:73ec:b980 with SMTP id y3-20020a1709029b8300b001bf73ecb980mr561406plp.66.1694757655677; Thu, 14 Sep 2023 23:00:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694757655; cv=none; d=google.com; s=arc-20160816; b=iUkoR0Y46LSUf0JjZ6AIkJ05d2CuDbQMGEaAHPbytK5SbX+1cXAjUStkoJVAfCn0ca ycXmFVMURRXnCb5kI6k8U1OvooK6rguO4tjgGesxKlAxIMVoT4kh6UqkLS3a8yW7CBcg JYaVHyPmqq/KP5Af2538vmUYkoTO8e2Yq+SUuQ5um90TbpcI0GeAVCKSMbSXdfSHxAcy uEr1wGSfELV8UuOlfaBca0CBLulANa5XKAZopQo56MNxpofBx/fBBuBdp7pAT6REZH+h zlbhSF42LTlz3emP6uX0Idt1Bb9n36WOm6g0PBAMar3J8U+zcQj8NuCnIjFunXDYEtiE AY+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=wtglMCmuLBbLuI4JuCAdgG3Phpnp74/duTm00wrCLao=; fh=ZNemfyhU7BaHvdTgntZfRBhJikZmskgKnjSA0VHgHrw=; b=zLWLUq5NYGFRwsb8gwLjdnxyiQTefjagLV5P6AtxKIY5DRvgEuQaDCIqClEWabw8Sf 520XfH6BEHLE6Xv6l/kVLdSBAllPalxq2MPGhB5on2DvcyyJH6HFkdWY/Cvu9Lg2FA+Y xxqOtTXvIKUd+xUgUSxccwalFDdWJXffYSObVFABrnc9yC2Uxs/q6oBKgQaAbWKcuwhL IL997vlqmgAUW0EL3SkLx3CJ61S4/bMa2LpU4WTv/dXCkS3kp7cXvjDCUPgQwm2D6VrH 3cisPw3a62R/uNUZJD6Afk0h9v2lfuQqF/UGF/sH9rjPwTZupmLd0gb2ltPofPtaNE3a ZE/g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b=WQ0YjwDG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:6 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Return-Path: Received: from pete.vger.email (pete.vger.email. [2620:137:e000::3:6]) by mx.google.com with ESMTPS id u2-20020a170902e5c200b001c3aed2db5dsi2983392plf.409.2023.09.14.23.00.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Sep 2023 23:00:55 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:6 as permitted sender) client-ip=2620:137:e000::3:6; Authentication-Results: mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b=WQ0YjwDG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:6 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by pete.vger.email (Postfix) with ESMTP id 2DBD283C1921; Thu, 14 Sep 2023 11:29:52 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at pete.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241247AbjINS3u (ORCPT + 99 others); Thu, 14 Sep 2023 14:29:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51480 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240803AbjINS3s (ORCPT ); Thu, 14 Sep 2023 14:29:48 -0400 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 99AF81FEB; Thu, 14 Sep 2023 11:29:44 -0700 (PDT) Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 38EI2FsK028631; Thu, 14 Sep 2023 18:29:41 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=from : to : cc : subject : date : message-id : mime-version : content-transfer-encoding : content-type; s=qcppdkim1; bh=wtglMCmuLBbLuI4JuCAdgG3Phpnp74/duTm00wrCLao=; b=WQ0YjwDGjsYr/3bd8HNXbLlbZtVA7zeQ6SNJfUBAbyhsWJ/LX54nRAJ2ovl24Yserl5C zyyJfYKS6ScDqdo+ke+38aeZGG94jC6uC2crZFF7E2UdAClGtg/Lf1aXdaALl7/C15R+ E3iRC3fEfxGfrK1tih+ZI5jbmsb5PO76FxsrOzcdCTwY4gKKCaW08WW5+Ixh7LacDrnC NpWRltHivfckxynq7yif9P/wAlegFd4MZbLwjzP2FX29NOWCGMO1nnf8RtAo43ryuEkL GSZCgzExIQTV0tUW4spPeYNegWGTlCCyplSEO9edrIyingZN9hBsXBaNN1s2VC9M1BRN KA== Received: from nalasppmta05.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3t3re32h3m-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 14 Sep 2023 18:29:41 +0000 Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com [10.47.209.196]) by NALASPPMTA05.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 38EITeNP009751 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 14 Sep 2023 18:29:40 GMT Received: from hu-kriskura-hyd.qualcomm.com (10.80.80.8) by nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.36; Thu, 14 Sep 2023 11:29:37 -0700 From: Krishna Kurapati To: Greg Kroah-Hartman , Linyu Yuan , =?UTF-8?q?Maciej=20=C5=BBenczykowski?= CC: , , , , , Krishna Kurapati Subject: [RFC] usb: gadget: ncm: Handle decoding of multiple NTB's in unwrap call Date: Thu, 14 Sep 2023 23:59:22 +0530 Message-ID: <20230914182922.27157-1-quic_kriskura@quicinc.com> X-Mailer: git-send-email 2.42.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01b.na.qualcomm.com (10.46.141.250) To nalasex01a.na.qualcomm.com (10.47.209.196) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: 7ZgBxjXJQv7O903MCVuXo6FAxzAjMO8O X-Proofpoint-ORIG-GUID: 7ZgBxjXJQv7O903MCVuXo6FAxzAjMO8O X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.267,Aquarius:18.0.980,Hydra:6.0.601,FMLib:17.11.176.26 definitions=2023-09-14_09,2023-09-14_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 priorityscore=1501 malwarescore=0 mlxscore=0 mlxlogscore=999 lowpriorityscore=0 spamscore=0 clxscore=1011 suspectscore=0 impostorscore=0 adultscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2308100000 definitions=main-2309140160 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (pete.vger.email [0.0.0.0]); Thu, 14 Sep 2023 11:29:52 -0700 (PDT) X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on pete.vger.email When NCM is used with hosts like Windows PC, it is observed that there are multiple NTB's contained in one usb request giveback. Since the driver unwraps the obtained request data assuming only one NTB is present, we loose the subsequent NTB's present resulting in data loss. Fix this by checking the parsed block length with the obtained data length in usb request and continue parsing after the last byte of current NTB. Signed-off-by: Krishna Kurapati --- drivers/usb/gadget/function/f_ncm.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/drivers/usb/gadget/function/f_ncm.c b/drivers/usb/gadget/function/f_ncm.c index feccf4c8cc4f..f00f051438ec 100644 --- a/drivers/usb/gadget/function/f_ncm.c +++ b/drivers/usb/gadget/function/f_ncm.c @@ -1156,7 +1156,8 @@ static int ncm_unwrap_ntb(struct gether *port, struct sk_buff_head *list) { struct f_ncm *ncm = func_to_ncm(&port->func); - __le16 *tmp = (void *) skb->data; + unsigned char *ntb_ptr = (void *) skb->data; + __le16 *tmp; unsigned index, index2; int ndp_index; unsigned dg_len, dg_len2; @@ -1169,6 +1170,10 @@ static int ncm_unwrap_ntb(struct gether *port, const struct ndp_parser_opts *opts = ncm->parser_opts; unsigned crc_len = ncm->is_crc ? sizeof(uint32_t) : 0; int dgram_counter; + int to_process = skb->len; + +parse_ntb: + tmp = (void *) ntb_ptr; /* dwSignature */ if (get_unaligned_le32(tmp) != opts->nth_sign) { @@ -1215,7 +1220,7 @@ static int ncm_unwrap_ntb(struct gether *port, * walk through NDP * dwSignature */ - tmp = (void *)(skb->data + ndp_index); + tmp = (void *)(ntb_ptr + ndp_index); if (get_unaligned_le32(tmp) != ncm->ndp_sign) { INFO(port->func.config->cdev, "Wrong NDP SIGN\n"); goto err; @@ -1272,11 +1277,11 @@ static int ncm_unwrap_ntb(struct gether *port, if (ncm->is_crc) { uint32_t crc, crc2; - crc = get_unaligned_le32(skb->data + + crc = get_unaligned_le32(ntb_ptr + index + dg_len - crc_len); crc2 = ~crc32_le(~0, - skb->data + index, + ntb_ptr + index, dg_len - crc_len); if (crc != crc2) { INFO(port->func.config->cdev, @@ -1303,7 +1308,7 @@ static int ncm_unwrap_ntb(struct gether *port, dg_len - crc_len); if (skb2 == NULL) goto err; - skb_put_data(skb2, skb->data + index, + skb_put_data(skb2, ntb_ptr + index, dg_len - crc_len); skb_queue_tail(list, skb2); @@ -1316,10 +1321,17 @@ static int ncm_unwrap_ntb(struct gether *port, } while (ndp_len > 2 * (opts->dgram_item_len * 2)); } while (ndp_index); - dev_consume_skb_any(skb); - VDBG(port->func.config->cdev, "Parsed NTB with %d frames\n", dgram_counter); + + to_process -= block_len; + if (to_process != 0) { + ntb_ptr = (unsigned char *) (ntb_ptr + block_len); + goto parse_ntb; + } + + dev_consume_skb_any(skb); + return 0; err: skb_queue_purge(list); -- 2.42.0