From fc6e036599be0ff41b9312086a7a20c25025ebeb Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Dec 15 2020 09:45:35 +0000 Subject: tree-wide: various ubsan zero size memory fixes Fixes: #10346 (cherry picked from commit 65f95765d05ddcd9e5849b68c379afa7e87d1248) Resolves: #1683319 patch_name: 0180-tree-wide-various-ubsan-zero-size-memory-fixes.patch present_in_specfile: true location_in_specfile: 180 squash_commits: true --- diff --git a/src/basic/bitmap.c b/src/basic/bitmap.c index c17c6a7..a4cd645 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 b68ef25..4659a21 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 da9f300..a972ddc 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)); } }