From be8a68d070e6d7aabc03da9c256f2537e83b2ed3 Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Wed, 17 Jan 2024 13:11:14 +0100 Subject: [PATCH] [PATCH] macro: terminate the temporary VA_ARGS_FOREACH() array with a sentinel MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit So gcc-14 doesn't complain we're out of bounds on the last iteration: [2092/2414] Compiling C object test-macro.p/src_test_test-macro.c.o In file included from ../src/basic/list.h:209, from ../src/basic/log.h:10, from ../src/test/test-macro.c:5: ../src/test/test-macro.c: In function ‘test_FOREACH_VA_ARGS’: ../src/basic/macro.h:395:90: warning: array subscript 1 is outside array bounds of ‘uint8_t[1]’ {aka ‘unsigned char[1]’} [-Warray-bounds=] 395 | ((long)(_current_ - _entries_) < (long)ELEMENTSOF(_entries_)) && ({ entry = *_current_; true; }); \ ../src/basic/macro.h:392:9: note: in expansion of macro ‘_VA_ARGS_FOREACH’ 392 | _VA_ARGS_FOREACH(entry, UNIQ_T(_entries_, UNIQ), UNIQ_T(_current_, UNIQ), ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~ ../src/test/test-macro.c:322:9: note: in expansion of macro ‘VA_ARGS_FOREACH’ 322 | VA_ARGS_FOREACH(u8, 0) { | ^~~~~~~~~~~~~~~ ../src/fundamental/macro-fundamental.h:163:37: note: at offset 1 into object ‘__unique_prefix__entries_181’ of size 1 163 | #define UNIQ_T(x, uniq) CONCATENATE(__unique_prefix_, CONCATENATE(x, uniq)) | ^~~~~~~~~~~~~~~~ ../src/basic/macro.h:394:28: note: in definition of macro ‘_VA_ARGS_FOREACH’ 394 | for (typeof(entry) _entries_[] = { __VA_ARGS__ }, *_current_ = _entries_; \ | ^~~~~~~~~ ../src/fundamental/macro-fundamental.h:109:27: note: in expansion of macro ‘XCONCATENATE’ 109 | #define CONCATENATE(x, y) XCONCATENATE(x, y) | ^~~~~~~~~~~~ ../src/fundamental/macro-fundamental.h:163:25: note: in expansion of macro ‘CONCATENATE’ 163 | #define UNIQ_T(x, uniq) CONCATENATE(__unique_prefix_, CONCATENATE(x, uniq)) | ^~~~~~~~~~~ ../src/basic/macro.h:392:33: note: in expansion of macro ‘UNIQ_T’ 392 | _VA_ARGS_FOREACH(entry, UNIQ_T(_entries_, UNIQ), UNIQ_T(_current_, UNIQ), ##__VA_ARGS__) | ^~~~~~ ../src/test/test-macro.c:322:9: note: in expansion of macro ‘VA_ARGS_FOREACH’ 322 | VA_ARGS_FOREACH(u8, 0) { | ^~~~~~~~~~~~~~~ (cherry picked from commit dc571cccd75db7be49b2aada64baf92e3a498c39) (cherry picked from commit 0ddd788136622da3320e43aaa5005b0a68c89137) (cherry picked from commit d44fe47f2ea48fd6da83d1748ff37f46df8b4ddd) (cherry picked from commit 6a8d6e29cee540e06eb7dba6d5c2185a7a0ac00b) Origin: upstream, https://github.com/systemd/systemd-stable/commit/31ba3f4ea0f472355e985c7bcca66ffc35e5735c Forwarded: not-needed Last-Update: 2025-06-23 Gbp-Pq: Name CVE-2025-4598-2.patch --- src/basic/macro.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/basic/macro.h b/src/basic/macro.h index ee835419..e57014ce 100644 --- a/src/basic/macro.h +++ b/src/basic/macro.h @@ -657,10 +657,10 @@ static inline size_t size_add(size_t x, size_t y) { /* Iterate through each variadic arg. All must be the same type as 'entry' or must be implicitly * convertable. The iteration variable 'entry' must already be defined. */ #define VA_ARGS_FOREACH(entry, ...) \ - _VA_ARGS_FOREACH(entry, UNIQ_T(_entries_, UNIQ), UNIQ_T(_current_, UNIQ), ##__VA_ARGS__) -#define _VA_ARGS_FOREACH(entry, _entries_, _current_, ...) \ - for (typeof(entry) _entries_[] = { __VA_ARGS__ }, *_current_ = _entries_; \ - ((long)(_current_ - _entries_) < (long)ELEMENTSOF(_entries_)) && ({ entry = *_current_; true; }); \ + _VA_ARGS_FOREACH(entry, UNIQ_T(_entries_, UNIQ), UNIQ_T(_current_, UNIQ), UNIQ_T(_va_sentinel_, UNIQ), ##__VA_ARGS__) +#define _VA_ARGS_FOREACH(entry, _entries_, _current_, _va_sentinel_, ...) \ + for (typeof(entry) _va_sentinel_[1] = {}, _entries_[] = { __VA_ARGS__ __VA_OPT__(,) _va_sentinel_[0] }, *_current_ = _entries_; \ + ((long)(_current_ - _entries_) < (long)(ELEMENTSOF(_entries_) - 1)) && ({ entry = *_current_; true; }); \ _current_++) #include "log.h" -- 2.30.2