Merge branch 'tc/format-attribute'
authorJunio C Hamano <gitster@pobox.com>
Mon, 23 Nov 2009 00:28:14 +0000 (16:28 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 23 Nov 2009 00:28:14 +0000 (16:28 -0800)
* tc/format-attribute:
Check the format of more printf-type functions

1  2 
builtin-upload-archive.c
cache.h
daemon.c
imap-send.c
diff --combined builtin-upload-archive.c
index 29446e84ccf9322e722830f5af11da0c56709fb8,b2d12592a3320fc1763dc1496a188e887ca8c7ce..73f788ef247febabbabe9bc0d21a890afa198cff
@@@ -67,6 -67,7 +67,7 @@@ static int run_upload_archive(int argc
        return write_archive(sent_argc, sent_argv, prefix, 0);
  }
  
+ __attribute__((format (printf, 1, 2)))
  static void error_clnt(const char *fmt, ...)
  {
        char buf[1024];
@@@ -132,6 -133,7 +133,6 @@@ int cmd_upload_archive(int argc, const 
  
        while (1) {
                struct pollfd pfd[2];
 -              ssize_t processed[2] = { 0, 0 };
                int status;
  
                pfd[0].fd = fd1[0];
                        }
                        continue;
                }
 -              if (pfd[0].revents & POLLIN)
 -                      /* Data stream ready */
 -                      processed[0] = process_input(pfd[0].fd, 1);
                if (pfd[1].revents & POLLIN)
                        /* Status stream ready */
 -                      processed[1] = process_input(pfd[1].fd, 2);
 -              /* Always finish to read data when available */
 -              if (processed[0] || processed[1])
 -                      continue;
 +                      if (process_input(pfd[1].fd, 2))
 +                              continue;
 +              if (pfd[0].revents & POLLIN)
 +                      /* Data stream ready */
 +                      if (process_input(pfd[0].fd, 1))
 +                              continue;
  
                if (waitpid(writer, &status, 0) < 0)
                        error_clnt("%s", lostchild);
diff --combined cache.h
index f7533ff86244f4132e46a4bd3b624d821b5717c9,ff45269d295c61797d55ca27e44cd218980d6505..72a311bafaffd76e375fe8a07da0768b680a129c
+++ b/cache.h
@@@ -372,8 -372,6 +372,8 @@@ static inline enum object_type object_t
  #define GITATTRIBUTES_FILE ".gitattributes"
  #define INFOATTRIBUTES_FILE "info/attributes"
  #define ATTRIBUTE_MACRO_PREFIX "[attr]"
 +#define GIT_NOTES_REF_ENVIRONMENT "GIT_NOTES_REF"
 +#define GIT_NOTES_DEFAULT_REF "refs/notes/commits"
  
  extern int is_bare_repository_cfg;
  extern int is_bare_repository(void);
@@@ -570,8 -568,6 +570,8 @@@ enum object_creation_mode 
  
  extern enum object_creation_mode object_creation_mode;
  
 +extern char *notes_ref_name;
 +
  extern int grafts_replace_parents;
  
  #define GIT_REPO_VERSION 0
@@@ -661,7 -657,6 +661,7 @@@ const char *make_relative_path(const ch
  int normalize_path_copy(char *dst, const char *src);
  int longest_ancestor_length(const char *path, const char *prefix_list);
  char *strip_path_suffix(const char *path, const char *suffix);
 +int daemon_avoid_alias(const char *path);
  
  /* Read and unpack a sha1 file into memory, write memory to a sha1 file */
  extern int sha1_object_info(const unsigned char *, unsigned long *);
@@@ -756,8 -751,6 +756,8 @@@ extern const char *git_author_info(int)
  extern const char *git_committer_info(int);
  extern const char *fmt_ident(const char *name, const char *email, const char *date_str, int);
  extern const char *fmt_name(const char *name, const char *email);
 +extern const char *git_editor(void);
 +extern const char *git_pager(void);
  
  struct checkout {
        const char *base_dir;
@@@ -864,6 -857,7 +864,6 @@@ extern struct ref *find_ref_by_name(con
  extern struct child_process *git_connect(int fd[2], const char *url, const char *prog, int flags);
  extern int finish_connect(struct child_process *conn);
  extern int path_match(const char *path, int nr, char **match);
 -extern int get_ack(int fd, unsigned char *result_sha1);
  struct extra_have_objects {
        int nr, alloc;
        unsigned char (*array)[20];
@@@ -967,7 -961,9 +967,9 @@@ extern void *alloc_object_node(void)
  extern void alloc_report(void);
  
  /* trace.c */
+ __attribute__((format (printf, 1, 2)))
  extern void trace_printf(const char *format, ...);
+ __attribute__((format (printf, 2, 3)))
  extern void trace_argv_printf(const char **argv, const char *format, ...);
  
  /* convert.c */
diff --combined daemon.c
index ce4800621cece33de68991b52419312803875f84,641ebe16dd3ee07e3e2a4ed6d6b646764391333b..5783e2401108adb1fef6943ef80bd78dbc76ecad
+++ b/daemon.c
@@@ -77,6 -77,7 +77,7 @@@ static void logreport(int priority, con
        }
  }
  
+ __attribute__((format (printf, 1, 2)))
  static void logerror(const char *err, ...)
  {
        va_list params;
@@@ -85,6 -86,7 +86,7 @@@
        va_end(params);
  }
  
+ __attribute__((format (printf, 1, 2)))
  static void loginfo(const char *err, ...)
  {
        va_list params;
@@@ -101,6 -103,53 +103,6 @@@ static void NORETURN daemon_die(const c
        exit(1);
  }
  
 -static int avoid_alias(char *p)
 -{
 -      int sl, ndot;
 -
 -      /*
 -       * This resurrects the belts and suspenders paranoia check by HPA
 -       * done in <435560F7.4080006@zytor.com> thread, now enter_repo()
 -       * does not do getcwd() based path canonicalizations.
 -       *
 -       * sl becomes true immediately after seeing '/' and continues to
 -       * be true as long as dots continue after that without intervening
 -       * non-dot character.
 -       */
 -      if (!p || (*p != '/' && *p != '~'))
 -              return -1;
 -      sl = 1; ndot = 0;
 -      p++;
 -
 -      while (1) {
 -              char ch = *p++;
 -              if (sl) {
 -                      if (ch == '.')
 -                              ndot++;
 -                      else if (ch == '/') {
 -                              if (ndot < 3)
 -                                      /* reject //, /./ and /../ */
 -                                      return -1;
 -                              ndot = 0;
 -                      }
 -                      else if (ch == 0) {
 -                              if (0 < ndot && ndot < 3)
 -                                      /* reject /.$ and /..$ */
 -                                      return -1;
 -                              return 0;
 -                      }
 -                      else
 -                              sl = ndot = 0;
 -              }
 -              else if (ch == 0)
 -                      return 0;
 -              else if (ch == '/') {
 -                      sl = 1;
 -                      ndot = 0;
 -              }
 -      }
 -}
 -
  static char *path_ok(char *directory)
  {
        static char rpath[PATH_MAX];
  
        dir = directory;
  
 -      if (avoid_alias(dir)) {
 +      if (daemon_avoid_alias(dir)) {
                logerror("'%s': aliased", dir);
                return NULL;
        }
diff --combined imap-send.c
index 834301cf409c311d47b22a0f7504917a32847647,57a3c65dda00ac5b04386978988b668be0815543..de8114bac010ef095cf9de17671566e248366dcb
@@@ -24,7 -24,6 +24,7 @@@
  
  #include "cache.h"
  #include "exec_cmd.h"
 +#include "run-command.h"
  #ifdef NO_OPENSSL
  typedef void *SSL;
  #endif
@@@ -94,9 -93,6 +94,9 @@@ struct msg_data 
        unsigned int crlf:1;
  };
  
 +static const char imap_send_usage[] = "git imap-send < <mbox>";
 +
 +#undef DRV_OK
  #define DRV_OK          0
  #define DRV_MSG_BAD     -1
  #define DRV_BOX_BAD     -2
  
  static int Verbose, Quiet;
  
+ __attribute__((format (printf, 1, 2)))
  static void imap_info(const char *, ...);
+ __attribute__((format (printf, 1, 2)))
  static void imap_warn(const char *, ...);
  
  static char *next_arg(char **);
  
  static void free_generic_messages(struct message *);
  
+ __attribute__((format (printf, 3, 4)))
  static int nfsnprintf(char *buf, int blen, const char *fmt, ...);
  
  static int nfvasprintf(char **strp, const char *fmt, va_list ap)
        return len;
  }
  
 -static void arc4_init(void);
 -static unsigned char arc4_getbyte(void);
 -
  struct imap_server_conf {
        char *name;
        char *tunnel;
@@@ -155,7 -157,7 +158,7 @@@ struct imap_list 
  };
  
  struct imap_socket {
 -      int fd;
 +      int fd[2];
        SSL *ssl;
  };
  
@@@ -309,12 -311,8 +312,12 @@@ static int ssl_socket_connect(struct im
                ssl_socket_perror("SSL_new");
                return -1;
        }
 -      if (!SSL_set_fd(sock->ssl, sock->fd)) {
 -              ssl_socket_perror("SSL_set_fd");
 +      if (!SSL_set_rfd(sock->ssl, sock->fd[0])) {
 +              ssl_socket_perror("SSL_set_rfd");
 +              return -1;
 +      }
 +      if (!SSL_set_wfd(sock->ssl, sock->fd[1])) {
 +              ssl_socket_perror("SSL_set_wfd");
                return -1;
        }
  
@@@ -336,12 -334,11 +339,12 @@@ static int socket_read(struct imap_sock
                n = SSL_read(sock->ssl, buf, len);
        else
  #endif
 -              n = xread(sock->fd, buf, len);
 +              n = xread(sock->fd[0], buf, len);
        if (n <= 0) {
                socket_perror("read", sock, n);
 -              close(sock->fd);
 -              sock->fd = -1;
 +              close(sock->fd[0]);
 +              close(sock->fd[1]);
 +              sock->fd[0] = sock->fd[1] = -1;
        }
        return n;
  }
@@@ -354,12 -351,11 +357,12 @@@ static int socket_write(struct imap_soc
                n = SSL_write(sock->ssl, buf, len);
        else
  #endif
 -              n = write_in_full(sock->fd, buf, len);
 +              n = write_in_full(sock->fd[1], buf, len);
        if (n != len) {
                socket_perror("write", sock, n);
 -              close(sock->fd);
 -              sock->fd = -1;
 +              close(sock->fd[0]);
 +              close(sock->fd[1]);
 +              sock->fd[0] = sock->fd[1] = -1;
        }
        return n;
  }
@@@ -372,8 -368,7 +375,8 @@@ static void socket_shutdown(struct imap
                SSL_free(sock->ssl);
        }
  #endif
 -      close(sock->fd);
 +      close(sock->fd[0]);
 +      close(sock->fd[1]);
  }
  
  /* simple line buffering */
@@@ -501,6 -496,52 +504,6 @@@ static int nfsnprintf(char *buf, int bl
        return ret;
  }
  
 -static struct {
 -      unsigned char i, j, s[256];
 -} rs;
 -
 -static void arc4_init(void)
 -{
 -      int i, fd;
 -      unsigned char j, si, dat[128];
 -
 -      if ((fd = open("/dev/urandom", O_RDONLY)) < 0 && (fd = open("/dev/random", O_RDONLY)) < 0) {
 -              fprintf(stderr, "Fatal: no random number source available.\n");
 -              exit(3);
 -      }
 -      if (read_in_full(fd, dat, 128) != 128) {
 -              fprintf(stderr, "Fatal: cannot read random number source.\n");
 -              exit(3);
 -      }
 -      close(fd);
 -
 -      for (i = 0; i < 256; i++)
 -              rs.s[i] = i;
 -      for (i = j = 0; i < 256; i++) {
 -              si = rs.s[i];
 -              j += si + dat[i & 127];
 -              rs.s[i] = rs.s[j];
 -              rs.s[j] = si;
 -      }
 -      rs.i = rs.j = 0;
 -
 -      for (i = 0; i < 256; i++)
 -              arc4_getbyte();
 -}
 -
 -static unsigned char arc4_getbyte(void)
 -{
 -      unsigned char si, sj;
 -
 -      rs.i++;
 -      si = rs.s[rs.i];
 -      rs.j += si;
 -      sj = rs.s[rs.j];
 -      rs.s[rs.i] = sj;
 -      rs.s[rs.j] = si;
 -      return rs.s[(si + sj) & 0xff];
 -}
 -
  static struct imap_cmd *v_issue_imap_cmd(struct imap_store *ctx,
                                         struct imap_cmd_cb *cb,
                                         const char *fmt, va_list ap)
        return cmd;
  }
  
+ __attribute__((format (printf, 3, 4)))
  static struct imap_cmd *issue_imap_cmd(struct imap_store *ctx,
                                       struct imap_cmd_cb *cb,
                                       const char *fmt, ...)
        return ret;
  }
  
+ __attribute__((format (printf, 3, 4)))
  static int imap_exec(struct imap_store *ctx, struct imap_cmd_cb *cb,
                     const char *fmt, ...)
  {
        return get_cmd_result(ctx, cmdp);
  }
  
+ __attribute__((format (printf, 3, 4)))
  static int imap_exec_m(struct imap_store *ctx, struct imap_cmd_cb *cb,
                       const char *fmt, ...)
  {
@@@ -880,7 -924,7 +886,7 @@@ static int get_cmd_result(struct imap_s
                                if (!strcmp("NO", arg)) {
                                        if (cmdp->cb.create && cmd && (cmdp->cb.trycreate || !memcmp(cmd, "[TRYCREATE]", 11))) { /* SELECT, APPEND or UID COPY */
                                                p = strchr(cmdp->cmd, '"');
-                                               if (!issue_imap_cmd(ctx, NULL, "CREATE \"%.*s\"", strchr(p + 1, '"') - p + 1, p)) {
+                                               if (!issue_imap_cmd(ctx, NULL, "CREATE \"%.*s\"", (int)(strchr(p + 1, '"') - p + 1), p)) {
                                                        resp = RESP_BAD;
                                                        goto normal;
                                                }
@@@ -926,7 -970,7 +932,7 @@@ static void imap_close_server(struct im
  {
        struct imap *imap = ictx->imap;
  
 -      if (imap->buf.sock.fd != -1) {
 +      if (imap->buf.sock.fd[0] != -1) {
                imap_exec(ictx, NULL, "LOGOUT");
                socket_shutdown(&imap->buf.sock);
        }
@@@ -948,35 -992,40 +954,35 @@@ static struct store *imap_open_store(st
        struct imap_store *ctx;
        struct imap *imap;
        char *arg, *rsp;
 -      int s = -1, a[2], preauth;
 -      pid_t pid;
 +      int s = -1, preauth;
  
        ctx = xcalloc(sizeof(*ctx), 1);
  
        ctx->imap = imap = xcalloc(sizeof(*imap), 1);
 -      imap->buf.sock.fd = -1;
 +      imap->buf.sock.fd[0] = imap->buf.sock.fd[1] = -1;
        imap->in_progress_append = &imap->in_progress;
  
        /* open connection to IMAP server */
  
        if (srvc->tunnel) {
 -              imap_info("Starting tunnel '%s'... ", srvc->tunnel);
 +              const char *argv[4];
 +              struct child_process tunnel = {0};
  
 -              if (socketpair(PF_UNIX, SOCK_STREAM, 0, a)) {
 -                      perror("socketpair");
 -                      exit(1);
 -              }
 +              imap_info("Starting tunnel '%s'... ", srvc->tunnel);
  
 -              pid = fork();
 -              if (pid < 0)
 -                      _exit(127);
 -              if (!pid) {
 -                      if (dup2(a[0], 0) == -1 || dup2(a[0], 1) == -1)
 -                              _exit(127);
 -                      close(a[0]);
 -                      close(a[1]);
 -                      execl("/bin/sh", "sh", "-c", srvc->tunnel, NULL);
 -                      _exit(127);
 -              }
 +              argv[0] = "sh";
 +              argv[1] = "-c";
 +              argv[2] = srvc->tunnel;
 +              argv[3] = NULL;
  
 -              close(a[0]);
 +              tunnel.argv = argv;
 +              tunnel.in = -1;
 +              tunnel.out = -1;
 +              if (start_command(&tunnel))
 +                      die("cannot start proxy %s", argv[0]);
  
 -              imap->buf.sock.fd = a[1];
 +              imap->buf.sock.fd[0] = tunnel.out;
 +              imap->buf.sock.fd[1] = tunnel.in;
  
                imap_info("ok\n");
        } else {
                        goto bail;
                }
  
 -              imap->buf.sock.fd = s;
 +              imap->buf.sock.fd[0] = s;
 +              imap->buf.sock.fd[1] = dup(s);
  
                if (srvc->use_ssl &&
                    ssl_socket_connect(&imap->buf.sock, 0, srvc->ssl_verify)) {
@@@ -1160,20 -1208,88 +1166,20 @@@ static int imap_make_flags(int flags, c
        return d;
  }
  
 -#define TUIDL 8
 -
 -static int imap_store_msg(struct store *gctx, struct msg_data *data, int *uid)
 +static int imap_store_msg(struct store *gctx, struct msg_data *data)
  {
        struct imap_store *ctx = (struct imap_store *)gctx;
        struct imap *imap = ctx->imap;
        struct imap_cmd_cb cb;
 -      char *fmap, *buf;
        const char *prefix, *box;
 -      int ret, i, j, d, len, extra, nocr;
 -      int start, sbreak = 0, ebreak = 0;
 -      char flagstr[128], tuid[TUIDL * 2 + 1];
 +      int ret, d;
 +      char flagstr[128];
  
        memset(&cb, 0, sizeof(cb));
  
 -      fmap = data->data;
 -      len = data->len;
 -      nocr = !data->crlf;
 -      extra = 0, i = 0;
 -      if (!CAP(UIDPLUS) && uid) {
 -      nloop:
 -              start = i;
 -              while (i < len)
 -                      if (fmap[i++] == '\n') {
 -                              extra += nocr;
 -                              if (i - 2 + nocr == start) {
 -                                      sbreak = ebreak = i - 2 + nocr;
 -                                      goto mktid;
 -                              }
 -                              if (!memcmp(fmap + start, "X-TUID: ", 8)) {
 -                                      extra -= (ebreak = i) - (sbreak = start) + nocr;
 -                                      goto mktid;
 -                              }
 -                              goto nloop;
 -                      }
 -              /* invalid message */
 -              free(fmap);
 -              return DRV_MSG_BAD;
 -      mktid:
 -              for (j = 0; j < TUIDL; j++)
 -                      sprintf(tuid + j * 2, "%02x", arc4_getbyte());
 -              extra += 8 + TUIDL * 2 + 2;
 -      }
 -      if (nocr)
 -              for (; i < len; i++)
 -                      if (fmap[i] == '\n')
 -                              extra++;
 -
 -      cb.dlen = len + extra;
 -      buf = cb.data = xmalloc(cb.dlen);
 -      i = 0;
 -      if (!CAP(UIDPLUS) && uid) {
 -              if (nocr) {
 -                      for (; i < sbreak; i++)
 -                              if (fmap[i] == '\n') {
 -                                      *buf++ = '\r';
 -                                      *buf++ = '\n';
 -                              } else
 -                                      *buf++ = fmap[i];
 -              } else {
 -                      memcpy(buf, fmap, sbreak);
 -                      buf += sbreak;
 -              }
 -              memcpy(buf, "X-TUID: ", 8);
 -              buf += 8;
 -              memcpy(buf, tuid, TUIDL * 2);
 -              buf += TUIDL * 2;
 -              *buf++ = '\r';
 -              *buf++ = '\n';
 -              i = ebreak;
 -      }
 -      if (nocr) {
 -              for (; i < len; i++)
 -                      if (fmap[i] == '\n') {
 -                              *buf++ = '\r';
 -                              *buf++ = '\n';
 -                      } else
 -                              *buf++ = fmap[i];
 -      } else
 -              memcpy(buf, fmap + i, len - i);
 -
 -      free(fmap);
 +      cb.dlen = data->len;
 +      cb.data = xmalloc(cb.dlen);
 +      memcpy(cb.data, data->data, data->len);
  
        d = 0;
        if (data->flags) {
        }
        flagstr[d] = 0;
  
 -      if (!uid) {
 -              box = gctx->conf->trash;
 -              prefix = ctx->prefix;
 -              cb.create = 1;
 -              if (ctx->trashnc)
 -                      imap->caps = imap->rcaps & ~(1 << LITERALPLUS);
 -      } else {
 -              box = gctx->name;
 -              prefix = !strcmp(box, "INBOX") ? "" : ctx->prefix;
 -              cb.create = 0;
 -      }
 -      cb.ctx = uid;
 +      box = gctx->name;
 +      prefix = !strcmp(box, "INBOX") ? "" : ctx->prefix;
 +      cb.create = 0;
        ret = imap_exec_m(ctx, &cb, "APPEND \"%s%s\" %s", prefix, box, flagstr);
        imap->caps = imap->rcaps;
        if (ret != DRV_OK)
                return ret;
 -      if (!uid)
 -              ctx->trashnc = 0;
 -      else
 -              gctx->count++;
 +      gctx->count++;
  
        return DRV_OK;
  }
@@@ -1365,6 -1493,7 +1371,6 @@@ int main(int argc, char **argv
  {
        struct msg_data all_msgs, msg;
        struct store *ctx = NULL;
 -      int uid = 0;
        int ofs = 0;
        int r;
        int total, n = 0;
  
        git_extract_argv0_path(argv[0]);
  
 -      /* init the random number generator */
 -      arc4_init();
 +      if (argc != 1)
 +              usage(imap_send_usage);
  
        setup_git_directory_gently(&nongit_ok);
        git_config(git_imap_config, NULL);
                        break;
                if (server.use_html)
                        wrap_in_html(&msg);
 -              r = imap_store_msg(ctx, &msg, &uid);
 +              r = imap_store_msg(ctx, &msg);
                if (r != DRV_OK)
                        break;
                n++;