1
0
mirror of https://github.com/systemd/systemd.git synced 2025-03-19 22:50:17 +03:00

basic/strv: avoid potential UB with references to array[-1]

"""
Given an array a[N] of N elements of type T:
- Forming a pointer &a[i] (or a + i) with 0 ≤ i ≤ N is safe.
- Forming a pointer &a[i] with i < 0 or i > N causes undefined behavior.
- Dereferencing a pointer &a[i] with 0 ≤ i < N is safe.
- Dereferencing a pointer &a[i] with i < 0 or i ≥ N causes undefined behavior.
"""

As pointed by by @medhefgo, here we were forming a pointer to a[-1]. a itself
wasn't NULL, so a > 0, and a-1 was also >= 0, and this didn't seem to cause any
problems. But it's better to be formally correct, especially if we move the
code to src/fundamental/ later on and compile it differently.

Compilation shows no size change (with -O0 -g) on build/systemd, so this should
have no effect whatsoever.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2022-03-21 11:03:00 +01:00 committed by Lennart Poettering
parent e7949be790
commit 9b01798b98
2 changed files with 8 additions and 3 deletions

View File

@ -133,8 +133,8 @@ bool strv_overlap(char * const *a, char * const *b) _pure_;
size_t _len = strv_length(h); \
_len > 0 ? h + _len - 1 : NULL; \
}); \
i && (s = i) >= h; \
i--)
(s = i); \
i > h ? i-- : (i = NULL))
#define STRV_FOREACH_BACKWARDS(s, l) \
_STRV_FOREACH_BACKWARDS(s, l, UNIQ_T(h, UNIQ), UNIQ_T(i, UNIQ))

View File

@ -639,8 +639,13 @@ TEST(strv_foreach_backwards) {
STRV_FOREACH_BACKWARDS(check, (char**) NULL)
assert_not_reached();
STRV_FOREACH_BACKWARDS(check, (char**) { NULL })
STRV_FOREACH_BACKWARDS(check, STRV_MAKE_EMPTY)
assert_not_reached();
unsigned count = 0;
STRV_FOREACH_BACKWARDS(check, STRV_MAKE("ONE"))
count++;
assert_se(count == 1);
}
TEST(strv_foreach_pair) {