Code

Merge branch 'il/maint-xmallocz'
authorJunio C Hamano <gitster@pobox.com>
Wed, 27 Jan 2010 22:56:38 +0000 (14:56 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 27 Jan 2010 22:56:38 +0000 (14:56 -0800)
* il/maint-xmallocz:
  Fix integer overflow in unpack_compressed_entry()
  Fix integer overflow in unpack_sha1_rest()
  Fix integer overflow in patch_delta()
  Add xmallocz()

1  2 
git-compat-util.h
sha1_file.c

diff --combined git-compat-util.h
index 620a7c6371d34671986622a9fa7b89ae9cb1f467,31e2ef9e9e49947f9665bc573fc132d18b0c2137..a3c45373669cd8482c04d5815862ed36a153572d
@@@ -96,7 -96,6 +96,7 @@@
  #include <sys/poll.h>
  #include <sys/socket.h>
  #include <sys/ioctl.h>
 +#include <termios.h>
  #ifndef NO_SYS_SELECT_H
  #include <sys/select.h>
  #endif
@@@ -178,9 -177,6 +178,9 @@@ extern char *gitbasename(char *)
  #ifdef __GNUC__
  #define NORETURN __attribute__((__noreturn__))
  #define NORETURN_PTR __attribute__((__noreturn__))
 +#elif defined(_MSC_VER)
 +#define NORETURN __declspec(noreturn)
 +#define NORETURN_PTR
  #else
  #define NORETURN
  #define NORETURN_PTR
  
  /* General helper functions */
  extern NORETURN void usage(const char *err);
 +extern NORETURN void usagef(const char *err, ...) __attribute__((format (printf, 1, 2)));
  extern NORETURN void die(const char *err, ...) __attribute__((format (printf, 1, 2)));
  extern NORETURN void die_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
  extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
@@@ -202,7 -197,7 +202,7 @@@ extern void warning(const char *err, ..
  extern void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list params));
  
  extern int prefixcmp(const char *str, const char *prefix);
 -extern time_t tm_to_time_t(const struct tm *tm);
 +extern int suffixcmp(const char *str, const char *suffix);
  
  static inline const char *skip_prefix(const char *str, const char *prefix)
  {
@@@ -348,6 -343,7 +348,7 @@@ extern void release_pack_memory(size_t
  
  extern char *xstrdup(const char *str);
  extern void *xmalloc(size_t size);
+ extern void *xmallocz(size_t size);
  extern void *xmemdupz(const void *data, size_t len);
  extern char *xstrndup(const char *str, size_t len);
  extern void *xrealloc(void *ptr, size_t size);
diff --combined sha1_file.c
index 12478a3652cfbdcbe4b0199641320c94b7f3dfa5,23d347c45fcf2a93ee59b9ddea996ec432038200..657825e14ef78c19649779fe89e1d09ae672901a
@@@ -35,6 -35,54 +35,6 @@@ static size_t sz_fmt(size_t s) { retur
  
  const unsigned char null_sha1[20];
  
 -const signed char hexval_table[256] = {
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* 00-07 */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* 08-0f */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* 10-17 */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* 18-1f */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* 20-27 */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* 28-2f */
 -        0,  1,  2,  3,  4,  5,  6,  7,                /* 30-37 */
 -        8,  9, -1, -1, -1, -1, -1, -1,                /* 38-3f */
 -       -1, 10, 11, 12, 13, 14, 15, -1,                /* 40-47 */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* 48-4f */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* 50-57 */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* 58-5f */
 -       -1, 10, 11, 12, 13, 14, 15, -1,                /* 60-67 */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* 68-67 */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* 70-77 */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* 78-7f */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* 80-87 */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* 88-8f */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* 90-97 */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* 98-9f */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* a0-a7 */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* a8-af */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* b0-b7 */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* b8-bf */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* c0-c7 */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* c8-cf */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* d0-d7 */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* d8-df */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* e0-e7 */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* e8-ef */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* f0-f7 */
 -       -1, -1, -1, -1, -1, -1, -1, -1,                /* f8-ff */
 -};
 -
 -int get_sha1_hex(const char *hex, unsigned char *sha1)
 -{
 -      int i;
 -      for (i = 0; i < 20; i++) {
 -              unsigned int val = (hexval(hex[0]) << 4) | hexval(hex[1]);
 -              if (val & ~0xff)
 -                      return -1;
 -              *sha1++ = val;
 -              hex += 2;
 -      }
 -      return 0;
 -}
 -
  static inline int offset_1st_component(const char *path)
  {
        if (has_dos_drive_prefix(path))
@@@ -85,6 -133,24 +85,6 @@@ int safe_create_leading_directories_con
        return result;
  }
  
 -char *sha1_to_hex(const unsigned char *sha1)
 -{
 -      static int bufno;
 -      static char hexbuffer[4][50];
 -      static const char hex[] = "0123456789abcdef";
 -      char *buffer = hexbuffer[3 & ++bufno], *buf = buffer;
 -      int i;
 -
 -      for (i = 0; i < 20; i++) {
 -              unsigned int val = *sha1++;
 -              *buf++ = hex[val >> 4];
 -              *buf++ = hex[val & 0xf];
 -      }
 -      *buf = '\0';
 -
 -      return buffer;
 -}
 -
  static void fill_sha1_path(char *pathbuf, const unsigned char *sha1)
  {
        int i;
@@@ -1166,7 -1232,7 +1166,7 @@@ static int unpack_sha1_header(z_stream 
  static void *unpack_sha1_rest(z_stream *stream, void *buffer, unsigned long size, const unsigned char *sha1)
  {
        int bytes = strlen(buffer) + 1;
-       unsigned char *buf = xmalloc(1+size);
+       unsigned char *buf = xmallocz(size);
        unsigned long n;
        int status = Z_OK;
  
                while (status == Z_OK)
                        status = git_inflate(stream, Z_FINISH);
        }
-       buf[size] = 0;
        if (status == Z_STREAM_END && !stream->avail_in) {
                git_inflate_end(stream);
                return buf;
@@@ -1517,8 -1582,7 +1516,7 @@@ static void *unpack_compressed_entry(st
        z_stream stream;
        unsigned char *buffer, *in;
  
-       buffer = xmalloc(size + 1);
-       buffer[size] = 0;
+       buffer = xmallocz(size);
        memset(&stream, 0, sizeof(stream));
        stream.next_out = buffer;
        stream.avail_out = size + 1;
@@@ -2390,6 -2454,14 +2388,6 @@@ int has_pack_index(const unsigned char 
        if (stat(sha1_pack_index_name(sha1), &st))
                return 0;
        return 1;
 -}
 -
 -int has_pack_file(const unsigned char *sha1)
 -{
 -      struct stat st;
 -      if (stat(sha1_pack_name(sha1), &st))
 -              return 0;
 -      return 1;
  }
  
  int has_sha1_pack(const unsigned char *sha1)