From patchwork Mon Dec 28 12:51:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg KH X-Patchwork-Id: 352717 Delivered-To: patch@linaro.org Received: by 2002:a02:85a7:0:0:0:0:0 with SMTP id d36csp9829225jai; Mon, 28 Dec 2020 07:27:08 -0800 (PST) X-Google-Smtp-Source: ABdhPJykRko2in8YN8JuGqPoNQ8LJdmsSQ3IQU6FDN+Fmtp5bINcWSigfvBreD1eZJzc+IvODWO+ X-Received: by 2002:aa7:c652:: with SMTP id z18mr41093674edr.60.1609169228349; Mon, 28 Dec 2020 07:27:08 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609169228; cv=none; d=google.com; s=arc-20160816; b=JXo9eb32UBD27CCj3M+VOEC+GqKZzgV3QEmUyjv3RwTA4iwcuRXGnzv015jM5mdr92 dv8r2Ma6IumLdxioZUo/l0Pg7XINCb1RuSJM6hqbOzA/GZedxMFVCbm7JzBpC8r/vZo3 jNcvEq4QlbwlkfcFsurWmyb7nujLKUyYsezjobLFvCbVW45x6909+BM/4aNS3g/hSdIQ PDyQ12EVtsrpsoZ9kEO0m+EV4BqvT5JunyCkcGESFq0Uw2eX6QxjAY9FHZ3xONOKmT3L CkGj+qb7M3zsqIIlGuXBVUK5gmX1ayZ7KerhiE+NWjBaPP4+Q2fyVR1S9fuLbHoYi42U Ib4w== 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=9FaWt3NUxjMmSXzwa7Mu1U4lPVfiycS2y69yRxnNHW0=; b=WIHfAwW+CcwN2Ri47zXsJCrZhqfBuvIcONY72cAIXz/gHSy63SVOa2rXC0z7K5Z72+ YBZvfxBQqVgDYOC+ChR+aVPF0qH666o3pIA1LOOlJFnnjzUq2kktl5U8c87gesyg8nz+ wJp2elkFxSpo6JYUt5uO6l3Oc3E3v3L/LqMUmTJvC69PRFZWH0OLB7Mfln6c2bcu4Jg3 nBIb1TfZfH/LDT+uJyN0Orm7gn6piIaHNCx7zVmUr4JlxdwYR1iWup0FAYZPmbwAZnW5 iMaFGs4trXFPv6OVf1kKqGJ/RV/aNFAf8UkW8fIIBz+ba1I5SL7at6bfRHOCGc87EfTw vSXw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=mQUMSdnh; 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 q11si20313189edn.225.2020.12.28.07.27.08; Mon, 28 Dec 2020 07:27:08 -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=mQUMSdnh; 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 S2405352AbgL1N56 (ORCPT + 14 others); Mon, 28 Dec 2020 08:57:58 -0500 Received: from mail.kernel.org ([198.145.29.99]:59100 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2405112AbgL1N55 (ORCPT ); Mon, 28 Dec 2020 08:57:57 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id A960722B49; Mon, 28 Dec 2020 13:57:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1609163862; bh=98X/jcCRH0yQuqv6py0Piexc/IZcMKBVJxzrDjazN7E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mQUMSdnh10fcSFmdXvW5NF1hX/fNGW1g5hvd9G0GuXzf6Kfa7UMVS6xR7DIUjF9rt 0acQh6yMGTOnLdjY6wOrXEjzn3vIoMztvGogIpGiGzwdvT53isMe5vBWCj/PhKZnwe cvS6UnBtViD/eKO8EI+LQBywHjyQ6NN5tlTdwWK4= 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.4 433/453] iio:adc:ti-ads124s08: Fix alignment and data leak issues. Date: Mon, 28 Dec 2020 13:51:09 +0100 Message-Id: <20201228124958.063703304@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201228124937.240114599@linuxfoundation.org> References: <20201228124937.240114599@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 @@ -97,6 +97,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; }; @@ -270,7 +278,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; @@ -285,7 +292,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"); @@ -293,7 +300,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);