mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] firewire: Fix out-of-bounds access in CSR iterator
@ 2026-11-02  6:53 Sreeraj S Kurup
  2026-11-03  4:24 ` Takashi Sakamoto
  0 siblings, 1 reply; 5+ messages in thread
From: Sreeraj S Kurup @ 2026-11-02  6:53 UTC (permalink / raw)
  To: o-takashi; +Cc: linux1394-devel, linux-kernel, Sreeraj S Kurup

The fw_csr_iterator_next() function reads ci->p before
checking if it has reached the end.

This can cause an out-of-bounds read when the iterator
has no more entries.

Check the iterator position before reading the entry.
Move the pointer forward only after reading a valid entry.

Signed-off-by: Sreeraj S Kurup <sreekuttan2156239@gmail.com>
---
 drivers/firewire/core-device.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c
index a68100d3da0b..36667841ca3c 100644
--- a/drivers/firewire/core-device.c
+++ b/drivers/firewire/core-device.c
@@ -40,10 +40,14 @@ EXPORT_SYMBOL(fw_csr_iterator_init);
 
 int fw_csr_iterator_next(struct fw_csr_iterator *ci, int *key, int *value)
 {
+	if (ci->p >= ci->end)
+		return 0;
+
 	*key = *ci->p >> 24;
 	*value = *ci->p & 0xffffff;
 
-	return ci->p++ < ci->end;
+	ci->p++;
+	return 1;
 }
 EXPORT_SYMBOL(fw_csr_iterator_next);
 
-- 
2.55.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] firewire: Fix out-of-bounds access in CSR iterator
  2026-11-02  6:53 [PATCH] firewire: Fix out-of-bounds access in CSR iterator Sreeraj S Kurup
@ 2026-11-03  4:24 ` Takashi Sakamoto
  2026-11-03 15:14   ` [PATCH v2 0/2] " Sreeraj S Kurup
  0 siblings, 1 reply; 5+ messages in thread
From: Takashi Sakamoto @ 2026-11-03  4:24 UTC (permalink / raw)
  To: Sreeraj S Kurup; +Cc: linux1394-devel, linux-kernel

Hi,

Thank you for proposing this fix, however I have mixed feelings about
apply it, since the iterator is designed to traverse the cache data of the
actual configuration ROM, which has been generated by the parser.

If the configuration ROM contains any malformed entries, they should
already be detected by the parser. Therefore I don't think robustness of
the iterator is a critical concern in this case.

For the v7.4 kernel, I've merged KUnit tests for the parser
implementation. If you are still interested in discussion about this fix,
please check them at first then try to add tests specific to the iterator
itself.

On Mon, Nov 02, 2026 at 06:53:34AM +0000, Sreeraj S Kurup wrote:
> The fw_csr_iterator_next() function reads ci->p before
> checking if it has reached the end.
> 
> This can cause an out-of-bounds read when the iterator
> has no more entries.
> 
> Check the iterator position before reading the entry.
> Move the pointer forward only after reading a valid entry.
> 
> Signed-off-by: Sreeraj S Kurup <sreekuttan2156239@gmail.com>
> ---
>  drivers/firewire/core-device.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c
> index a68100d3da0b..36667841ca3c 100644
> --- a/drivers/firewire/core-device.c
> +++ b/drivers/firewire/core-device.c
> @@ -40,10 +40,14 @@ EXPORT_SYMBOL(fw_csr_iterator_init);
>  
>  int fw_csr_iterator_next(struct fw_csr_iterator *ci, int *key, int *value)
>  {
> +	if (ci->p >= ci->end)
> +		return 0;
> +
>  	*key = *ci->p >> 24;
>  	*value = *ci->p & 0xffffff;
>  
> -	return ci->p++ < ci->end;
> +	ci->p++;
> +	return 1;
>  }
>  EXPORT_SYMBOL(fw_csr_iterator_next);
>  
> -- 
> 2.55.0


Thanks

Takashi Sakamoto

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 0/2] firewire: Fix out-of-bounds access in CSR iterator
  2026-11-03  4:24 ` Takashi Sakamoto
