Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp9098539pxu; Mon, 28 Dec 2020 06:36:10 -0800 (PST) X-Google-Smtp-Source: ABdhPJxnj1zr2X++DcXt6o2msUUS8u/R82p4LC462WXZOmLV/BKcdYs2Eiv+pnoRNDkF/K44K3bu X-Received: by 2002:a17:907:20b5:: with SMTP id pw21mr43463011ejb.494.1609166170575; Mon, 28 Dec 2020 06:36:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609166170; cv=none; d=google.com; s=arc-20160816; b=KTsG01eCohejeW1vTbhosDTcaMOopLbNY3rRAY/w6vEjMRMXzTvcq61nMNAS6coIzH +0/lYRKkYy+zVSY1ZGKkaLx5pJiBFvgKorHoKzZ+eRvNrKH5e9J0yqcHQSUSuRuztNu5 UyGAne0DjOkYW6ZUDWRoXhLw0bENknOA/Pe7Rriz/mZnhkIM3nPzz47hqgDlUWLglKLw KEeQGjb9g+zzlDZnS2I6Bjnexh0OIzXFWWp1hEuujq7oP9Z/3IcivPVMxsHGa0oZy1CG ql4JbEmb7T5ZyFtRraodqlmUretuf2uwm+FMXQJJ+8PgJRkxnY2HmnNaU7bhgl/XUhp7 M7SQ== 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=2y5CINNSZX7o4sNy3jtW14+z9OV1noag7V1wrXnOeF8=; b=T7dx1qe0vrDTQnHyLXkD9TP7id2lPM1tdsWGuBsW9v8bUJn9GVlivQaWma/8puEC6U 8CjvVIijjyepKdtPXbmTpAUs03zHmyN1AmfQy0GFCHU8i/k5AjtUYM6xjwvagYmzYk5P 9JyWcVDGJ/rebXp1b0+UdGUj1nQOZsevV47609qlNTW9KTiwChmUu39Nnqdx1x17RSjr E08v/1Xzz3pSIbMM9B/HpJXAUuB7VbVdzPHrmyCNO+9bRVjClxIe4fBmymMuq/gw5yyU f2D/TQqNFLb5SfPhf8ZJOAz42CmvlvxrW8g1pnd+H/Fzu7ZdiglKD5Tr0bthoOyQ9nj6 9bMw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="UGPU/t6A"; 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 j24si14218705ejx.278.2020.12.28.06.35.47; Mon, 28 Dec 2020 06:36:10 -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=@linuxfoundation.org header.s=korg header.b="UGPU/t6A"; 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 S2505089AbgL1Odr (ORCPT + 99 others); Mon, 28 Dec 2020 09:33:47 -0500 Received: from mail.kernel.org ([198.145.29.99]:41132 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2504944AbgL1OdQ (ORCPT ); Mon, 28 Dec 2020 09:33:16 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 3C45E221F0; Mon, 28 Dec 2020 14:32:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1609165955; bh=LpshotZFNW0JsA3g9lmgb7EiGJIc7DHNz7kMQTVFhOg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UGPU/t6AF5doLFj4bYoO//7j69U+UqfkXMwGdLnu5mT9N2ndZqSCHl7LOu4mJsxPC BAqhoDCIeY7Z8Z7lhVongYJ91iTtNF+LomabC7O7W4rSK89S+sAWGdokLM94sW3KiZ Y8JJ19uWYU6DtTWnmO3E1eGtQN0NQUNrvicMDUI8= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Lars-Peter Clausen , Jonathan Cameron , Alexandru Ardelean , Dan Murphy , Stable@vger.kernel.org Subject: [PATCH 5.10 684/717] iio:adc:ti-ads124s08: Fix alignment and data leak issues. Date: Mon, 28 Dec 2020 13:51:22 +0100 Message-Id: <20201228125053.753772212@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201228125020.963311703@linuxfoundation.org> References: <20201228125020.963311703@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: Jonathan Cameron commit 1e405bc2512f80a903ddd6ba8740cee885238d7f upstream. One of a class of bugs pointed out by Lars in a recent review. iio_push_to_buffers_with_timestamp() assumes the buffer used is aligned to the size of the timestamp (8 bytes). This is not guaranteed in this driver which uses an array of smaller elements on the stack. As Lars also noted this anti pattern can involve a leak of data to userspace and that indeed can happen here. We close both issues by moving to a suitable structure in the iio_priv() data with alignment explicitly requested. This data is allocated with kzalloc() so no data can leak apart from previous readings. In this driver the timestamp can end up in various different locations depending on what other channels are enabled. As a result, we don't use a structure to specify it's position as that would be misleading. Fixes: e717f8c6dfec ("iio: adc: Add the TI ads124s08 ADC code") Reported-by: Lars-Peter Clausen Signed-off-by: Jonathan Cameron Reviewed-by: Alexandru Ardelean Cc: Dan Murphy Cc: Link: https://lore.kernel.org/r/20200920112742.170751-9-jic23@kernel.org Signed-off-by: Greg Kroah-Hartman --- drivers/iio/adc/ti-ads124s08.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) --- a/drivers/iio/adc/ti-ads124s08.c +++ b/drivers/iio/adc/ti-ads124s08.c @@ -99,6 +99,14 @@ struct ads124s_private { struct gpio_desc *reset_gpio; struct spi_device *spi; struct mutex lock; + /* + * Used to correctly align data. + * Ensure timestamp is naturally aligned. + * Note that the full buffer length may not be needed if not + * all channels are enabled, as long as the alignment of the + * timestamp is maintained. + */ + u32 buffer[ADS124S08_MAX_CHANNELS + sizeof(s64)/sizeof(u32)] __aligned(8); u8 data[5] ____cacheline_aligned; }; @@ -269,7 +277,6 @@ static irqreturn_t ads124s_trigger_handl struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct ads124s_private *priv = iio_priv(indio_dev); - u32 buffer[ADS124S08_MAX_CHANNELS + sizeof(s64)/sizeof(u32)]; int scan_index, j = 0; int ret; @@ -284,7 +291,7 @@ static irqreturn_t ads124s_trigger_handl if (ret) dev_err(&priv->spi->dev, "Start ADC conversions failed\n"); - buffer[j] = ads124s_read(indio_dev, scan_index); + priv->buffer[j] = ads124s_read(indio_dev, scan_index); ret = ads124s_write_cmd(indio_dev, ADS124S08_STOP_CONV); if (ret) dev_err(&priv->spi->dev, "Stop ADC conversions failed\n"); @@ -292,7 +299,7 @@ static irqreturn_t ads124s_trigger_handl j++; } - iio_push_to_buffers_with_timestamp(indio_dev, buffer, + iio_push_to_buffers_with_timestamp(indio_dev, priv->buffer, pf->timestamp); iio_trigger_notify_done(indio_dev->trig);