On 04/06/2017 10:49 PM, Johannes Sixt wrote: > Am 06.04.2017 um 19:31 schrieb René Scharfe: >> Am 06.04.2017 um 18:33 schrieb Johannes Sixt: >>> Am 06.04.2017 um 17:42 schrieb Martin Liška: >>>> +static inline void *sane_memmove(void *dest, const void *src, size_t n) >>>> +{ >>>> + if (n > 0) >>>> + return memmove(dest, src, n); >>>> + else >>>> + return dest; >>>> +} >>> >>> Huh? memmove with n == 0 is well-defined. This wrapper is pointless. >> >> memmove(3) with NULL pointers is undefined. > > Then don't hide this helper behind a macro with a suspiciously similar name. Using the name sane_mmemove at the call site is preferable. memmove_or_null or something similar perhaps even more so. > > -- Hannes > Good. There's tested v4. Martin
>From 0bdf4d717d3d368dd9676d15d20f8592c4d22fde Mon Sep 17 00:00:00 2001 From: marxin <mliska@xxxxxxx> Date: Wed, 5 Apr 2017 14:31:32 +0200 Subject: [PATCH 1/2] Fix nonnull errors reported by UBSAN with GCC 7. Replace call to memmove with newly introduced function memmove_or_null and call to memcpy with COPY_ARRAY macro. Signed-off-by: Martin Liska <mliska@xxxxxxx> --- apply.c | 4 +--- builtin/ls-files.c | 2 +- git-compat-util.h | 8 ++++++++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/apply.c b/apply.c index e6dbab26a..121f3f414 100644 --- a/apply.c +++ b/apply.c @@ -2802,9 +2802,7 @@ static void update_image(struct apply_state *state, img->line + applied_pos + preimage_limit, (img->nr - (applied_pos + preimage_limit)) * sizeof(*img->line)); - memcpy(img->line + applied_pos, - postimage->line, - postimage->nr * sizeof(*img->line)); + COPY_ARRAY(img->line + applied_pos, postimage->line, postimage->nr); if (!state->allow_overlap) for (i = 0; i < postimage->nr; i++) img->line[applied_pos + i].flag |= LINE_PATCHED; diff --git a/builtin/ls-files.c b/builtin/ls-files.c index d449e46db..0a6cc1e8a 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -391,7 +391,7 @@ static void prune_cache(const char *prefix, size_t prefixlen) } last = next; } - memmove(active_cache, active_cache + pos, + memmove_or_null(active_cache, active_cache + pos, (last - pos) * sizeof(struct cache_entry *)); active_nr = last - pos; } diff --git a/git-compat-util.h b/git-compat-util.h index 8a4a3f85e..81f6e56ac 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -1002,6 +1002,14 @@ int git_qsort_s(void *base, size_t nmemb, size_t size, die("BUG: qsort_s() failed"); \ } while (0) +static inline void *memmove_or_null(void *dest, const void *src, size_t n) +{ + if (n > 0) + return memmove(dest, src, n); + else + return dest; +} + #ifndef REG_STARTEND #error "Git requires REG_STARTEND support. Compile with NO_REGEX=NeedsStartEnd" #endif -- 2.12.2