From patchwork Mon Dec 28 12:51:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg KH X-Patchwork-Id: 352674 Delivered-To: patch@linaro.org Received: by 2002:a02:85a7:0:0:0:0:0 with SMTP id d36csp9796112jai; Mon, 28 Dec 2020 06:41:01 -0800 (PST) X-Google-Smtp-Source: ABdhPJx+/27r7qWejETvZRBlOrUX00mXqmf4JCXwCf/8bwLUxtXgl/aaD80s7juZshYDykYeSf+V X-Received: by 2002:a05:6402:46:: with SMTP id f6mr42520466edu.163.1609166461311; Mon, 28 Dec 2020 06:41:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609166461; cv=none; d=google.com; s=arc-20160816; b=zusY7xSUi+lZx7RXPpbkVW+F+24bgbv87rMHvEOxE+tlu89eq85eTQKjWVB3P7pGiE H3zsTXjFeJ/6SayIaQXWysd4PtMMQazfRpOrx5ZFLv3NkL8xAdgN0Yq6WIwOZDXOZvpi 8r3en5vClnXSOiKk/eaCAEtiA/jK5Fte176gCCLstFsCfyliR5BAdAQNd53dxK9xNq3R SoALFnnzDredlllY3vzjTe6urVf17SXvIlQ9H2uKHByTkp48Iu/VpnRDikis+Lcm8+hu od6/xfDSeZ9bch4uEmG1hVSZj+tyT9+hO0LTgk+rmu30eIDUTf40Wwveq4iZrQgG7tG9 uFxQ== 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=LzO2qaIK0pAcR0g23GINKTXcIQqcBIF/WZYOsxuhlKYmhmZQ7paCKljEBLUSvcDa+p nyjJ/W5FQP+BAuAhdLbj84BazJ5HdcdlL3rrZ8fNTemXZ03J9h9bb1glg17BzTOfL7Cv fJRu5ltF5qkjiEqePyqHbhsXYoS5RcK+bVgHlbbza3PAcXPFrUN2wrvULOICixuD2VLb HI78WK071wmWvERdfGgdBjgrj7nJ7IRd9BuLx9OQRskHke5mN+57nNDSsNJkRgvzSpB+ BzJp0LNd6MEE0uorYnAnDBYtqjTFHLPc+XNrAK/ynqT6irlbpkICAemOKDW2ZArgALVr /xQA== 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 stable-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=stable-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 os24si19005124ejb.680.2020.12.28.06.41.01; Mon, 28 Dec 2020 06:41:01 -0800 (PST) Received-SPF: pass (google.com: domain of stable-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 stable-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=stable-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 S2504952AbgL1OdR (ORCPT + 14 others); Mon, 28 Dec 2020 09:33:17 -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 Precedence: bulk List-ID: X-Mailing-List: stable@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);