]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'jk/avoid-redef-system-functions-2.30' into jk/avoid-redef-system-functions
authorJunio C Hamano <gitster@pobox.com>
Mon, 5 Dec 2022 03:16:00 +0000 (12:16 +0900)
committerJunio C Hamano <gitster@pobox.com>
Mon, 5 Dec 2022 03:16:00 +0000 (12:16 +0900)
* jk/avoid-redef-system-functions-2.30:
  git-compat-util: undefine system names before redeclaring them

1  2 
git-compat-util.h

diff --combined git-compat-util.h
index 83ec7b7941e653a67efc0e2ccfeaedd6a839b076,09a5f338594a85b98d833d19e06da826245da736..76e4b111315339449cd48d17f735f727935c08d8
@@@ -1,19 -1,6 +1,19 @@@
  #ifndef GIT_COMPAT_UTIL_H
  #define GIT_COMPAT_UTIL_H
  
 +#if __STDC_VERSION__ - 0 < 199901L
 +/*
 + * Git is in a testing period for mandatory C99 support in the compiler.  If
 + * your compiler is reasonably recent, you can try to enable C99 support (or,
 + * for MSVC, C11 support).  If you encounter a problem and can't enable C99
 + * support with your compiler (such as with "-std=gnu99") and don't have access
 + * to one with this support, such as GCC or Clang, you can remove this #if
 + * directive, but please report the details of your system to
 + * git@vger.kernel.org.
 + */
 +#error "Required C99 support is in a test phase.  Please see git-compat-util.h for more details."
 +#endif
 +
  #ifdef USE_MSVC_CRTDBG
  /*
   * For these to work they must appear very early in each
@@@ -23,9 -10,6 +23,9 @@@
  #include <crtdbg.h>
  #endif
  
 +struct strbuf;
 +
 +
  #define _FILE_OFFSET_BITS 64
  
  
  /*
   * See if our compiler is known to support flexible array members.
   */
 -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && (!defined(__SUNPRO_C) || (__SUNPRO_C > 0x580))
 -# define FLEX_ARRAY /* empty */
 +
 +/*
 + * Check vendor specific quirks first, before checking the
 + * __STDC_VERSION__, as vendor compilers can lie and we need to be
 + * able to work them around.  Note that by not defining FLEX_ARRAY
 + * here, we can fall back to use the "safer but a bit wasteful" one
 + * later.
 + */
 +#if defined(__SUNPRO_C) && (__SUNPRO_C <= 0x580)
  #elif defined(__GNUC__)
  # if (__GNUC__ >= 3)
  #  define FLEX_ARRAY /* empty */
  # else
  #  define FLEX_ARRAY 0 /* older GNU extension */
  # endif
 +#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
 +# define FLEX_ARRAY /* empty */
  #endif
  
  /*
  #define unsigned_mult_overflows(a, b) \
      ((a) && (b) > maximum_unsigned_value_of_type(a) / (a))
  
 +/*
 + * Returns true if the left shift of "a" by "shift" bits will
 + * overflow. The type of "a" must be unsigned.
 + */
 +#define unsigned_left_shift_overflows(a, shift) \
 +    ((shift) < bitsizeof(a) && \
 +     (a) > maximum_unsigned_value_of_type(a) >> (shift))
 +
  #ifdef __GNUC__
  #define TYPEOF(x) (__typeof__(x))
  #else
  #define _NETBSD_SOURCE 1
  #define _SGI_SOURCE 1
  
 +#if GIT_GNUC_PREREQ(4, 5)
 +#define UNUSED __attribute__((unused)) \
 +      __attribute__((deprecated ("parameter declared as UNUSED")))
 +#elif defined(__GNUC__)
 +#define UNUSED __attribute__((unused)) \
 +      __attribute__((deprecated))
 +#else
 +#define UNUSED
 +#endif
 +
  #if defined(WIN32) && !defined(__CYGWIN__) /* Both MinGW and MSVC */
  # if !defined(_WIN32_WINNT)
  #  define _WIN32_WINNT 0x0600
  # endif
  #define WIN32_LEAN_AND_MEAN  /* stops windows.h including winsock.h */
  #include <winsock2.h>
 +#ifndef NO_UNIX_SOCKETS
 +#include <afunix.h>
 +#endif
  #include <windows.h>
  #define GIT_WINDOWS_NATIVE
  #endif
  #endif
  #include <errno.h>
  #include <limits.h>
 +#include <locale.h>
  #ifdef NEEDS_SYS_PARAM_H
  #include <sys/param.h>
  #endif
  #include <sys/sysctl.h>
  #endif
  
 +/* Used by compat/win32/path-utils.h, and more */
 +static inline int is_xplatform_dir_sep(int c)
 +{
 +      return c == '/' || c == '\\';
 +}
 +
  #if defined(__CYGWIN__)
  #include "compat/win32/path-utils.h"
  #endif
  #include <sys/resource.h>
  #include <sys/socket.h>
  #include <sys/ioctl.h>
 +#include <sys/statvfs.h>
  #include <termios.h>
  #ifndef NO_SYS_SELECT_H
  #include <sys/select.h>
  #else
  #include <stdint.h>
  #endif
 +#ifdef HAVE_ARC4RANDOM_LIBBSD
 +#include <bsd/stdlib.h>
 +#endif
 +#ifdef HAVE_GETRANDOM
 +#include <sys/random.h>
 +#endif
  #ifdef NO_INTPTR_T
  /*
   * On I16LP32, ILP32 and LP64 "long" is the safe bet, however
@@@ -314,17 -254,10 +314,17 @@@ typedef unsigned long uintptr_t
  #ifdef PRECOMPOSE_UNICODE
  #include "compat/precompose_utf8.h"
  #else
 -static inline void precompose_argv(int argc, const char **argv)
 +static inline const char *precompose_argv_prefix(int argc UNUSED,
 +                                               const char **argv UNUSED,
 +                                               const char *prefix)
  {
 -      ; /* nothing */
 +      return prefix;
 +}
 +static inline const char *precompose_string_if_needed(const char *in)
 +{
 +      return in;
  }
 +
  #define probe_utf8_pathname_composition()
  #endif
  
