Skip to content
  • Thomas Gummerer's avatar
    refs: strip out not allowed flags from ref_transaction_update · c788c54c
    Thomas Gummerer authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    Callers are only allowed to pass certain flags into
    ref_transaction_update, other flags are internal to it.  To prevent
    mistakes from the callers, strip the internal only flags out before
    continuing.
    
    This was noticed because of a compiler warning gcc 7.1.1 issued about
    passing a NULL parameter as second parameter to memcpy (through
    hashcpy):
    
    In file included from refs.c:5:0:
    refs.c: In function ‘ref_transaction_verify’:
    cache.h:948:2: error: argument 2 null where non-null expected [-Werror=nonnull]
      memcpy(sha_dst, sha_src, GIT_SHA1_RAWSZ);
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    In file included from git-compat-util.h:165:0,
                     from cache.h:4,
                     from refs.c:5:
    /usr/include/string.h:43:14: note: in a call to function ‘memcpy’ declared here
     extern void *memcpy (void *__restrict __dest, const void *__restrict __src,
                  ^~~~~~
    
    The call to hascpy in ref_transaction_add_update is protected by the
    passed in flags, but as we only add flags there, gcc notices
    REF_HAVE_NEW or REF_HAVE_OLD flags could be passed in from the outside,
    which would potentially result in passing in NULL as second parameter to
    memcpy.
    
    Fix both the compiler warning, and make the interface safer for its
    users by stripping the internal flags out.
    
    Suggested-by: default avatarMichael Haggerty <mhagger@alum.mit.edu>
    Signed-off-by: default avatarThomas Gummerer <t.gummerer@gmail.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    c788c54c