diff options
author | Lennart Poettering <lennart@poettering.net> | 2018-10-10 11:34:30 +0200 |
---|---|---|
committer | Lukáš Nykrýn <lnykryn@redhat.com> | 2019-05-03 13:00:29 +0200 |
commit | 6bb1d52f0554f687ef27de46c0b9daac9d256d60 (patch) | |
tree | 74540682aaada8850df80f2e0d86f754e2f83d19 | |
parent | ee93272cf9915710251704c7bf7c1f1a0b02cb7f (diff) | |
download | systemd-6bb1d52f0554f687ef27de46c0b9daac9d256d60.tar.gz |
tree-wide: various ubsan zero size memory fixes
Fixes: #10346
(cherry picked from commit 65f95765d05ddcd9e5849b68c379afa7e87d1248)
Resolves: #1683319
-rw-r--r-- | src/basic/bitmap.c | 2 | ||||
-rw-r--r-- | src/basic/util.h | 8 | ||||
-rw-r--r-- | src/test/test-hexdecoct.c | 2 |
3 files changed, 9 insertions, 3 deletions
diff --git a/src/basic/bitmap.c b/src/basic/bitmap.c index c17c6a7a02..a4cd6451b0 100644 --- a/src/basic/bitmap.c +++ b/src/basic/bitmap.c @@ -206,7 +206,7 @@ bool bitmap_equal(Bitmap *a, Bitmap *b) { return true; common_n_bitmaps = MIN(a->n_bitmaps, b->n_bitmaps); - if (memcmp(a->bitmaps, b->bitmaps, sizeof(uint64_t) * common_n_bitmaps) != 0) + if (memcmp_safe(a->bitmaps, b->bitmaps, sizeof(uint64_t) * common_n_bitmaps) != 0) return false; c = a->n_bitmaps > b->n_bitmaps ? a : b; diff --git a/src/basic/util.h b/src/basic/util.h index b68ef25ed8..4659a21b06 100644 --- a/src/basic/util.h +++ b/src/basic/util.h @@ -134,7 +134,13 @@ static inline int memcmp_safe(const void *s1, const void *s2, size_t n) { int on_ac_power(void); -#define memzero(x,l) (memset((x), 0, (l))) +#define memzero(x,l) \ + ({ \ + size_t _l_ = (l); \ + void *_x_ = (x); \ + _l_ == 0 ? _x_ : memset(_x_, 0, _l_); \ + }) + #define zero(x) (memzero(&(x), sizeof(x))) static inline void *mempset(void *s, int c, size_t n) { diff --git a/src/test/test-hexdecoct.c b/src/test/test-hexdecoct.c index da9f3008bb..a972ddcef7 100644 --- a/src/test/test-hexdecoct.c +++ b/src/test/test-hexdecoct.c @@ -84,7 +84,7 @@ static void test_unhexmem_one(const char *s, size_t l, int retval) { l = strlen(s); assert_se(hex = hexmem(mem, len)); - answer = strndupa(s, l); + answer = strndupa(s ?: "", l); assert_se(streq(delete_chars(answer, WHITESPACE), hex)); } } |