@@@ -341,11 -274,12 +341,12 @@@ struct itimerval 
  #endif
  
  #ifdef NO_SETITIMER
 -static inline int git_setitimer(int which,
 -                              const struct itimerval *value,
 -                              struct itimerval *newvalue) {
 +static inline int git_setitimer(int which UNUSED,
 +                              const struct itimerval *value UNUSED,
 +                              struct itimerval *newvalue UNUSED) {
        return 0; /* pretend success */
  }
+ #undef setitimer
  #define setitimer(which,value,ovalue) git_setitimer(which,value,ovalue)
  #endif
  
@@@ -414,9 -348,7 +415,9 @@@ typedef uintmax_t timestamp_t
  #endif
  
  #ifndef platform_core_config
 -static inline int noop_core_config(const char *var, const char *value, void *cb)
 +static inline int noop_core_config(const char *var UNUSED,
 +                                 const char *value UNUSED,
 +                                 void *cb UNUSED)
  {
        return 0;
  }
@@@ -429,7 -361,7 +430,7 @@@ int lstat_cache_aware_rmdir(const char 
  #endif
  
  #ifndef has_dos_drive_prefix
 -static inline int git_has_dos_drive_prefix(const char *path)
 +static inline int git_has_dos_drive_prefix(const char *path UNUSED)
  {
        return 0;
  }
  #endif
  
  #ifndef skip_dos_drive_prefix
 -static inline int git_skip_dos_drive_prefix(char **path)
 +static inline int git_skip_dos_drive_prefix(char **path UNUSED)
  {
        return 0;
  }
  #define skip_dos_drive_prefix git_skip_dos_drive_prefix
  #endif
  
 -#ifndef is_dir_sep
  static inline int git_is_dir_sep(int c)
  {
        return c == '/';
  }
 +#ifndef is_dir_sep
  #define is_dir_sep git_is_dir_sep
  #endif
  
@@@ -509,8 -441,7 +510,8 @@@ static inline void extract_id_from_env(
        }
  }
  
 -static inline int is_path_owned_by_current_uid(const char *path)
 +static inline int is_path_owned_by_current_uid(const char *path,
 +                                             struct strbuf *report UNUSED)
  {
        struct stat st;
        uid_t euid;
@@@ -588,11 -519,8 +589,11 @@@ static inline int git_has_dir_sep(cons
  /* The sentinel attribute is valid from gcc version 4.0 */
  #if defined(__GNUC__) && (__GNUC__ >= 4)
  #define LAST_ARG_MUST_BE_NULL __attribute__((sentinel))
 +/* warn_unused_result exists as of gcc 3.4.0, but be lazy and check 4.0 */
 +#define RESULT_MUST_BE_USED __attribute__ ((warn_unused_result))
  #else
  #define LAST_ARG_MUST_BE_NULL
 +#define RESULT_MUST_BE_USED
  #endif
  
  #define MAYBE_UNUSED __attribute__((__unused__))
  struct strbuf;
  
  /* General helper functions */
 -void vreportf(const char *prefix, const char *err, va_list params);
  NORETURN void usage(const char *err);
  NORETURN void usagef(const char *err, ...) __attribute__((format (printf, 1, 2)));
  NORETURN void die(const char *err, ...) __attribute__((format (printf, 1, 2)));
  NORETURN void die_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
 +int die_message(const char *err, ...) __attribute__((format (printf, 1, 2)));
 +int die_message_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
  int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
  int error_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
  void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
@@@ -625,14 -552,12 +626,14 @@@ void warning_errno(const char *err, ...
  #include <openssl/x509v3.h>
  #endif /* NO_OPENSSL */
  
 +#ifdef HAVE_OPENSSL_CSPRNG
 +#include <openssl/rand.h>
 +#endif
 +
  /*
   * Let callers be aware of the constant return value; this can help
   * gcc with -Wuninitialized analysis. We restrict this trick to gcc, though,
 - * because some compilers may not support variadic macros. Since we're only
 - * trying to help gcc, anyway, it's OK; other compilers will fall back to
 - * using the function as usual.
 + * because other compilers may be confused by this.
   */
  #if defined(__GNUC__)
  static inline int const_error(void)
  typedef void (*report_fn)(const char *, va_list params);
  
  void set_die_routine(NORETURN_PTR report_fn routine);
 +report_fn get_die_message_routine(void);
  void set_error_routine(report_fn routine);
  report_fn get_error_routine(void);
  void set_warn_routine(report_fn routine);
@@@ -871,7 -795,7 +872,7 @@@ char *gitmkdtemp(char *)
  
  #ifdef NO_UNSETENV
  #define unsetenv gitunsetenv
 -void gitunsetenv(const char *);
 +int gitunsetenv(const char *);
  #endif
  
  #ifdef NO_STRCASESTR
@@@ -943,12 -867,6 +944,12 @@@ int git_vsnprintf(char *str, size_t max
                  const char *format, va_list ap);
  #endif
  
 +#ifdef OPEN_RETURNS_EINTR
 +#undef open
 +#define open git_open_with_retry
 +int git_open_with_retry(const char *path, int flag, ...);
 +#endif
 +
  #ifdef __GLIBC_PREREQ
  #if __GLIBC_PREREQ(2, 1)
  #define HAVE_STRCHRNUL
@@@ -1004,45 -922,6 +1005,45 @@@ static inline size_t st_sub(size_t a, s
        return a - b;
  }
  
 +static inline size_t st_left_shift(size_t a, unsigned shift)
 +{
 +      if (unsigned_left_shift_overflows(a, shift))
 +              die("size_t overflow: %"PRIuMAX" << %u",
 +                  (uintmax_t)a, shift);
 +      return a << shift;
 +}
 +
 +static inline unsigned long cast_size_t_to_ulong(size_t a)
 +{
 +      if (a != (unsigned long)a)
 +              die("object too large to read on this platform: %"
 +                  PRIuMAX" is cut off to %lu",
 +                  (uintmax_t)a, (unsigned long)a);
 +      return (unsigned long)a;
 +}
 +
 +/*
 + * Limit size of IO chunks, because huge chunks only cause pain.  OS X
 + * 64-bit is buggy, returning EINVAL if len >= INT_MAX; and even in
 + * the absence of bugs, large chunks can result in bad latencies when
 + * you decide to kill the process.
 + *
 + * We pick 8 MiB as our default, but if the platform defines SSIZE_MAX
 + * that is smaller than that, clip it to SSIZE_MAX, as a call to
 + * read(2) or write(2) larger than that is allowed to fail.  As the last
 + * resort, we allow a port to pass via CFLAGS e.g. "-DMAX_IO_SIZE=value"
 + * to override this, if the definition of SSIZE_MAX given by the platform
 + * is broken.
 + */
 +#ifndef MAX_IO_SIZE
 +# define MAX_IO_SIZE_DEFAULT (8*1024*1024)
 +# if defined(SSIZE_MAX) && (SSIZE_MAX < MAX_IO_SIZE_DEFAULT)
 +#  define MAX_IO_SIZE SSIZE_MAX
 +# else
 +#  define MAX_IO_SIZE MAX_IO_SIZE_DEFAULT
 +# endif
 +#endif
 +
  #ifdef HAVE_ALLOCA_H
  # include <alloca.h>
  # define xalloca(size)      (alloca(size))
@@@ -1059,9 -938,7 +1060,9 @@@ void *xmemdupz(const void *data, size_
  char *xstrndup(const char *str, size_t len);
  void *xrealloc(void *ptr, size_t size);
  void *xcalloc(size_t nmemb, size_t size);
 +void xsetenv(const char *name, const char *value, int overwrite);
  void *xmmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
 +const char *mmap_os_err(void);
  void *xmmap_gently(void *start, size_t length, int prot, int flags, int fd, off_t offset);
  int xopen(const char *path, int flags, ...);
  ssize_t xread(int fd, void *buf, size_t len);
@@@ -1089,7 -966,7 +1090,7 @@@ int xstrncmpz(const char *s, const cha
  #define FREE_AND_NULL(p) do { free(p); (p) = NULL; } while (0)
  
  #define ALLOC_ARRAY(x, alloc) (x) = xmalloc(st_mult(sizeof(*(x)), (alloc)))
 -#define CALLOC_ARRAY(x, alloc) (x) = xcalloc((alloc), sizeof(*(x)));
 +#define CALLOC_ARRAY(x, alloc) (x) = xcalloc((alloc), sizeof(*(x)))
  #define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), st_mult(sizeof(*(x)), (alloc)))
  
  #define COPY_ARRAY(dst, src, n) copy_array((dst), (src), (n), sizeof(*(dst)) + \
@@@ -1172,9 -1049,11 +1173,9 @@@ static inline char *xstrdup_or_null(con
  
  static inline size_t xsize_t(off_t len)
  {
 -      size_t size = (size_t) len;
 -
 -      if (len != (off_t) size)
 +      if (len < 0 || (uintmax_t) len > SIZE_MAX)
                die("Cannot handle files this big");
 -      return size;
 +      return (size_t) len;
  }
  
  __attribute__((format (printf, 3, 4)))
@@@ -1376,54 -1255,22 +1377,54 @@@ static inline int regexec_buf(const reg
  #endif
  #endif
  
 -#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__C99_MACRO_WITH_VA_ARGS)
 -#define HAVE_VARIADIC_MACROS 1
 -#endif
 -
  /* usage.c: only to be used for testing BUG() implementation (see test-tool) */
  extern int BUG_exit_code;
  
 -#ifdef HAVE_VARIADIC_MACROS
 +/* usage.c: if bug() is called we should have a BUG_if_bug() afterwards */
 +extern int bug_called_must_BUG;
 +
  __attribute__((format (printf, 3, 4))) NORETURN
  void BUG_fl(const char *file, int line, const char *fmt, ...);
  #define BUG(...) BUG_fl(__FILE__, __LINE__, __VA_ARGS__)
 +__attribute__((format (printf, 3, 4)))
 +void bug_fl(const char *file, int line, const char *fmt, ...);
 +#define bug(...) bug_fl(__FILE__, __LINE__, __VA_ARGS__)
 +#define BUG_if_bug(...) do { \
 +      if (bug_called_must_BUG) \
 +              BUG_fl(__FILE__, __LINE__, __VA_ARGS__); \
 +} while (0)
 +
 +#ifndef FSYNC_METHOD_DEFAULT
 +#ifdef __APPLE__
 +#define FSYNC_METHOD_DEFAULT FSYNC_METHOD_WRITEOUT_ONLY
  #else
 -__attribute__((format (printf, 1, 2))) NORETURN
 -void BUG(const char *fmt, ...);
 +#define FSYNC_METHOD_DEFAULT FSYNC_METHOD_FSYNC
 +#endif
  #endif
  
 +enum fsync_action {
 +      FSYNC_WRITEOUT_ONLY,
 +      FSYNC_HARDWARE_FLUSH
 +};
 +
 +/*
 + * Issues an fsync against the specified file according to the specified mode.
 + *
 + * FSYNC_WRITEOUT_ONLY attempts to use interfaces available on some operating
 + * systems to flush the OS cache without issuing a flush command to the storage
 + * controller. If those interfaces are unavailable, the function fails with
 + * ENOSYS.
 + *
 + * FSYNC_HARDWARE_FLUSH does an OS writeout and hardware flush to ensure that
 + * changes are durable. It is not expected to fail.
 + */
 +int git_fsync(int fd, enum fsync_action action);
 +
 +/*
 + * Writes out trace statistics for fsync using the trace2 API.
 + */
 +void trace_git_fsync_stats(void);
 +
  /*
   * Preserves errno, prints a message, but gives no warning for ENOENT.
   * Returns 0 on success, which includes trying to unlink an object that does
@@@ -1460,26 -1307,26 +1461,29 @@@ int access_or_die(const char *path, in
  /* Warn on an inaccessible file if errno indicates this is an error */
  int warn_on_fopen_errors(const char *path);
  
 -#if !defined(USE_PARENS_AROUND_GETTEXT_N) && defined(__GNUC__)
 -#define USE_PARENS_AROUND_GETTEXT_N 1
 -#endif
 +/*
 + * Open with O_NOFOLLOW, or equivalent. Note that the fallback equivalent
 + * may be racy. Do not use this as protection against an attacker who can
 + * simultaneously create paths.
 + */
 +int open_nofollow(const char *path, int flags);
  
  #ifndef SHELL_PATH
  # define SHELL_PATH "/bin/sh"
  #endif
  
  #ifndef _POSIX_THREAD_SAFE_FUNCTIONS
 -static inline void git_flockfile(FILE *fh)
 +static inline void git_flockfile(FILE *fh UNUSED)
  {
        ; /* nothing */
  }
 -static inline void git_funlockfile(FILE *fh)
 +static inline void git_funlockfile(FILE *fh UNUSED)
  {
        ; /* nothing */
  }
+ #undef flockfile
+ #undef funlockfile
+ #undef getc_unlocked
  #define flockfile(fh) git_flockfile(fh)
  #define funlockfile(fh) git_funlockfile(fh)
  #define getc_unlocked(fh) getc(fh)
@@@ -1524,8 -1371,8 +1528,8 @@@ int cmd_main(int, const char **)
   * Intercept all calls to exit() and route them to trace2 to
   * optionally emit a message before calling the real exit().
   */
 -int trace2_cmd_exit_fl(const char *file, int line, int code);
 -#define exit(code) exit(trace2_cmd_exit_fl(__FILE__, __LINE__, (code)))
 +int common_exit(const char *file, int line, int code);
 +#define exit(code) exit(common_exit(__FILE__, __LINE__, (code)))
  
  /*
   * You can mark a stack variable with UNLEAK(var) to avoid it being
@@@ -1547,18 -1394,6 +1551,18 @@@ void unleak_memory(const void *ptr, siz
  #define UNLEAK(var) do {} while (0)
  #endif
  
 +#define z_const
 +#include <zlib.h>
 +
 +#if ZLIB_VERNUM < 0x1290
 +/*
 + * This is uncompress2, which is only available in zlib >= 1.2.9
 + * (released as of early 2017). See compat/zlib-uncompress2.c.
 + */
 +int uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source,
 +              uLong *sourceLen);
 +#endif
 +
  /*
   * This include must come after system headers, since it introduces macros that
   * replace system names.
@@@ -1591,7 -1426,7 +1595,7 @@@ static inline void *container_of_or_nul
        (type *)container_of_or_null_offset(ptr, offsetof(type, member))
  
  /*
 - * like offsetof(), but takes a pointer to a variable of type which
 + * like offsetof(), but takes a pointer to a variable of type which
   * contains @member, instead of a specified type.
   * @ptr is subject to multiple evaluation since we can't rely on __typeof__
   * everywhere.
  
  void sleep_millisec(int millisec);
  
 +/*
 + * Generate len bytes from the system cryptographically secure PRNG.
 + * Returns 0 on success and -1 on error, setting errno.  The inability to
 + * satisfy the full request is an error.
 + */
 +int csprng_bytes(void *buf, size_t len);
 +
  #endif