Merge branch 'rj/http-code-cleanup' into next
authorJunio C Hamano <gitster@pobox.com>
Thu, 15 Mar 2018 22:11:02 +0000 (15:11 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 15 Mar 2018 22:11:03 +0000 (15:11 -0700)
There was an unused file-scope static variable left in http.c when
building for versions of libCURL that is older than 7.19.4, which
has been fixed.

* rj/http-code-cleanup:
http: fix an unused variable warning for 'curl_no_proxy'

1  2 
http.c
diff --combined http.c
index 8c11156ae37591d311d0a3e9ac18c044ceb55e1c,b930c0e628594eb6724ffeeae05fc705372fba0b..a5bd5d62c22c054f82b9971fc1f320c643f1d6fb
--- 1/http.c
--- 2/http.c
+++ b/http.c
  #include "transport.h"
  #include "packfile.h"
  #include "protocol.h"
 +#include "string-list.h"
  
  static struct trace_key trace_curl = TRACE_KEY_INIT(CURL);
 +static int trace_curl_data = 1;
 +static struct string_list cookies_to_redact = STRING_LIST_INIT_DUP;
  #if LIBCURL_VERSION_NUM >= 0x070a08
  long int git_curl_ipresolve = CURL_IPRESOLVE_WHATEVER;
  #else
@@@ -69,6 -66,9 +69,9 @@@ static const char *ssl_key
  #if LIBCURL_VERSION_NUM >= 0x070908
  static const char *ssl_capath;
  #endif
+ #if LIBCURL_VERSION_NUM >= 0x071304
+ static const char *curl_no_proxy;
+ #endif
  #if LIBCURL_VERSION_NUM >= 0x072c00
  static const char *ssl_pinnedkey;
  #endif
@@@ -77,7 -77,6 +80,6 @@@ static long curl_low_speed_limit = -1
  static long curl_low_speed_time = -1;
  static int curl_ftp_no_epsv;
  static const char *curl_http_proxy;
- static const char *curl_no_proxy;
  static const char *http_proxy_authmethod;
  static struct {
        const char *name;
@@@ -578,54 -577,6 +580,54 @@@ static void redact_sensitive_header(str
                /* Everything else is opaque and possibly sensitive */
                strbuf_setlen(header,  sensitive_header - header->buf);
                strbuf_addstr(header, " <redacted>");
 +      } else if (cookies_to_redact.nr &&
 +                 skip_prefix(header->buf, "Cookie:", &sensitive_header)) {
 +              struct strbuf redacted_header = STRBUF_INIT;
 +              char *cookie;
 +
 +              while (isspace(*sensitive_header))
 +                      sensitive_header++;
 +
 +              /*
 +               * The contents of header starting from sensitive_header will
 +               * subsequently be overridden, so it is fine to mutate this
 +               * string (hence the assignment to "char *").
 +               */
 +              cookie = (char *) sensitive_header;
 +
 +              while (cookie) {
 +                      char *equals;
 +                      char *semicolon = strstr(cookie, "; ");
 +                      if (semicolon)
 +                              *semicolon = 0;
 +                      equals = strchrnul(cookie, '=');
 +                      if (!equals) {
 +                              /* invalid cookie, just append and continue */
 +                              strbuf_addstr(&redacted_header, cookie);
 +                              continue;
 +                      }
 +                      *equals = 0; /* temporarily set to NUL for lookup */
 +                      if (string_list_lookup(&cookies_to_redact, cookie)) {
 +                              strbuf_addstr(&redacted_header, cookie);
 +                              strbuf_addstr(&redacted_header, "=<redacted>");
 +                      } else {
 +                              *equals = '=';
 +                              strbuf_addstr(&redacted_header, cookie);
 +                      }
 +                      if (semicolon) {
 +                              /*
 +                               * There are more cookies. (Or, for some
 +                               * reason, the input string ends in "; ".)
 +                               */
 +                              strbuf_addstr(&redacted_header, "; ");
 +                              cookie = semicolon + strlen("; ");
 +                      } else {
 +                              cookie = NULL;
 +                      }
 +              }
 +
 +              strbuf_setlen(header, sensitive_header - header->buf);
 +              strbuf_addbuf(header, &redacted_header);
        }
  }
  
@@@ -696,32 -647,24 +698,32 @@@ static int curl_trace(CURL *handle, cur
                curl_dump_header(text, (unsigned char *)data, size, DO_FILTER);
                break;
        case CURLINFO_DATA_OUT:
 -              text = "=> Send data";
 -              curl_dump_data(text, (unsigned char *)data, size);
 +              if (trace_curl_data) {
 +                      text = "=> Send data";
 +                      curl_dump_data(text, (unsigned char *)data, size);
 +              }
                break;
        case CURLINFO_SSL_DATA_OUT:
 -              text = "=> Send SSL data";
 -              curl_dump_data(text, (unsigned char *)data, size);
 +              if (trace_curl_data) {
 +                      text = "=> Send SSL data";
 +                      curl_dump_data(text, (unsigned char *)data, size);
 +              }
                break;
        case CURLINFO_HEADER_IN:
                text = "<= Recv header";
                curl_dump_header(text, (unsigned char *)data, size, NO_FILTER);
                break;
        case CURLINFO_DATA_IN:
 -              text = "<= Recv data";
 -              curl_dump_data(text, (unsigned char *)data, size);
 +              if (trace_curl_data) {
 +                      text = "<= Recv data";
 +                      curl_dump_data(text, (unsigned char *)data, size);
 +              }
                break;
        case CURLINFO_SSL_DATA_IN:
 -              text = "<= Recv SSL data";
 -              curl_dump_data(text, (unsigned char *)data, size);
 +              if (trace_curl_data) {
 +                      text = "<= Recv SSL data";
 +                      curl_dump_data(text, (unsigned char *)data, size);
 +              }
                break;
  
        default:                /* we ignore unknown types by default */
@@@ -866,13 -809,6 +868,13 @@@ static CURL *get_curl_handle(void
        if (getenv("GIT_CURL_VERBOSE"))
                curl_easy_setopt(result, CURLOPT_VERBOSE, 1L);
        setup_curl_trace(result);
 +      if (getenv("GIT_TRACE_CURL_NO_DATA"))
 +              trace_curl_data = 0;
 +      if (getenv("GIT_REDACT_COOKIES")) {
 +              string_list_split(&cookies_to_redact,
 +                                getenv("GIT_REDACT_COOKIES"), ',', -1);
 +              string_list_sort(&cookies_to_redact);
 +      }
  
        curl_easy_setopt(result, CURLOPT_USERAGENT,
                user_agent ? user_agent : git_user_agent());
@@@ -1260,14 -1196,14 +1262,14 @@@ static struct fill_chain *fill_cfg
  
  void add_fill_function(void *data, int (*fill)(void *))
  {
 -      struct fill_chain *new = xmalloc(sizeof(*new));
 +      struct fill_chain *new_fill = xmalloc(sizeof(*new_fill));
        struct fill_chain **linkp = &fill_cfg;
 -      new->data = data;
 -      new->fill = fill;
 -      new->next = NULL;
 +      new_fill->data = data;
 +      new_fill->fill = fill;
 +      new_fill->next = NULL;
        while (*linkp)
                linkp = &(*linkp)->next;
 -      *linkp = new;
 +      *linkp = new_fill;
  }
  
  void fill_active_slots(void)
@@@ -2234,7 -2170,7 +2236,7 @@@ struct http_object_request *new_http_ob
        unsigned char *sha1)
  {
        char *hex = sha1_to_hex(sha1);
 -      const char *filename;
 +      struct strbuf filename = STRBUF_INIT;
        char prevfile[PATH_MAX];
        int prevlocal;
        char prev_buf[PREV_BUF_SIZE];
        hashcpy(freq->sha1, sha1);
        freq->localfile = -1;
  
 -      filename = sha1_file_name(sha1);
 +      sha1_file_name(&filename, sha1);
        snprintf(freq->tmpfile, sizeof(freq->tmpfile),
 -               "%s.temp", filename);
 +               "%s.temp", filename.buf);
  
 -      snprintf(prevfile, sizeof(prevfile), "%s.prev", filename);
 +      snprintf(prevfile, sizeof(prevfile), "%s.prev", filename.buf);
        unlink_or_warn(prevfile);
        rename(freq->tmpfile, prevfile);
        unlink_or_warn(freq->tmpfile);
 +      strbuf_release(&filename);
  
        if (freq->localfile != -1)
                error("fd leakage in start: %d", freq->localfile);
@@@ -2369,7 -2304,6 +2371,7 @@@ void process_http_object_request(struc
  int finish_http_object_request(struct http_object_request *freq)
  {
        struct stat st;
 +      struct strbuf filename = STRBUF_INIT;
  
        close(freq->localfile);
        freq->localfile = -1;
                unlink_or_warn(freq->tmpfile);
                return -1;
        }
 -      freq->rename =
 -              finalize_object_file(freq->tmpfile, sha1_file_name(freq->sha1));
 +
 +      sha1_file_name(&filename, freq->sha1);
 +      freq->rename = finalize_object_file(freq->tmpfile, filename.buf);
 +      strbuf_release(&filename);
  
        return freq->rename;
  }