diff options
author | Carlo Marcelo Arenas Belón <carenas@gmail.com> | 2022-04-15 11:30:59 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2022-04-15 19:24:02 +0300 |
commit | e6b2582da30b599d95f40510777c643b9fba9012 (patch) | |
tree | d6c6395277a540480ccff563ae0703f864ff92cd | |
parent | d516b2db0af2221bd6b13e7347abdcb5830b2829 (diff) |
reftable: avoid undefined behaviour breaking t0032
1214aa841bc (reftable: add blocksource, an abstraction for random
access reads, 2021-10-07), makes the assumption that it is ok to
free a reftable_block pointing to NULL if the size is also set to
0, but implements that using a memset call that at least in glibc
based system will trigger a runtime exception if called with a
NULL pointer as its first parameter.
Avoid doing so by adding a conditional to check for the size in all
three identically looking functions that were affected, and therefore,
still allow memset to help catch callers that might incorrectly pass
a NULL pointer with a non zero size, but avoiding the exception for
the valid cases.
Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | reftable/blocksource.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/reftable/blocksource.c b/reftable/blocksource.c index 0044eecd9a..db1b7dc966 100644 --- a/reftable/blocksource.c +++ b/reftable/blocksource.c @@ -15,7 +15,8 @@ https://developers.google.com/open-source/licenses/bsd static void strbuf_return_block(void *b, struct reftable_block *dest) { - memset(dest->data, 0xff, dest->len); + if (dest->len) + memset(dest->data, 0xff, dest->len); reftable_free(dest->data); } @@ -56,7 +57,8 @@ void block_source_from_strbuf(struct reftable_block_source *bs, static void malloc_return_block(void *b, struct reftable_block *dest) { - memset(dest->data, 0xff, dest->len); + if (dest->len) + memset(dest->data, 0xff, dest->len); reftable_free(dest->data); } @@ -85,7 +87,8 @@ static uint64_t file_size(void *b) static void file_return_block(void *b, struct reftable_block *dest) { - memset(dest->data, 0xff, dest->len); + if (dest->len) + memset(dest->data, 0xff, dest->len); reftable_free(dest->data); } |