All of lore.kernel.org
 help / color / mirror / Atom feed
From: Babanpreet Singh <bbnpreetsingh@gmail.com>
To: Jonathan Cameron <jic23@kernel.org>
Cc: "Nuno Sá" <nuno.sa@analog.com>,
	"Michael Hennerich" <Michael.Hennerich@analog.com>,
	"David Lechner" <dlechner@baylibre.com>,
	"Andy Shevchenko" <andy@kernel.org>,
	"Angelo Dureghello" <adureghello@baylibre.com>,
	linux@analog.com, linux-iio@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	"Babanpreet Singh" <bbnpreetsingh@gmail.com>,
	"Andy Shevchenko" <andriy.shevchenko@intel.com>
Subject: [PATCH v2] iio: dac: ad3552r-hs: use sysfs_emit_at() in data source avail show
Date: Sat, 18 Jul 2026 04:42:44 +0000	[thread overview]
Message-ID: <20260718044244.7-1-bbnpreetsingh@gmail.com> (raw)

ad3552r_hs_show_data_source_avail() formats the available data source
names into a 128-byte stack buffer, but bounds each scnprintf() with
PAGE_SIZE instead of the buffer size, so the bound does not protect
the destination at all.

This cannot overflow today - dbgfs_attr_source[] has two entries,
"normal" and "ramp-16bit", 18 bytes formatted - but the bound stops
protecting the stack the day the table grows.

Found by smatch:

  drivers/iio/dac/ad3552r-hs.c:593 ad3552r_hs_show_data_source_avail()
  error: scnprintf() 'buf[len]' too small (128 vs 4096)

Instead of shrinking the scnprintf() bound to the buffer size, switch
to sysfs_emit_at(), which enforces the PAGE_SIZE bound internally and
is the preferred helper for formatting attribute-style output; the IIO
core formats its own avail lists the same way in iio_format_list().
sysfs_emit_at() refuses buffers that are not page-aligned, so replace
the stack buffer with a kzalloc()'d page - power-of-two kmalloc()
allocations are naturally aligned, see
Documentation/core-api/memory-allocation.rst.

Fixes: b1c5d68ea66e ("iio: dac: ad3552r-hs: add support for internal ramp")
Suggested-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Assisted-by: claude-sonnet-5
Signed-off-by: Babanpreet Singh <bbnpreetsingh@gmail.com>
---
v2:
 - Switch to sysfs_emit_at() with a kzalloc()'d page instead of
   bounding scnprintf() with sizeof(buf), as suggested by Andy
   Shevchenko. sysfs_emit_at() requires a page-aligned buffer, so
   the 128-byte stack buffer cannot stay; add the cleanup.h, slab.h
   and sysfs.h includes the new code needs.
 - Retitled; v1 was "iio: dac: ad3552r-hs: fix scnprintf() buffer
   bound in data source show".

v1: https://lore.kernel.org/r/20260717040024.7-1-bbnpreetsingh@gmail.com

 drivers/iio/dac/ad3552r-hs.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/drivers/iio/dac/ad3552r-hs.c b/drivers/iio/dac/ad3552r-hs.c
index 02a124ac4855..c561fed2ef1a 100644
--- a/drivers/iio/dac/ad3552r-hs.c
+++ b/drivers/iio/dac/ad3552r-hs.c
@@ -7,6 +7,7 @@
  */
 
 #include <linux/bitfield.h>
+#include <linux/cleanup.h>
 #include <linux/debugfs.h>
 #include <linux/delay.h>
 #include <linux/gpio/consumer.h>
@@ -14,6 +15,8 @@
 #include <linux/iio/buffer.h>
 #include <linux/platform_device.h>
 #include <linux/property.h>
+#include <linux/slab.h>
+#include <linux/sysfs.h>
 #include <linux/units.h>
 
 #include "ad3552r.h"
@@ -585,14 +588,15 @@ static ssize_t ad3552r_hs_show_data_source_avail(struct file *f,
 						 char __user *userbuf,
 						 size_t count, loff_t *ppos)
 {
-	ssize_t len = 0;
-	char buf[128];
+	char *buf __free(kfree) = kzalloc(PAGE_SIZE, GFP_KERNEL);
+	int len = 0;
 	int i;
 
-	for (i = 0; i < ARRAY_SIZE(dbgfs_attr_source); i++) {
-		len += scnprintf(buf + len, PAGE_SIZE - len, "%s ",
-				 dbgfs_attr_source[i]);
-	}
+	if (!buf)
+		return -ENOMEM;
+
+	for (i = 0; i < ARRAY_SIZE(dbgfs_attr_source); i++)
+		len += sysfs_emit_at(buf, len, "%s ", dbgfs_attr_source[i]);
 	buf[len - 1] = '\n';
 
 	return simple_read_from_buffer(userbuf, count, ppos, buf, len);

base-commit: fce2dfa773ced15f27dd27cd0b482a7473cdcf2a
-- 
2.43.0


             reply	other threads:[~2026-07-18  4:42 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-18  4:42 Babanpreet Singh [this message]
2026-07-18  8:34 ` [PATCH v2] iio: dac: ad3552r-hs: use sysfs_emit_at() in data source avail show Andy Shevchenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260718044244.7-1-bbnpreetsingh@gmail.com \
    --to=bbnpreetsingh@gmail.com \
    --cc=Michael.Hennerich@analog.com \
    --cc=adureghello@baylibre.com \
    --cc=andriy.shevchenko@intel.com \
    --cc=andy@kernel.org \
    --cc=dlechner@baylibre.com \
    --cc=jic23@kernel.org \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@analog.com \
    --cc=nuno.sa@analog.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.