From: Lennart Poettering Date: Wed, 10 Oct 2018 09:34:30 +0000 (+0200) Subject: tree-wide: various ubsan zero size memory fixes X-Git-Tag: v240~587 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=65f95765d05ddcd9e5849b68c379afa7e87d1248;p=thirdparty%2Fsystemd.git tree-wide: various ubsan zero size memory fixes Fixes: #10346 --- diff --git a/src/basic/bitmap.c b/src/basic/bitmap.c index c17c6a7a02f..a4cd6451b0c 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 5f3f9821902..8cba4ed7260 100644 --- a/src/basic/util.h +++ b/src/basic/util.h @@ -150,7 +150,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 da9f3008bb5..a972ddcef7c 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)); } }