Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp169256pxx; Wed, 28 Oct 2020 01:26:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzfYfPGYq51R5cJEAHMO0MbUwYuOhk+VZzdJ1cN3xwHO/CZBgj7Y0m1ZPqPIPsKPa5NHL/E X-Received: by 2002:a17:906:d285:: with SMTP id ay5mr2687575ejb.84.1603873600389; Wed, 28 Oct 2020 01:26:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603873600; cv=none; d=google.com; s=arc-20160816; b=DpbwrBSPDs1CCwFKLxeqHjmgtO7Sb9i894DZrf0SuTEoeveXbFa2Ag9E2TsPF20VUd yeI6IQsLADbXlYJuE0NyYRYp3lwD/bigZ6kboheJw9RWgbE2cQuuAVQkLslXrsrqKPZD 65ncAF5Y6I1FTOF9R+5puAiRb32yaiUzpJCyYxCoOzNBTsRJJHY/ERcygr5JbQPptSPT dgHeyUbF6zo+vcM52AsAqjRigT2GSzru+kiUYV0KEWKSCYF1z1jePTtHiVSOWsOIkgBZ tkf0tKLr9ghW8nqCSPyYvPBLkG7YnaP7O2mP8Tk4rNduoaa+6wIEc5elqlA9RiaU5bMr o/ZA== 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=xITxRmrYz780zBXetFNQ5gF8CTKWp6cfJpNM5gle9OA=; b=IeKek1EOLmWy/MCLcl4u4N6Oe3BySP+RVwlVdoLfhXFHCk3JGxi7reAkGu6sKXahfF pYiMTwJUMBrXDgMZSV7l6QzoE8OdLuzaJFkKoMso5tvPPAMccnS8pK5l1y98vtG7P2im mpv/MSVRLPZjBz33hVEJRatsuA7AyiTDhhcGHcYF9xshu0zMCGdfk0ktSMbr+ituNkQL 3FSAaWf+WqMTLtoRc/N8sg3THGfSSqjffUT1eOPpE5dbr3NsxsJv3w71b9Ij4N491Bwv bDbdJF1pzZiwRH6Z680+Nh7PIKb3bhTtAEpIFbFPZgEBz6jCyl0VPmy0I3wMeF/zIb36 atJQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=M5ix6CtI; 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 x26si2664388eds.99.2020.10.28.01.26.18; Wed, 28 Oct 2020 01:26:40 -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=M5ix6CtI; 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 S1754007AbgJ0ODe (ORCPT + 99 others); Tue, 27 Oct 2020 10:03:34 -0400 Received: from mail.kernel.org ([198.145.29.99]:51636 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753988AbgJ0OD1 (ORCPT ); Tue, 27 Oct 2020 10:03:27 -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 D736622282; Tue, 27 Oct 2020 14:03:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1603807406; bh=hVObMkP4w4Evwr+FFTtiTi63sgwcJ8Cg+PrCq/AqQto=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=M5ix6CtIR4wkCH9SQg6c/cVSENL85HFcw3JjrdOKLcpP3zonXABhe85MiU5vVD6id SAAXuJmeo2UKaewjCMFkThmT1mewLrYl9Pjr3eat4WzaTMMyOYJ4FphNhKcvawX2IO kSRLbI5PtoRHlB4vG4G7PAHZhdLtO3kERxYgY3t0= 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 4.9 042/139] HID: roccat: add bounds checking in kone_sysfs_write_settings() Date: Tue, 27 Oct 2020 14:48:56 +0100 Message-Id: <20201027134904.135831573@linuxfoundation.org> X-Mailer: git-send-email 2.29.1 In-Reply-To: <20201027134902.130312227@linuxfoundation.org> References: <20201027134902.130312227@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 bf4675a273965..9be8c31f613fd 100644 --- a/drivers/hid/hid-roccat-kone.c +++ b/drivers/hid/hid-roccat-kone.c @@ -297,31 +297,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