Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp2828473pxv; Mon, 12 Jul 2021 02:58:13 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwRZui2gKAUhBwNxsflZj+8BegSpDbZV204ErxlCBZMYhxS+HiLfZdFmb7wnat3U5JQjaRe X-Received: by 2002:a6b:d109:: with SMTP id l9mr39888755iob.122.1626083893195; Mon, 12 Jul 2021 02:58:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626083893; cv=none; d=google.com; s=arc-20160816; b=Htmj2CcJ97XIZBN4uE5m8OJZVxV/E9eNTUuPfdZwEVlzl/L1/KrwvK1nx8gF0F60Np WuEG/Z24nCayML9NJ3YPB2u/CU5+X7fNUxOULL3XWQhxA0ScxYYyZIRBAv3e4ehFMWgJ 0jtruLNILx2tUGRYyU5neUcVGlX43ZjvjnYQFbhGIQUUC6S5QArmNDWjWhddL5nT3ThH 91nHwJbHKg2DNHW9tTWbli/PXZKw32zHDX0gePVZBWWGPo6LLUB2qQTOS9HV/zM4e6YF 6LJdpERnmQ78YKSdoeYUUHzfZFq3zn7ben34qsNOd0j3PV9YWNFA1cClaRsW5iehN1a2 bvEw== 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=oHfaBqMT4fZHjRQ23ImgdL5swO0QdvFZ3uWIJj4OCvI=; b=p2967CIdaYAwFzGiGkyzQLSPyK+keDZcqXcdmLzCoQM58sSO9N2atL4VZKS406ztUY 2LBTeafol4B5on2HXm0VUMRnztyGUEsUJmpmnAmJdXTy8YPZUolTIXpgbqu3iDgPdWJv Q5yEVKprxIifF6edGIVx/zLFjDlmtpONQMAcRQYUayTSZHySvh+aVokRVvopwwNLRRSw NZw5GJFuSO0vpLznkvJ2KN87TfO0TwkroYYpuxA7H6oRW7aCE5fq4rBZJ6MmZ8fSIiUv GnZaY+Sxc7uPTSsmT7LbSs7mSSw52ATo2mt/7vXwoUbW1/4plAE51q/eL3/vT/1KZBv9 i1Fw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=w+dKWJU+; 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=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 n12si17948612iob.27.2021.07.12.02.58.01; Mon, 12 Jul 2021 02:58:13 -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=@linuxfoundation.org header.s=korg header.b=w+dKWJU+; 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=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242247AbhGLG75 (ORCPT + 99 others); Mon, 12 Jul 2021 02:59:57 -0400 Received: from mail.kernel.org ([198.145.29.99]:38480 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235973AbhGLGmi (ORCPT ); Mon, 12 Jul 2021 02:42:38 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id EFECF610CD; Mon, 12 Jul 2021 06:39:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626071946; bh=rNG5DcWA9KDHMgAglAzkWJWc5snz95lOb8j/k4helOw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=w+dKWJU+Gs7Jd1Bsjkm4lVoUCgR83i+pVkX67l925QUqid5zBf+4gqM2qFrJGG1a/ v5Mcyl0cwgzz4XbkuMFiTflFwSQFhRaxCKJTIzj635mWKEpHvAJo+A86J17S3Sf4Oc LtAiY3Z9NiGADBuu5ojhgY3MjVCJFck9DTey/IW4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Nathan Chancellor , Kees Cook , "Rafael J. Wysocki" , Sasha Levin Subject: [PATCH 5.10 286/593] ACPI: bgrt: Fix CFI violation Date: Mon, 12 Jul 2021 08:07:26 +0200 Message-Id: <20210712060915.748643252@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210712060843.180606720@linuxfoundation.org> References: <20210712060843.180606720@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: Nathan Chancellor [ Upstream commit f37ccf8fce155d08ae2a4fb3db677911ced0c21a ] clang's Control Flow Integrity requires that every indirect call has a valid target, which is based on the type of the function pointer. The *_show() functions in this file are written as if they will be called from dev_attr_show(); however, they will be called from sysfs_kf_seq_show() because the files were created by sysfs_create_group() and the sysfs ops are based on kobj_sysfs_ops because of kobject_add_and_create(). Because the *_show() functions do not match the type of the show() member in struct kobj_attribute, there is a CFI violation. $ cat /sys/firmware/acpi/bgrt/{status,type,version,{x,y}offset}} 1 0 1 522 307 $ dmesg | grep "CFI failure" [ 267.761825] CFI failure (target: type_show.d5e1ad21498a5fd14edbc5c320906598.cfi_jt+0x0/0x8): [ 267.762246] CFI failure (target: xoffset_show.d5e1ad21498a5fd14edbc5c320906598.cfi_jt+0x0/0x8): [ 267.762584] CFI failure (target: status_show.d5e1ad21498a5fd14edbc5c320906598.cfi_jt+0x0/0x8): [ 267.762973] CFI failure (target: yoffset_show.d5e1ad21498a5fd14edbc5c320906598.cfi_jt+0x0/0x8): [ 267.763330] CFI failure (target: version_show.d5e1ad21498a5fd14edbc5c320906598.cfi_jt+0x0/0x8): Convert these functions to the type of the show() member in struct kobj_attribute so that there is no more CFI violation. Because these functions are all so similar, combine them into a macro. Fixes: d1ff4b1cdbab ("ACPI: Add support for exposing BGRT data") Link: https://github.com/ClangBuiltLinux/linux/issues/1406 Signed-off-by: Nathan Chancellor Reviewed-by: Kees Cook Signed-off-by: Rafael J. Wysocki Signed-off-by: Sasha Levin --- drivers/acpi/bgrt.c | 57 ++++++++++++++------------------------------- 1 file changed, 18 insertions(+), 39 deletions(-) diff --git a/drivers/acpi/bgrt.c b/drivers/acpi/bgrt.c index 19bb7f870204..e0d14017706e 100644 --- a/drivers/acpi/bgrt.c +++ b/drivers/acpi/bgrt.c @@ -15,40 +15,19 @@ static void *bgrt_image; static struct kobject *bgrt_kobj; -static ssize_t version_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return snprintf(buf, PAGE_SIZE, "%d\n", bgrt_tab.version); -} -static DEVICE_ATTR_RO(version); - -static ssize_t status_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return snprintf(buf, PAGE_SIZE, "%d\n", bgrt_tab.status); -} -static DEVICE_ATTR_RO(status); - -static ssize_t type_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return snprintf(buf, PAGE_SIZE, "%d\n", bgrt_tab.image_type); -} -static DEVICE_ATTR_RO(type); - -static ssize_t xoffset_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return snprintf(buf, PAGE_SIZE, "%d\n", bgrt_tab.image_offset_x); -} -static DEVICE_ATTR_RO(xoffset); - -static ssize_t yoffset_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return snprintf(buf, PAGE_SIZE, "%d\n", bgrt_tab.image_offset_y); -} -static DEVICE_ATTR_RO(yoffset); +#define BGRT_SHOW(_name, _member) \ + static ssize_t _name##_show(struct kobject *kobj, \ + struct kobj_attribute *attr, char *buf) \ + { \ + return snprintf(buf, PAGE_SIZE, "%d\n", bgrt_tab._member); \ + } \ + struct kobj_attribute bgrt_attr_##_name = __ATTR_RO(_name) + +BGRT_SHOW(version, version); +BGRT_SHOW(status, status); +BGRT_SHOW(type, image_type); +BGRT_SHOW(xoffset, image_offset_x); +BGRT_SHOW(yoffset, image_offset_y); static ssize_t image_read(struct file *file, struct kobject *kobj, struct bin_attribute *attr, char *buf, loff_t off, size_t count) @@ -60,11 +39,11 @@ static ssize_t image_read(struct file *file, struct kobject *kobj, static BIN_ATTR_RO(image, 0); /* size gets filled in later */ static struct attribute *bgrt_attributes[] = { - &dev_attr_version.attr, - &dev_attr_status.attr, - &dev_attr_type.attr, - &dev_attr_xoffset.attr, - &dev_attr_yoffset.attr, + &bgrt_attr_version.attr, + &bgrt_attr_status.attr, + &bgrt_attr_type.attr, + &bgrt_attr_xoffset.attr, + &bgrt_attr_yoffset.attr, NULL, }; -- 2.30.2