@ 2026-11-03 15:14   ` Sreeraj S Kurup
  2026-11-03 15:14     ` [PATCH v2 1/2] " Sreeraj S Kurup
  2026-11-03 15:14     ` [PATCH v2 2/2] firewire: Add KUnit tests for " Sreeraj S Kurup
  0 siblings, 2 replies; 5+ messages in thread
From: Sreeraj S Kurup @ 2026-11-03 15:14 UTC (permalink / raw)
  To: o-takashi; +Cc: linux-kernel, linux1394-devel, sreekuttan2156239

Hi Takashi,

This series fixes an out-of-bounds read in fw_csr_iterator_next() and
adds KUnit tests for the CSR iterator.

The first patch fixes the iterator by checking its position before
dereferencing the current entry.

The second patch adds a separate KUnit test suite covering:

- Iteration over valid entries.
- Calling the iterator after reaching the end.
- Iteration over an empty directory.

It also adds a separate Kconfig option for the iterator tests.

Testing:

- Ran the FireWire KUnit tests using:
  python3 tools/testing/kunit/kunit.py run
  --kunitconfig=drivers/firewire/.kunitconfig

- All tests passed.

- Results:
  [14:47:14] ======== firewire-config-rom-iterator (3 subtests) =========
  [14:47:14] [PASSED] test_csr_iterator_with_valid_entries
  [14:47:14] [PASSED] test_csr_iterator_at_end
  [14:47:14] [PASSED] test_csr_iterator_empty_directory
  [14:47:14] ========== [PASSED] firewire-config-rom-iterator ===========

Please review the patches.

Regards,
Sreeraj

Sreeraj S Kurup (2):
  firewire: Fix out-of-bounds access in CSR iterator
  firewire: Add KUnit tests for CSR iterator

 drivers/firewire/.kunitconfig               |  1 +
 drivers/firewire/Kconfig                    | 12 +++
 drivers/firewire/config-rom-iterator-test.c | 93 +++++++++++++++++++++
 drivers/firewire/core-device.c              | 10 ++-
 4 files changed, 115 insertions(+), 1 deletion(-)
 create mode 100644 drivers/firewire/config-rom-iterator-test.c

-- 
2.55.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 1/2] firewire: Fix out-of-bounds access in CSR iterator
  2026-11-03 15:14   ` [PATCH v2 0/2] " Sreeraj S Kurup
@ 2026-11-03 15:14     ` Sreeraj S Kurup
  2026-11-03 15:14     ` [PATCH v2 2/2] firewire: Add KUnit tests for " Sreeraj S Kurup
  1 sibling, 0 replies; 5+ messages in thread
From: Sreeraj S Kurup @ 2026-11-03 15:14 UTC (permalink / raw)
  To: o-takashi; +Cc: linux-kernel, linux1394-devel, sreekuttan2156239

The fw_csr_iterator_next() function reads ci->p before
checking if it has reached the end.

This can cause an out-of-bounds read when the iterator
has no more entries.

Check the iterator position before reading the entry.
Move the pointer forward only after reading a valid entry.

Signed-off-by: Sreeraj S Kurup <sreekuttan2156239@gmail.com>
---
 drivers/firewire/core-device.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c
index a68100d3da0b..36667841ca3c 100644
--- a/drivers/firewire/core-device.c
+++ b/drivers/firewire/core-device.c
@@ -40,10 +40,14 @@ EXPORT_SYMBOL(fw_csr_iterator_init);
 
 int fw_csr_iterator_next(struct fw_csr_iterator *ci, int *key, int *value)
 {
+	if (ci->p >= ci->end)
+		return 0;
+
 	*key = *ci->p >> 24;
 	*value = *ci->p & 0xffffff;
 
-	return ci->p++ < ci->end;
+	ci->p++;
+	return 1;
 }
 EXPORT_SYMBOL(fw_csr_iterator_next);
 
