Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp3184753pxb; Mon, 1 Mar 2021 03:56:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJwVy0v5Wo1Z2ogPdPHu9G6jkp8wtPPRpCvILyXgLkzwd9r2Alquhk4GDc86/6zW6FkMaTMF X-Received: by 2002:a05:6402:180b:: with SMTP id g11mr6229587edy.195.1614599783450; Mon, 01 Mar 2021 03:56:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614599783; cv=none; d=google.com; s=arc-20160816; b=Ydc5gpje5WKUdSIEeO/H5HLjLXfnCMVRpXO74RHeXUmw7vDsF/d2/DWLueubZyaQYs VFayKYDgFeB2kOCQl72koqxDunFfRC4DwWvqhnw1fImHMmvLF0x1Ej+uwPmhJQZ9JSYW Sr30GuGcolTogy6gRfoXr3bIqec55yKyi/gWRINXOHW2+vEZGzW0eTMuIrddgwrNfMBj vWymOGjq5HMVSZuUsd0nYBxea2NO0LthJTJJZPwvou7HZFgdXhjSoafzscLt+I37fL5F YVhSfHlAxDeuqwaO/IKd2k3RhQ0lqLLMjTX9Qd2t/bUw/dAXYt0h7Mzjnet3MNAr3rw9 wzJA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature; bh=QcE+g+g7mExT314EzRI5jC4aCY5l0a1ys6s5hUq2MwM=; b=ZIRRltsUxa8WjJdaTRv3PFS7QGTHqlndjXBbY4+hpEa6+Iqvc27yNq0HPIK6NEnQxD 9S9Vc2K/xQ0sngaohdBTpU+fbtA/De1HOlCdjOIZERQQbX9A0/XKCJM68Yk96p97cbwT YfGdyVCPHuJvxtJDcxTwaTqSVGzQm14FEQtTqrifq5HxQJaN7HUp/WgnnrXHczxsj9Fg vFS9Jh4wAP1LG9Bnkl4iQSqBQXD4saQXQySzA/+x7gJgbBM+splSXruZFSfNxGcQTnac RrfnczxC26DQ5rzIfNps60ONYsI5NsKCTfh5eUKtForuxKSIyCCkvsURx3+7V4IAbD5I NAQg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Yp2JyZjY; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id d5si10987891eja.499.2021.03.01.03.56.00; Mon, 01 Mar 2021 03:56:23 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Yp2JyZjY; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234598AbhCALyU (ORCPT + 99 others); Mon, 1 Mar 2021 06:54:20 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33662 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234160AbhCALvg (ORCPT ); Mon, 1 Mar 2021 06:51:36 -0500 Received: from mail-lf1-x12b.google.com (mail-lf1-x12b.google.com [IPv6:2a00:1450:4864:20::12b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D02CDC061356; Mon, 1 Mar 2021 03:50:28 -0800 (PST) Received: by mail-lf1-x12b.google.com with SMTP id v9so7213075lfa.1; Mon, 01 Mar 2021 03:50:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=QcE+g+g7mExT314EzRI5jC4aCY5l0a1ys6s5hUq2MwM=; b=Yp2JyZjYmI/daDo/mX5UOoQxVnnl2YixWYLv+a8V2Kzk60ROjp0ILUnJkLXbmk+thL 3fVp6lam5ylo8Xb8ltWl9XAa1okftI2v59fei8b+9ybrS/mrFqzXPFJjhiE0IpCdZTrW y+69DnJuCSjvh5MbU70toE01zJCf0fM3mJquPv9Rh8NvhMZ4wDD/yOcZojVXK7zZxvmz gSXIGmyy0t7OZgppt4DinuXjUbHvCWJZN4LC59xr+O7zqiONtGkVLgsou6+7o3sL4aQJ h6aK8Y6n5mZOefHqt+QUFqlBmVwbIVDFDWhkq3U/nKv4jipK86uw87QNWHfD5okorqW6 L58w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=QcE+g+g7mExT314EzRI5jC4aCY5l0a1ys6s5hUq2MwM=; b=i1GNuCmAHUmg5lZvYXqILjUtORRuDsAgNU/hV34UOOw9krsPUxog0N2whjfgEfcXMk s/uMdoxgRm53YoPWdCJ0JEz0nR7iSu8mkuNqxZHwaDd+6pSlXDInk0x6xPCXNAhO8Qn5 CWvC84IqAjC9d9iLU2brUUSXOSIizQ9Tsc7nnNZXD8MjmrJPAtmNblBkt7qa5J25KEvE kFfpeHUj8FgLs7gxN2Kd49mX+fF8I6uH7LaysS9lgNIoAAlP1J7ZzylRcpn1Y2X4auwx 46F7821fxTffJZjyMChHqn/KORryqJxDdiCC4FyMvyUHJFjDCyFxI8WFzud+I1ExLc2E yC9g== X-Gm-Message-State: AOAM530j9+lVPYy6mQG5ZalyGGeMm0+QejQqmfmcWSj3gqTMzkVqCxRs Pa1GxP5Ko/gcoOJpwkg7Yno= X-Received: by 2002:a05:6512:203a:: with SMTP id s26mr9572800lfs.535.1614599427398; Mon, 01 Mar 2021 03:50:27 -0800 (PST) Received: from localhost (crossness-hoof.volia.net. [93.72.107.198]) by smtp.gmail.com with ESMTPSA id m1sm2431356ljg.111.2021.03.01.03.50.26 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Mon, 01 Mar 2021 03:50:26 -0800 (PST) From: Ruslan Bilovol To: Felipe Balbi , Greg Kroah-Hartman Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Ruslan Bilovol Subject: [PATCH v2 3/5] usb: gadget: f_uac2: validate input parameters Date: Mon, 1 Mar 2021 13:49:33 +0200 Message-Id: <1614599375-8803-4-git-send-email-ruslan.bilovol@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1614599375-8803-1-git-send-email-ruslan.bilovol@gmail.com> References: <1614599375-8803-1-git-send-email-ruslan.bilovol@gmail.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently user can configure UAC2 function with parameters that violate UAC2 spec or are not supported by UAC2 gadget implementation. This can lead to incorrect behavior if such gadget is connected to the host - like enumeration failure or other issues depending on host's UAC2 driver implementation, bringing user to a long hours of debugging the issue. Instead of silently accept these parameters, throw an error if they are not valid. Signed-off-by: Ruslan Bilovol --- drivers/usb/gadget/function/f_uac2.c | 39 ++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c index c62cccb..f868e38 100644 --- a/drivers/usb/gadget/function/f_uac2.c +++ b/drivers/usb/gadget/function/f_uac2.c @@ -14,6 +14,9 @@ #include "u_audio.h" #include "u_uac2.h" +/* UAC2 spec: 4.1 Audio Channel Cluster Descriptor */ +#define UAC2_CHANNEL_MASK 0x07FFFFFF + /* * The driver implements a simple UAC_2 topology. * USB-OUT -> IT_1 -> OT_3 -> ALSA_Capture @@ -604,6 +607,36 @@ static void setup_descriptor(struct f_uac2_opts *opts) hs_audio_desc[i] = NULL; } +static int afunc_validate_opts(struct g_audio *agdev, struct device *dev) +{ + struct f_uac2_opts *opts = g_audio_to_uac2_opts(agdev); + + if (!opts->p_chmask && !opts->c_chmask) { + dev_err(dev, "Error: no playback and capture channels\n"); + return -EINVAL; + } else if (opts->p_chmask & ~UAC2_CHANNEL_MASK) { + dev_err(dev, "Error: unsupported playback channels mask\n"); + return -EINVAL; + } else if (opts->c_chmask & ~UAC2_CHANNEL_MASK) { + dev_err(dev, "Error: unsupported capture channels mask\n"); + return -EINVAL; + } else if ((opts->p_ssize < 1) || (opts->p_ssize > 4)) { + dev_err(dev, "Error: incorrect playback sample size\n"); + return -EINVAL; + } else if ((opts->c_ssize < 1) || (opts->c_ssize > 4)) { + dev_err(dev, "Error: incorrect capture sample size\n"); + return -EINVAL; + } else if (!opts->p_srate) { + dev_err(dev, "Error: incorrect playback sampling rate\n"); + return -EINVAL; + } else if (!opts->c_srate) { + dev_err(dev, "Error: incorrect capture sampling rate\n"); + return -EINVAL; + } + + return 0; +} + static int afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) { @@ -612,11 +645,13 @@ static void setup_descriptor(struct f_uac2_opts *opts) struct usb_composite_dev *cdev = cfg->cdev; struct usb_gadget *gadget = cdev->gadget; struct device *dev = &gadget->dev; - struct f_uac2_opts *uac2_opts; + struct f_uac2_opts *uac2_opts = g_audio_to_uac2_opts(agdev); struct usb_string *us; int ret; - uac2_opts = container_of(fn->fi, struct f_uac2_opts, func_inst); + ret = afunc_validate_opts(agdev, dev); + if (ret) + return ret; us = usb_gstrings_attach(cdev, fn_strings, ARRAY_SIZE(strings_fn)); if (IS_ERR(us)) -- 1.9.1