summaryrefslogtreecommitdiffstats
path: root/src/basic/string-util.c
diff options
context:
space:
mode:
authorRasmus Villemoes <rasmus.villemoes@prevas.dk>2020-10-30 10:18:04 +0100
committerRasmus Villemoes <rasmus.villemoes@prevas.dk>2020-11-03 14:26:08 +0100
commit6ced0770c741170a05057dffbf3ef78e46eafe53 (patch)
tree566174479add2f355806322eef82457cd7aa4f43 /src/basic/string-util.c
parentstring-util: simplify logic in strjoin_real() (diff)
downloadsystemd-6ced0770c741170a05057dffbf3ef78e46eafe53.tar.xz
systemd-6ced0770c741170a05057dffbf3ef78e46eafe53.zip
string-util: improve overflow checking
The current overflow checking is broken in the corner case of the strings' combined length being exactly SIZE_MAX: After the loop, l would be SIZE_MAX, but we're not testing whether the l+1 expression overflows. Fix it by simply pre-accounting for the final '\0': initialize l to 1 instead of 0.
Diffstat (limited to 'src/basic/string-util.c')
-rw-r--r--src/basic/string-util.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/basic/string-util.c b/src/basic/string-util.c
index c8993000b0..12c4ae177a 100644
--- a/src/basic/string-util.c
+++ b/src/basic/string-util.c
@@ -145,7 +145,7 @@ char *strnappend(const char *s, const char *suffix, size_t b) {
char *strjoin_real(const char *x, ...) {
va_list ap;
- size_t l = 0;
+ size_t l = 1;
char *r, *p;
va_start(ap, x);
@@ -161,7 +161,7 @@ char *strjoin_real(const char *x, ...) {
}
va_end(ap);
- p = r = new(char, l+1);
+ p = r = new(char, l);
if (!r)
return NULL;