-- 
2.55.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 2/2] firewire: Add KUnit tests for CSR iterator
  2026-11-03 15:14   ` [PATCH v2 0/2] " Sreeraj S Kurup
  2026-11-03 15:14     ` [PATCH v2 1/2] " Sreeraj S Kurup
@ 2026-11-03 15:14     ` Sreeraj S Kurup
  1 sibling, 0 replies; 5+ messages in thread
From: Sreeraj S Kurup @ 2026-11-03 15:14 UTC (permalink / raw)
  To: o-takashi; +Cc: linux-kernel, linux1394-devel, sreekuttan2156239

Add a separate KUnit test suite for the CSR iterator.

Test iteration over valid entries, an empty directory,
and calling the iterator after reaching the end.

Add a separate Kconfig option to enable the iterator tests
and update the KUnit configuration.

Signed-off-by: Sreeraj S Kurup <sreekuttan2156239@gmail.com>
---
 drivers/firewire/.kunitconfig               |  1 +
 drivers/firewire/Kconfig                    | 12 +++
 drivers/firewire/config-rom-iterator-test.c | 93 +++++++++++++++++++++
 drivers/firewire/core-device.c              |  4 +
 4 files changed, 110 insertions(+)
 create mode 100644 drivers/firewire/config-rom-iterator-test.c

diff --git a/drivers/firewire/.kunitconfig b/drivers/firewire/.kunitconfig
index ee9129081cef..e36dd34fd344 100644
--- a/drivers/firewire/.kunitconfig
+++ b/drivers/firewire/.kunitconfig
@@ -8,3 +8,4 @@ CONFIG_FIREWIRE_KUNIT_SELF_ID_SEQUENCE_HELPER_TEST=y
 CONFIG_FIREWIRE_KUNIT_OHCI_SERDES_TEST=y
 CONFIG_FIREWIRE_KUNIT_NODE_TREE_TEST=y
 CONFIG_FIREWIRE_KUNIT_CONFIG_ROM_PARSER_AND_GENERATOR_TEST=y
+CONFIG_FIREWIRE_KUNIT_CONFIG_ROM_ITERATOR_TEST=y
diff --git a/drivers/firewire/Kconfig b/drivers/firewire/Kconfig
index 7e1d4b2c440b..e67c2524c799 100644
--- a/drivers/firewire/Kconfig
+++ b/drivers/firewire/Kconfig
@@ -112,6 +112,18 @@ config FIREWIRE_KUNIT_CONFIG_ROM_PARSER_AND_GENERATOR_TEST
 	  For more information on KUnit and unit tests in general, refer
 	  to the KUnit documentation in Documentation/dev-tools/kunit/.
 
+config FIREWIRE_KUNIT_CONFIG_ROM_ITERATOR_TEST
+	tristate "KUnit tests for config ROM iterator" if !KUNIT_ALL_TESTS
+	depends on FIREWIRE && KUNIT
+	default KUNIT_ALL_TESTS
+	help
+	  This builds KUnit tests for the configuration ROM iterator used
+          by the FireWire subsystem.
+
+	  The tests check iteration over valid entries, handling empty
+	  directories, and calls to the iterator after reaching the end of
+          a directory
+
 config FIREWIRE_OHCI
 	tristate "OHCI-1394 controllers"
 	depends on PCI && FIREWIRE
diff --git a/drivers/firewire/config-rom-iterator-test.c b/drivers/firewire/config-rom-iterator-test.c
new file mode 100644
index 000000000000..8c846f2f2011
--- /dev/null
+++ b/drivers/firewire/config-rom-iterator-test.c
@@ -0,0 +1,93 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2026 Sreeraj S Kurup
+ *
+ * config-rom-iterator-test.c - KUnit tests for configuration ROM iterator.
+ */
+
+#include <kunit/test.h>
+
+static void test_csr_iterator_with_valid_entries(struct kunit *test)
+{
+	static const u32 directory[] = {
+		0x00020000,	/* Two entries. */
+		0x12001234,
+		0x34005678,
+	};
+	struct fw_csr_iterator ci;
+	int key, value;
+
+	fw_csr_iterator_init(&ci, directory);
+
+	KUNIT_EXPECT_TRUE(test,
+			  fw_csr_iterator_next(&ci, &key, &value));
+	KUNIT_EXPECT_EQ(test, key, 0x12);
+	KUNIT_EXPECT_EQ(test, value, 0x001234);
+
+	KUNIT_EXPECT_TRUE(test,
+			  fw_csr_iterator_next(&ci, &key, &value));
+	KUNIT_EXPECT_EQ(test, key, 0x34);
+	KUNIT_EXPECT_EQ(test, value, 0x005678);
+
+	KUNIT_EXPECT_FALSE(test,
+			   fw_csr_iterator_next(&ci, &key, &value));
+}
+
+static void test_csr_iterator_at_end(struct kunit *test)
+{
+	static const u32 directory[] = {
+		0x00010000,	/* One entry. */
+		0x12001234,
+	};
+	struct fw_csr_iterator ci;
+	int key, value;
+
+	fw_csr_iterator_init(&ci, directory);
+
+	KUNIT_ASSERT_TRUE(test,
+			  fw_csr_iterator_next(&ci, &key, &value));
+
+	KUNIT_EXPECT_EQ(test, key, 0x12);
+	KUNIT_EXPECT_EQ(test, value, 0x001234);
+
+	KUNIT_EXPECT_PTR_EQ(test, ci.p, ci.end);
+
+	/*
+	 * Calling next() after the last entry must not
+	 * advance the iterator beyond its end.
+	 */
+	KUNIT_EXPECT_FALSE(test,
+			   fw_csr_iterator_next(&ci, &key, &value));
+
+	KUNIT_EXPECT_PTR_EQ(test, ci.p, ci.end);
+}
+
+static void test_csr_iterator_empty_directory(struct kunit *test)
+{
+	static const u32 directory[] = {
+		0x00000000,
+	};
+	struct fw_csr_iterator ci;
+	int key, value;
+
+	fw_csr_iterator_init(&ci, directory);
+
+	KUNIT_EXPECT_FALSE(test,
+			   fw_csr_iterator_next(&ci, &key, &value));
+
+	KUNIT_EXPECT_PTR_EQ(test, ci.p, ci.end);
+}
+
+static struct kunit_case csr_iterator_test_cases[] = {
+	KUNIT_CASE(test_csr_iterator_with_valid_entries),
+	KUNIT_CASE(test_csr_iterator_at_end),
+	KUNIT_CASE(test_csr_iterator_empty_directory),
+	{}
+};
+
+static struct kunit_suite csr_iterator_test_suite = {
+	.name = "firewire-config-rom-iterator",
+	.test_cases = csr_iterator_test_cases,
+};
+
+kunit_test_suite(csr_iterator_test_suite);
diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c
index 36667841ca3c..5d5ad4f41ab5 100644
--- a/drivers/firewire/core-device.c
+++ b/drivers/firewire/core-device.c
@@ -1450,3 +1450,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event)
 #ifdef CONFIG_FIREWIRE_KUNIT_CONFIG_ROM_PARSER_AND_GENERATOR_TEST
 #include "config-rom-parser-test.c"
 #endif
+
+#ifdef CONFIG_FIREWIRE_KUNIT_CONFIG_ROM_ITERATOR_TEST
+#include "config-rom-iterator-test.c"
+#endif
-- 
2.55.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-11-03 15:15 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-02  6:53 [PATCH] firewire: Fix out-of-bounds access in CSR iterator Sreeraj S Kurup
2026-11-03  4:24 ` Takashi Sakamoto
2026-11-03 15:14   ` [PATCH v2 0/2] " Sreeraj S Kurup
2026-11-03 15:14     ` [PATCH v2 1/2] " Sreeraj S Kurup
2026-11-03 15:14     ` [PATCH v2 2/2] firewire: Add KUnit tests for " Sreeraj S Kurup

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®