Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp336952pxx; Wed, 28 Oct 2020 06:12:09 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzqUW8Le24lhvTxwrnQCUymG3UKtDfDS5nT3JKAeKTpatDAXh5zN8r+EuX2YJU5EA34t7qN X-Received: by 2002:a19:40cd:: with SMTP id n196mr2536641lfa.446.1603890728921; Wed, 28 Oct 2020 06:12:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603890728; cv=none; d=google.com; s=arc-20160816; b=X/wppFa8Jgqdbl/OZvdEcmgjp8cM3JSN96RCp80FcisOA5GYRPkMDxZ4SK0mSj/E+K Ok+CXra4dojjQQuu/YsawyVgDeu71dzywBnhb4OtmTM5UFUXVaN5MfxyrbYkVIz6CS5P F+eopoQh3ttaJenjm2/3YAV78Pt4XWzxJpqxC5mFx/8ShtESsxmWGt4Wtg2ozBTLZdRm NYNiN7/utrFP/3AYKkbWgx/qrG8nOUpyyadiDqggfBEfk4b4Weh1gSD8kWQ8zlNE8oQu 1BTQVs/f+2VShhEUSbcMuesUcZEDxTsqm/VSLSCzHOvdvgc7urT5UxpWm1oMjdoHFy3s uDuQ== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=2WK5RJCcF76kRiiyB8fdaC+VCYCllW8BiK+iWF38tRE=; b=QPm96/6wHDdsg3iCFR4snQXw2tZWduFITRD0TVRqxCel2aTBm38RdL9hYJh8bVvWtr h2Ug1rxyA7hjrdVgjk7256/7ZfbihZFstIrz9A9HCsNQo8UNHplfppGqBgwII83o7fmU BDps190y0y+4xEsu1wqFUxogWoBiJwQilM1jL8aESNMoaxkcn6KDcFZIxi3QZbkwjeMI 2ITGyiIvEjc7eCclTV6jgVF6m1rio8Dj2h29D24k+JmjPDBCurPBEzyqt77aLZX/TIZQ jVgtKMR1kHZZ2mzYYHGlZjrIVKoIBTtgltcmt7sqM5uVt1/qzw1/ddemL6fEjFaeXHw7 V8zw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=1gYPOd3Y; 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=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id p90si2749641edd.284.2020.10.28.06.11.43; Wed, 28 Oct 2020 06:12:08 -0700 (PDT) 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=@kernel.org header.s=default header.b=1gYPOd3Y; 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=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1800145AbgJ0PfK (ORCPT + 99 others); Tue, 27 Oct 2020 11:35:10 -0400 Received: from mail.kernel.org ([198.145.29.99]:47198 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1799235AbgJ0Pa3 (ORCPT ); Tue, 27 Oct 2020 11:30:29 -0400 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id C09D422264; Tue, 27 Oct 2020 15:30:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1603812628; bh=AIxofYzRJxltUlJ4fmWkUr0YBOTkJFgftejeF3Ie04E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=1gYPOd3Yvf8IZf0mW2P3ciiqNSTE2t1foQmYgwdEyLI+aS5kkV6G8Q2Cj1JSKuNSc WsKEPDDVTueAgU3Vi+ANoQXOlNyx9ha8Z/fqnI7hKQ6E221VEtO8gadBZIHvk2BqWd MfyTkckVf1TqrXP2n0di8uG608TcBOst3QKQ9JUo= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Dan Carpenter , Jiri Kosina , Sasha Levin Subject: [PATCH 5.9 245/757] HID: roccat: add bounds checking in kone_sysfs_write_settings() Date: Tue, 27 Oct 2020 14:48:15 +0100 Message-Id: <20201027135502.078667614@linuxfoundation.org> X-Mailer: git-send-email 2.29.1 In-Reply-To: <20201027135450.497324313@linuxfoundation.org> References: <20201027135450.497324313@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Dan Carpenter [ Upstream commit d4f98dbfe717490e771b6e701904bfcf4b4557f0 ] This code doesn't check if "settings->startup_profile" is within bounds and that could result in an out of bounds array access. What the code does do is it checks if the settings can be written to the firmware, so it's possible that the firmware has a bounds check? It's safer and easier to verify when the bounds checking is done in the kernel. Fixes: 14bf62cde794 ("HID: add driver for Roccat Kone gaming mouse") Signed-off-by: Dan Carpenter Signed-off-by: Jiri Kosina Signed-off-by: Sasha Levin --- drivers/hid/hid-roccat-kone.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/drivers/hid/hid-roccat-kone.c b/drivers/hid/hid-roccat-kone.c index 2ff4c8e366ff2..1ca64481145ee 100644 --- a/drivers/hid/hid-roccat-kone.c +++ b/drivers/hid/hid-roccat-kone.c @@ -294,31 +294,40 @@ static ssize_t kone_sysfs_write_settings(struct file *fp, struct kobject *kobj, struct kone_device *kone = hid_get_drvdata(dev_get_drvdata(dev)); struct usb_device *usb_dev = interface_to_usbdev(to_usb_interface(dev)); int retval = 0, difference, old_profile; + struct kone_settings *settings = (struct kone_settings *)buf; /* I need to get my data in one piece */ if (off != 0 || count != sizeof(struct kone_settings)) return -EINVAL; mutex_lock(&kone->kone_lock); - difference = memcmp(buf, &kone->settings, sizeof(struct kone_settings)); + difference = memcmp(settings, &kone->settings, + sizeof(struct kone_settings)); if (difference) { - retval = kone_set_settings(usb_dev, - (struct kone_settings const *)buf); - if (retval) { - mutex_unlock(&kone->kone_lock); - return retval; + if (settings->startup_profile < 1 || + settings->startup_profile > 5) { + retval = -EINVAL; + goto unlock; } + retval = kone_set_settings(usb_dev, settings); + if (retval) + goto unlock; + old_profile = kone->settings.startup_profile; - memcpy(&kone->settings, buf, sizeof(struct kone_settings)); + memcpy(&kone->settings, settings, sizeof(struct kone_settings)); kone_profile_activated(kone, kone->settings.startup_profile); if (kone->settings.startup_profile != old_profile) kone_profile_report(kone, kone->settings.startup_profile); } +unlock: mutex_unlock(&kone->kone_lock); + if (retval) + return retval; + return sizeof(struct kone_settings); } static BIN_ATTR(settings, 0660, kone_sysfs_read_settings, -- 2.25.1