connect.con commit sequencer.c: plug mem leak in git_sequencer_config (f40f3c1)
   1#include "git-compat-util.h"
   2#include "cache.h"
   3#include "config.h"
   4#include "pkt-line.h"
   5#include "quote.h"
   6#include "refs.h"
   7#include "run-command.h"
   8#include "remote.h"
   9#include "connect.h"
  10#include "url.h"
  11#include "string-list.h"
  12#include "sha1-array.h"
  13#include "transport.h"
  14#include "strbuf.h"
  15#include "version.h"
  16#include "protocol.h"
  17
  18static char *server_capabilities_v1;
  19static struct argv_array server_capabilities_v2 = ARGV_ARRAY_INIT;
  20static const char *parse_feature_value(const char *, const char *, int *);
  21
  22static int check_ref(const char *name, unsigned int flags)
  23{
  24        if (!flags)
  25                return 1;
  26
  27        if (!skip_prefix(name, "refs/", &name))
  28                return 0;
  29
  30        /* REF_NORMAL means that we don't want the magic fake tag refs */
  31        if ((flags & REF_NORMAL) && check_refname_format(name, 0))
  32                return 0;
  33
  34        /* REF_HEADS means that we want regular branch heads */
  35        if ((flags & REF_HEADS) && starts_with(name, "heads/"))
  36                return 1;
  37
  38        /* REF_TAGS means that we want tags */
  39        if ((flags & REF_TAGS) && starts_with(name, "tags/"))
  40                return 1;
  41
  42        /* All type bits clear means that we are ok with anything */
  43        return !(flags & ~REF_NORMAL);
  44}
  45
  46int check_ref_type(const struct ref *ref, int flags)
  47{
  48        return check_ref(ref->name, flags);
  49}
  50
  51static NORETURN void die_initial_contact(int unexpected)
  52{
  53        /*
  54         * A hang-up after seeing some response from the other end
  55         * means that it is unexpected, as we know the other end is
  56         * willing to talk to us.  A hang-up before seeing any
  57         * response does not necessarily mean an ACL problem, though.
  58         */
  59        if (unexpected)
  60                die(_("The remote end hung up upon initial contact"));
  61        else
  62                die(_("Could not read from remote repository.\n\n"
  63                      "Please make sure you have the correct access rights\n"
  64                      "and the repository exists."));
  65}
  66
  67/* Checks if the server supports the capability 'c' */
  68int server_supports_v2(const char *c, int die_on_error)
  69{
  70        int i;
  71
  72        for (i = 0; i < server_capabilities_v2.argc; i++) {
  73                const char *out;
  74                if (skip_prefix(server_capabilities_v2.argv[i], c, &out) &&
  75                    (!*out || *out == '='))
  76                        return 1;
  77        }
  78
  79        if (die_on_error)
  80                die("server doesn't support '%s'", c);
  81
  82        return 0;
  83}
  84
  85int server_supports_feature(const char *c, const char *feature,
  86                            int die_on_error)
  87{
  88        int i;
  89
  90        for (i = 0; i < server_capabilities_v2.argc; i++) {
  91                const char *out;
  92                if (skip_prefix(server_capabilities_v2.argv[i], c, &out) &&
  93                    (!*out || *(out++) == '=')) {
  94                        if (parse_feature_request(out, feature))
  95                                return 1;
  96                        else
  97                                break;
  98                }
  99        }
 100
 101        if (die_on_error)
 102                die("server doesn't support feature '%s'", feature);
 103
 104        return 0;
 105}
 106
 107static void process_capabilities_v2(struct packet_reader *reader)
 108{
 109        while (packet_reader_read(reader) == PACKET_READ_NORMAL)
 110                argv_array_push(&server_capabilities_v2, reader->line);
 111
 112        if (reader->status != PACKET_READ_FLUSH)
 113                die("expected flush after capabilities");
 114}
 115
 116enum protocol_version discover_version(struct packet_reader *reader)
 117{
 118        enum protocol_version version = protocol_unknown_version;
 119
 120        /*
 121         * Peek the first line of the server's response to
 122         * determine the protocol version the server is speaking.
 123         */
 124        switch (packet_reader_peek(reader)) {
 125        case PACKET_READ_EOF:
 126                die_initial_contact(0);
 127        case PACKET_READ_FLUSH:
 128        case PACKET_READ_DELIM:
 129                version = protocol_v0;
 130                break;
 131        case PACKET_READ_NORMAL:
 132                version = determine_protocol_version_client(reader->line);
 133                break;
 134        }
 135
 136        switch (version) {
 137        case protocol_v2:
 138                process_capabilities_v2(reader);
 139                break;
 140        case protocol_v1:
 141                /* Read the peeked version line */
 142                packet_reader_read(reader);
 143                break;
 144        case protocol_v0:
 145                break;
 146        case protocol_unknown_version:
 147                BUG("unknown protocol version");
 148        }
 149
 150        return version;
 151}
 152
 153static void parse_one_symref_info(struct string_list *symref, const char *val, int len)
 154{
 155        char *sym, *target;
 156        struct string_list_item *item;
 157
 158        if (!len)
 159                return; /* just "symref" */
 160        /* e.g. "symref=HEAD:refs/heads/master" */
 161        sym = xmemdupz(val, len);
 162        target = strchr(sym, ':');
 163        if (!target)
 164                /* just "symref=something" */
 165                goto reject;
 166        *(target++) = '\0';
 167        if (check_refname_format(sym, REFNAME_ALLOW_ONELEVEL) ||
 168            check_refname_format(target, REFNAME_ALLOW_ONELEVEL))
 169                /* "symref=bogus:pair */
 170                goto reject;
 171        item = string_list_append_nodup(symref, sym);
 172        item->util = target;
 173        return;
 174reject:
 175        free(sym);
 176        return;
 177}
 178
 179static void annotate_refs_with_symref_info(struct ref *ref)
 180{
 181        struct string_list symref = STRING_LIST_INIT_DUP;
 182        const char *feature_list = server_capabilities_v1;
 183
 184        while (feature_list) {
 185                int len;
 186                const char *val;
 187
 188                val = parse_feature_value(feature_list, "symref", &len);
 189                if (!val)
 190                        break;
 191                parse_one_symref_info(&symref, val, len);
 192                feature_list = val + 1;
 193        }
 194        string_list_sort(&symref);
 195
 196        for (; ref; ref = ref->next) {
 197                struct string_list_item *item;
 198                item = string_list_lookup(&symref, ref->name);
 199                if (!item)
 200                        continue;
 201                ref->symref = xstrdup((char *)item->util);
 202        }
 203        string_list_clear(&symref, 0);
 204}
 205
 206static void process_capabilities(const char *line, int *len)
 207{
 208        int nul_location = strlen(line);
 209        if (nul_location == *len)
 210                return;
 211        server_capabilities_v1 = xstrdup(line + nul_location + 1);
 212        *len = nul_location;
 213}
 214
 215static int process_dummy_ref(const char *line)
 216{
 217        struct object_id oid;
 218        const char *name;
 219
 220        if (parse_oid_hex(line, &oid, &name))
 221                return 0;
 222        if (*name != ' ')
 223                return 0;
 224        name++;
 225
 226        return !oidcmp(&null_oid, &oid) && !strcmp(name, "capabilities^{}");
 227}
 228
 229static void check_no_capabilities(const char *line, int len)
 230{
 231        if (strlen(line) != len)
 232                warning("Ignoring capabilities after first line '%s'",
 233                        line + strlen(line));
 234}
 235
 236static int process_ref(const char *line, int len, struct ref ***list,
 237                       unsigned int flags, struct oid_array *extra_have)
 238{
 239        struct object_id old_oid;
 240        const char *name;
 241
 242        if (parse_oid_hex(line, &old_oid, &name))
 243                return 0;
 244        if (*name != ' ')
 245                return 0;
 246        name++;
 247
 248        if (extra_have && !strcmp(name, ".have")) {
 249                oid_array_append(extra_have, &old_oid);
 250        } else if (!strcmp(name, "capabilities^{}")) {
 251                die("protocol error: unexpected capabilities^{}");
 252        } else if (check_ref(name, flags)) {
 253                struct ref *ref = alloc_ref(name);
 254                oidcpy(&ref->old_oid, &old_oid);
 255                **list = ref;
 256                *list = &ref->next;
 257        }
 258        check_no_capabilities(line, len);
 259        return 1;
 260}
 261
 262static int process_shallow(const char *line, int len,
 263                           struct oid_array *shallow_points)
 264{
 265        const char *arg;
 266        struct object_id old_oid;
 267
 268        if (!skip_prefix(line, "shallow ", &arg))
 269                return 0;
 270
 271        if (get_oid_hex(arg, &old_oid))
 272                die("protocol error: expected shallow sha-1, got '%s'", arg);
 273        if (!shallow_points)
 274                die("repository on the other end cannot be shallow");
 275        oid_array_append(shallow_points, &old_oid);
 276        check_no_capabilities(line, len);
 277        return 1;
 278}
 279
 280enum get_remote_heads_state {
 281        EXPECTING_FIRST_REF = 0,
 282        EXPECTING_REF,
 283        EXPECTING_SHALLOW,
 284        EXPECTING_DONE,
 285};
 286
 287/*
 288 * Read all the refs from the other end
 289 */
 290struct ref **get_remote_heads(struct packet_reader *reader,
 291                              struct ref **list, unsigned int flags,
 292                              struct oid_array *extra_have,
 293                              struct oid_array *shallow_points)
 294{
 295        struct ref **orig_list = list;
 296        int len = 0;
 297        enum get_remote_heads_state state = EXPECTING_FIRST_REF;
 298        const char *arg;
 299
 300        *list = NULL;
 301
 302        while (state != EXPECTING_DONE) {
 303                switch (packet_reader_read(reader)) {
 304                case PACKET_READ_EOF:
 305                        die_initial_contact(1);
 306                case PACKET_READ_NORMAL:
 307                        len = reader->pktlen;
 308                        if (len > 4 && skip_prefix(reader->line, "ERR ", &arg))
 309                                die("remote error: %s", arg);
 310                        break;
 311                case PACKET_READ_FLUSH:
 312                        state = EXPECTING_DONE;
 313                        break;
 314                case PACKET_READ_DELIM:
 315                        die("invalid packet");
 316                }
 317
 318                switch (state) {
 319                case EXPECTING_FIRST_REF:
 320                        process_capabilities(reader->line, &len);
 321                        if (process_dummy_ref(reader->line)) {
 322                                state = EXPECTING_SHALLOW;
 323                                break;
 324                        }
 325                        state = EXPECTING_REF;
 326                        /* fallthrough */
 327                case EXPECTING_REF:
 328                        if (process_ref(reader->line, len, &list, flags, extra_have))
 329                                break;
 330                        state = EXPECTING_SHALLOW;
 331                        /* fallthrough */
 332                case EXPECTING_SHALLOW:
 333                        if (process_shallow(reader->line, len, shallow_points))
 334                                break;
 335                        die("protocol error: unexpected '%s'", reader->line);
 336                case EXPECTING_DONE:
 337                        break;
 338                }
 339        }
 340
 341        annotate_refs_with_symref_info(*orig_list);
 342
 343        return list;
 344}
 345
 346/* Returns 1 when a valid ref has been added to `list`, 0 otherwise */
 347static int process_ref_v2(const char *line, struct ref ***list)
 348{
 349        int ret = 1;
 350        int i = 0;
 351        struct object_id old_oid;
 352        struct ref *ref;
 353        struct string_list line_sections = STRING_LIST_INIT_DUP;
 354        const char *end;
 355
 356        /*
 357         * Ref lines have a number of fields which are space deliminated.  The
 358         * first field is the OID of the ref.  The second field is the ref
 359         * name.  Subsequent fields (symref-target and peeled) are optional and
 360         * don't have a particular order.
 361         */
 362        if (string_list_split(&line_sections, line, ' ', -1) < 2) {
 363                ret = 0;
 364                goto out;
 365        }
 366
 367        if (parse_oid_hex(line_sections.items[i++].string, &old_oid, &end) ||
 368            *end) {
 369                ret = 0;
 370                goto out;
 371        }
 372
 373        ref = alloc_ref(line_sections.items[i++].string);
 374
 375        oidcpy(&ref->old_oid, &old_oid);
 376        **list = ref;
 377        *list = &ref->next;
 378
 379        for (; i < line_sections.nr; i++) {
 380                const char *arg = line_sections.items[i].string;
 381                if (skip_prefix(arg, "symref-target:", &arg))
 382                        ref->symref = xstrdup(arg);
 383
 384                if (skip_prefix(arg, "peeled:", &arg)) {
 385                        struct object_id peeled_oid;
 386                        char *peeled_name;
 387                        struct ref *peeled;
 388                        if (parse_oid_hex(arg, &peeled_oid, &end) || *end) {
 389                                ret = 0;
 390                                goto out;
 391                        }
 392
 393                        peeled_name = xstrfmt("%s^{}", ref->name);
 394                        peeled = alloc_ref(peeled_name);
 395
 396                        oidcpy(&peeled->old_oid, &peeled_oid);
 397                        **list = peeled;
 398                        *list = &peeled->next;
 399
 400                        free(peeled_name);
 401                }
 402        }
 403
 404out:
 405        string_list_clear(&line_sections, 0);
 406        return ret;
 407}
 408
 409struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
 410                             struct ref **list, int for_push,
 411                             const struct argv_array *ref_prefixes,
 412                             const struct string_list *server_options)
 413{
 414        int i;
 415        *list = NULL;
 416
 417        if (server_supports_v2("ls-refs", 1))
 418                packet_write_fmt(fd_out, "command=ls-refs\n");
 419
 420        if (server_supports_v2("agent", 0))
 421                packet_write_fmt(fd_out, "agent=%s", git_user_agent_sanitized());
 422
 423        if (server_options && server_options->nr &&
 424            server_supports_v2("server-option", 1))
 425                for (i = 0; i < server_options->nr; i++)
 426                        packet_write_fmt(fd_out, "server-option=%s",
 427                                         server_options->items[i].string);
 428
 429        packet_delim(fd_out);
 430        /* When pushing we don't want to request the peeled tags */
 431        if (!for_push)
 432                packet_write_fmt(fd_out, "peel\n");
 433        packet_write_fmt(fd_out, "symrefs\n");
 434        for (i = 0; ref_prefixes && i < ref_prefixes->argc; i++) {
 435                packet_write_fmt(fd_out, "ref-prefix %s\n",
 436                                 ref_prefixes->argv[i]);
 437        }
 438        packet_flush(fd_out);
 439
 440        /* Process response from server */
 441        while (packet_reader_read(reader) == PACKET_READ_NORMAL) {
 442                if (!process_ref_v2(reader->line, &list))
 443                        die("invalid ls-refs response: %s", reader->line);
 444        }
 445
 446        if (reader->status != PACKET_READ_FLUSH)
 447                die("expected flush after ref listing");
 448
 449        return list;
 450}
 451
 452static const char *parse_feature_value(const char *feature_list, const char *feature, int *lenp)
 453{
 454        int len;
 455
 456        if (!feature_list)
 457                return NULL;
 458
 459        len = strlen(feature);
 460        while (*feature_list) {
 461                const char *found = strstr(feature_list, feature);
 462                if (!found)
 463                        return NULL;
 464                if (feature_list == found || isspace(found[-1])) {
 465                        const char *value = found + len;
 466                        /* feature with no value (e.g., "thin-pack") */
 467                        if (!*value || isspace(*value)) {
 468                                if (lenp)
 469                                        *lenp = 0;
 470                                return value;
 471                        }
 472                        /* feature with a value (e.g., "agent=git/1.2.3") */
 473                        else if (*value == '=') {
 474                                value++;
 475                                if (lenp)
 476                                        *lenp = strcspn(value, " \t\n");
 477                                return value;
 478                        }
 479                        /*
 480                         * otherwise we matched a substring of another feature;
 481                         * keep looking
 482                         */
 483                }
 484                feature_list = found + 1;
 485        }
 486        return NULL;
 487}
 488
 489int parse_feature_request(const char *feature_list, const char *feature)
 490{
 491        return !!parse_feature_value(feature_list, feature, NULL);
 492}
 493
 494const char *server_feature_value(const char *feature, int *len)
 495{
 496        return parse_feature_value(server_capabilities_v1, feature, len);
 497}
 498
 499int server_supports(const char *feature)
 500{
 501        return !!server_feature_value(feature, NULL);
 502}
 503
 504enum protocol {
 505        PROTO_LOCAL = 1,
 506        PROTO_FILE,
 507        PROTO_SSH,
 508        PROTO_GIT
 509};
 510
 511int url_is_local_not_ssh(const char *url)
 512{
 513        const char *colon = strchr(url, ':');
 514        const char *slash = strchr(url, '/');
 515        return !colon || (slash && slash < colon) ||
 516                has_dos_drive_prefix(url);
 517}
 518
 519static const char *prot_name(enum protocol protocol)
 520{
 521        switch (protocol) {
 522                case PROTO_LOCAL:
 523                case PROTO_FILE:
 524                        return "file";
 525                case PROTO_SSH:
 526                        return "ssh";
 527                case PROTO_GIT:
 528                        return "git";
 529                default:
 530                        return "unknown protocol";
 531        }
 532}
 533
 534static enum protocol get_protocol(const char *name)
 535{
 536        if (!strcmp(name, "ssh"))
 537                return PROTO_SSH;
 538        if (!strcmp(name, "git"))
 539                return PROTO_GIT;
 540        if (!strcmp(name, "git+ssh")) /* deprecated - do not use */
 541                return PROTO_SSH;
 542        if (!strcmp(name, "ssh+git")) /* deprecated - do not use */
 543                return PROTO_SSH;
 544        if (!strcmp(name, "file"))
 545                return PROTO_FILE;
 546        die("I don't handle protocol '%s'", name);
 547}
 548
 549static char *host_end(char **hoststart, int removebrackets)
 550{
 551        char *host = *hoststart;
 552        char *end;
 553        char *start = strstr(host, "@[");
 554        if (start)
 555                start++; /* Jump over '@' */
 556        else
 557                start = host;
 558        if (start[0] == '[') {
 559                end = strchr(start + 1, ']');
 560                if (end) {
 561                        if (removebrackets) {
 562                                *end = 0;
 563                                memmove(start, start + 1, end - start);
 564                                end++;
 565                        }
 566                } else
 567                        end = host;
 568        } else
 569                end = host;
 570        return end;
 571}
 572
 573#define STR_(s) # s
 574#define STR(s)  STR_(s)
 575
 576static void get_host_and_port(char **host, const char **port)
 577{
 578        char *colon, *end;
 579        end = host_end(host, 1);
 580        colon = strchr(end, ':');
 581        if (colon) {
 582                long portnr = strtol(colon + 1, &end, 10);
 583                if (end != colon + 1 && *end == '\0' && 0 <= portnr && portnr < 65536) {
 584                        *colon = 0;
 585                        *port = colon + 1;
 586                } else if (!colon[1]) {
 587                        *colon = 0;
 588                }
 589        }
 590}
 591
 592static void enable_keepalive(int sockfd)
 593{
 594        int ka = 1;
 595
 596        if (setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &ka, sizeof(ka)) < 0)
 597                fprintf(stderr, "unable to set SO_KEEPALIVE on socket: %s\n",
 598                        strerror(errno));
 599}
 600
 601#ifndef NO_IPV6
 602
 603static const char *ai_name(const struct addrinfo *ai)
 604{
 605        static char addr[NI_MAXHOST];
 606        if (getnameinfo(ai->ai_addr, ai->ai_addrlen, addr, sizeof(addr), NULL, 0,
 607                        NI_NUMERICHOST) != 0)
 608                xsnprintf(addr, sizeof(addr), "(unknown)");
 609
 610        return addr;
 611}
 612
 613/*
 614 * Returns a connected socket() fd, or else die()s.
 615 */
 616static int git_tcp_connect_sock(char *host, int flags)
 617{
 618        struct strbuf error_message = STRBUF_INIT;
 619        int sockfd = -1;
 620        const char *port = STR(DEFAULT_GIT_PORT);
 621        struct addrinfo hints, *ai0, *ai;
 622        int gai;
 623        int cnt = 0;
 624
 625        get_host_and_port(&host, &port);
 626        if (!*port)
 627                port = "<none>";
 628
 629        memset(&hints, 0, sizeof(hints));
 630        if (flags & CONNECT_IPV4)
 631                hints.ai_family = AF_INET;
 632        else if (flags & CONNECT_IPV6)
 633                hints.ai_family = AF_INET6;
 634        hints.ai_socktype = SOCK_STREAM;
 635        hints.ai_protocol = IPPROTO_TCP;
 636
 637        if (flags & CONNECT_VERBOSE)
 638                fprintf(stderr, "Looking up %s ... ", host);
 639
 640        gai = getaddrinfo(host, port, &hints, &ai);
 641        if (gai)
 642                die("Unable to look up %s (port %s) (%s)", host, port, gai_strerror(gai));
 643
 644        if (flags & CONNECT_VERBOSE)
 645                fprintf(stderr, "done.\nConnecting to %s (port %s) ... ", host, port);
 646
 647        for (ai0 = ai; ai; ai = ai->ai_next, cnt++) {
 648                sockfd = socket(ai->ai_family,
 649                                ai->ai_socktype, ai->ai_protocol);
 650                if ((sockfd < 0) ||
 651                    (connect(sockfd, ai->ai_addr, ai->ai_addrlen) < 0)) {
 652                        strbuf_addf(&error_message, "%s[%d: %s]: errno=%s\n",
 653                                    host, cnt, ai_name(ai), strerror(errno));
 654                        if (0 <= sockfd)
 655                                close(sockfd);
 656                        sockfd = -1;
 657                        continue;
 658                }
 659                if (flags & CONNECT_VERBOSE)
 660                        fprintf(stderr, "%s ", ai_name(ai));
 661                break;
 662        }
 663
 664        freeaddrinfo(ai0);
 665
 666        if (sockfd < 0)
 667                die("unable to connect to %s:\n%s", host, error_message.buf);
 668
 669        enable_keepalive(sockfd);
 670
 671        if (flags & CONNECT_VERBOSE)
 672                fprintf(stderr, "done.\n");
 673
 674        strbuf_release(&error_message);
 675
 676        return sockfd;
 677}
 678
 679#else /* NO_IPV6 */
 680
 681/*
 682 * Returns a connected socket() fd, or else die()s.
 683 */
 684static int git_tcp_connect_sock(char *host, int flags)
 685{
 686        struct strbuf error_message = STRBUF_INIT;
 687        int sockfd = -1;
 688        const char *port = STR(DEFAULT_GIT_PORT);
 689        char *ep;
 690        struct hostent *he;
 691        struct sockaddr_in sa;
 692        char **ap;
 693        unsigned int nport;
 694        int cnt;
 695
 696        get_host_and_port(&host, &port);
 697
 698        if (flags & CONNECT_VERBOSE)
 699                fprintf(stderr, "Looking up %s ... ", host);
 700
 701        he = gethostbyname(host);
 702        if (!he)
 703                die("Unable to look up %s (%s)", host, hstrerror(h_errno));
 704        nport = strtoul(port, &ep, 10);
 705        if ( ep == port || *ep ) {
 706                /* Not numeric */
 707                struct servent *se = getservbyname(port,"tcp");
 708                if ( !se )
 709                        die("Unknown port %s", port);
 710                nport = se->s_port;
 711        }
 712
 713        if (flags & CONNECT_VERBOSE)
 714                fprintf(stderr, "done.\nConnecting to %s (port %s) ... ", host, port);
 715
 716        for (cnt = 0, ap = he->h_addr_list; *ap; ap++, cnt++) {
 717                memset(&sa, 0, sizeof sa);
 718                sa.sin_family = he->h_addrtype;
 719                sa.sin_port = htons(nport);
 720                memcpy(&sa.sin_addr, *ap, he->h_length);
 721
 722                sockfd = socket(he->h_addrtype, SOCK_STREAM, 0);
 723                if ((sockfd < 0) ||
 724                    connect(sockfd, (struct sockaddr *)&sa, sizeof sa) < 0) {
 725                        strbuf_addf(&error_message, "%s[%d: %s]: errno=%s\n",
 726                                host,
 727                                cnt,
 728                                inet_ntoa(*(struct in_addr *)&sa.sin_addr),
 729                                strerror(errno));
 730                        if (0 <= sockfd)
 731                                close(sockfd);
 732                        sockfd = -1;
 733                        continue;
 734                }
 735                if (flags & CONNECT_VERBOSE)
 736                        fprintf(stderr, "%s ",
 737                                inet_ntoa(*(struct in_addr *)&sa.sin_addr));
 738                break;
 739        }
 740
 741        if (sockfd < 0)
 742                die("unable to connect to %s:\n%s", host, error_message.buf);
 743
 744        enable_keepalive(sockfd);
 745
 746        if (flags & CONNECT_VERBOSE)
 747                fprintf(stderr, "done.\n");
 748
 749        return sockfd;
 750}
 751
 752#endif /* NO_IPV6 */
 753
 754
 755/*
 756 * Dummy child_process returned by git_connect() if the transport protocol
 757 * does not need fork(2).
 758 */
 759static struct child_process no_fork = CHILD_PROCESS_INIT;
 760
 761int git_connection_is_socket(struct child_process *conn)
 762{
 763        return conn == &no_fork;
 764}
 765
 766static struct child_process *git_tcp_connect(int fd[2], char *host, int flags)
 767{
 768        int sockfd = git_tcp_connect_sock(host, flags);
 769
 770        fd[0] = sockfd;
 771        fd[1] = dup(sockfd);
 772
 773        return &no_fork;
 774}
 775
 776
 777static char *git_proxy_command;
 778
 779static int git_proxy_command_options(const char *var, const char *value,
 780                void *cb)
 781{
 782        if (!strcmp(var, "core.gitproxy")) {
 783                const char *for_pos;
 784                int matchlen = -1;
 785                int hostlen;
 786                const char *rhost_name = cb;
 787                int rhost_len = strlen(rhost_name);
 788
 789                if (git_proxy_command)
 790                        return 0;
 791                if (!value)
 792                        return config_error_nonbool(var);
 793                /* [core]
 794                 * ;# matches www.kernel.org as well
 795                 * gitproxy = netcatter-1 for kernel.org
 796                 * gitproxy = netcatter-2 for sample.xz
 797                 * gitproxy = netcatter-default
 798                 */
 799                for_pos = strstr(value, " for ");
 800                if (!for_pos)
 801                        /* matches everybody */
 802                        matchlen = strlen(value);
 803                else {
 804                        hostlen = strlen(for_pos + 5);
 805                        if (rhost_len < hostlen)
 806                                matchlen = -1;
 807                        else if (!strncmp(for_pos + 5,
 808                                          rhost_name + rhost_len - hostlen,
 809                                          hostlen) &&
 810                                 ((rhost_len == hostlen) ||
 811                                  rhost_name[rhost_len - hostlen -1] == '.'))
 812                                matchlen = for_pos - value;
 813                        else
 814                                matchlen = -1;
 815                }
 816                if (0 <= matchlen) {
 817                        /* core.gitproxy = none for kernel.org */
 818                        if (matchlen == 4 &&
 819                            !memcmp(value, "none", 4))
 820                                matchlen = 0;
 821                        git_proxy_command = xmemdupz(value, matchlen);
 822                }
 823                return 0;
 824        }
 825
 826        return git_default_config(var, value, cb);
 827}
 828
 829static int git_use_proxy(const char *host)
 830{
 831        git_proxy_command = getenv("GIT_PROXY_COMMAND");
 832        git_config(git_proxy_command_options, (void*)host);
 833        return (git_proxy_command && *git_proxy_command);
 834}
 835
 836static struct child_process *git_proxy_connect(int fd[2], char *host)
 837{
 838        const char *port = STR(DEFAULT_GIT_PORT);
 839        struct child_process *proxy;
 840
 841        get_host_and_port(&host, &port);
 842
 843        if (looks_like_command_line_option(host))
 844                die("strange hostname '%s' blocked", host);
 845        if (looks_like_command_line_option(port))
 846                die("strange port '%s' blocked", port);
 847
 848        proxy = xmalloc(sizeof(*proxy));
 849        child_process_init(proxy);
 850        argv_array_push(&proxy->args, git_proxy_command);
 851        argv_array_push(&proxy->args, host);
 852        argv_array_push(&proxy->args, port);
 853        proxy->in = -1;
 854        proxy->out = -1;
 855        if (start_command(proxy))
 856                die("cannot start proxy %s", git_proxy_command);
 857        fd[0] = proxy->out; /* read from proxy stdout */
 858        fd[1] = proxy->in;  /* write to proxy stdin */
 859        return proxy;
 860}
 861
 862static char *get_port(char *host)
 863{
 864        char *end;
 865        char *p = strchr(host, ':');
 866
 867        if (p) {
 868                long port = strtol(p + 1, &end, 10);
 869                if (end != p + 1 && *end == '\0' && 0 <= port && port < 65536) {
 870                        *p = '\0';
 871                        return p+1;
 872                }
 873        }
 874
 875        return NULL;
 876}
 877
 878/*
 879 * Extract protocol and relevant parts from the specified connection URL.
 880 * The caller must free() the returned strings.
 881 */
 882static enum protocol parse_connect_url(const char *url_orig, char **ret_host,
 883                                       char **ret_path)
 884{
 885        char *url;
 886        char *host, *path;
 887        char *end;
 888        int separator = '/';
 889        enum protocol protocol = PROTO_LOCAL;
 890
 891        if (is_url(url_orig))
 892                url = url_decode(url_orig);
 893        else
 894                url = xstrdup(url_orig);
 895
 896        host = strstr(url, "://");
 897        if (host) {
 898                *host = '\0';
 899                protocol = get_protocol(url);
 900                host += 3;
 901        } else {
 902                host = url;
 903                if (!url_is_local_not_ssh(url)) {
 904                        protocol = PROTO_SSH;
 905                        separator = ':';
 906                }
 907        }
 908
 909        /*
 910         * Don't do destructive transforms as protocol code does
 911         * '[]' unwrapping in get_host_and_port()
 912         */
 913        end = host_end(&host, 0);
 914
 915        if (protocol == PROTO_LOCAL)
 916                path = end;
 917        else if (protocol == PROTO_FILE && has_dos_drive_prefix(end))
 918                path = end; /* "file://$(pwd)" may be "file://C:/projects/repo" */
 919        else
 920                path = strchr(end, separator);
 921
 922        if (!path || !*path)
 923                die("No path specified. See 'man git-pull' for valid url syntax");
 924
 925        /*
 926         * null-terminate hostname and point path to ~ for URL's like this:
 927         *    ssh://host.xz/~user/repo
 928         */
 929
 930        end = path; /* Need to \0 terminate host here */
 931        if (separator == ':')
 932                path++; /* path starts after ':' */
 933        if (protocol == PROTO_GIT || protocol == PROTO_SSH) {
 934                if (path[1] == '~')
 935                        path++;
 936        }
 937
 938        path = xstrdup(path);
 939        *end = '\0';
 940
 941        *ret_host = xstrdup(host);
 942        *ret_path = path;
 943        free(url);
 944        return protocol;
 945}
 946
 947static const char *get_ssh_command(void)
 948{
 949        const char *ssh;
 950
 951        if ((ssh = getenv("GIT_SSH_COMMAND")))
 952                return ssh;
 953
 954        if (!git_config_get_string_const("core.sshcommand", &ssh))
 955                return ssh;
 956
 957        return NULL;
 958}
 959
 960enum ssh_variant {
 961        VARIANT_AUTO,
 962        VARIANT_SIMPLE,
 963        VARIANT_SSH,
 964        VARIANT_PLINK,
 965        VARIANT_PUTTY,
 966        VARIANT_TORTOISEPLINK,
 967};
 968
 969static void override_ssh_variant(enum ssh_variant *ssh_variant)
 970{
 971        const char *variant = getenv("GIT_SSH_VARIANT");
 972
 973        if (!variant && git_config_get_string_const("ssh.variant", &variant))
 974                return;
 975
 976        if (!strcmp(variant, "auto"))
 977                *ssh_variant = VARIANT_AUTO;
 978        else if (!strcmp(variant, "plink"))
 979                *ssh_variant = VARIANT_PLINK;
 980        else if (!strcmp(variant, "putty"))
 981                *ssh_variant = VARIANT_PUTTY;
 982        else if (!strcmp(variant, "tortoiseplink"))
 983                *ssh_variant = VARIANT_TORTOISEPLINK;
 984        else if (!strcmp(variant, "simple"))
 985                *ssh_variant = VARIANT_SIMPLE;
 986        else
 987                *ssh_variant = VARIANT_SSH;
 988}
 989
 990static enum ssh_variant determine_ssh_variant(const char *ssh_command,
 991                                              int is_cmdline)
 992{
 993        enum ssh_variant ssh_variant = VARIANT_AUTO;
 994        const char *variant;
 995        char *p = NULL;
 996
 997        override_ssh_variant(&ssh_variant);
 998
 999        if (ssh_variant != VARIANT_AUTO)
1000                return ssh_variant;
1001
1002        if (!is_cmdline) {
1003                p = xstrdup(ssh_command);
1004                variant = basename(p);
1005        } else {
1006                const char **ssh_argv;
1007
1008                p = xstrdup(ssh_command);
1009                if (split_cmdline(p, &ssh_argv) > 0) {
1010                        variant = basename((char *)ssh_argv[0]);
1011                        /*
1012                         * At this point, variant points into the buffer
1013                         * referenced by p, hence we do not need ssh_argv
1014                         * any longer.
1015                         */
1016                        free(ssh_argv);
1017                } else {
1018                        free(p);
1019                        return ssh_variant;
1020                }
1021        }
1022
1023        if (!strcasecmp(variant, "ssh") ||
1024            !strcasecmp(variant, "ssh.exe"))
1025                ssh_variant = VARIANT_SSH;
1026        else if (!strcasecmp(variant, "plink") ||
1027                 !strcasecmp(variant, "plink.exe"))
1028                ssh_variant = VARIANT_PLINK;
1029        else if (!strcasecmp(variant, "tortoiseplink") ||
1030                 !strcasecmp(variant, "tortoiseplink.exe"))
1031                ssh_variant = VARIANT_TORTOISEPLINK;
1032
1033        free(p);
1034        return ssh_variant;
1035}
1036
1037/*
1038 * Open a connection using Git's native protocol.
1039 *
1040 * The caller is responsible for freeing hostandport, but this function may
1041 * modify it (for example, to truncate it to remove the port part).
1042 */
1043static struct child_process *git_connect_git(int fd[2], char *hostandport,
1044                                             const char *path, const char *prog,
1045                                             enum protocol_version version,
1046                                             int flags)
1047{
1048        struct child_process *conn;
1049        struct strbuf request = STRBUF_INIT;
1050        /*
1051         * Set up virtual host information based on where we will
1052         * connect, unless the user has overridden us in
1053         * the environment.
1054         */
1055        char *target_host = getenv("GIT_OVERRIDE_VIRTUAL_HOST");
1056        if (target_host)
1057                target_host = xstrdup(target_host);
1058        else
1059                target_host = xstrdup(hostandport);
1060
1061        transport_check_allowed("git");
1062
1063        /*
1064         * These underlying connection commands die() if they
1065         * cannot connect.
1066         */
1067        if (git_use_proxy(hostandport))
1068                conn = git_proxy_connect(fd, hostandport);
1069        else
1070                conn = git_tcp_connect(fd, hostandport, flags);
1071        /*
1072         * Separate original protocol components prog and path
1073         * from extended host header with a NUL byte.
1074         *
1075         * Note: Do not add any other headers here!  Doing so
1076         * will cause older git-daemon servers to crash.
1077         */
1078        strbuf_addf(&request,
1079                    "%s %s%chost=%s%c",
1080                    prog, path, 0,
1081                    target_host, 0);
1082
1083        /* If using a new version put that stuff here after a second null byte */
1084        if (version > 0) {
1085                strbuf_addch(&request, '\0');
1086                strbuf_addf(&request, "version=%d%c",
1087                            version, '\0');
1088        }
1089
1090        packet_write(fd[1], request.buf, request.len);
1091
1092        free(target_host);
1093        strbuf_release(&request);
1094        return conn;
1095}
1096
1097/*
1098 * Append the appropriate environment variables to `env` and options to
1099 * `args` for running ssh in Git's SSH-tunneled transport.
1100 */
1101static void push_ssh_options(struct argv_array *args, struct argv_array *env,
1102                             enum ssh_variant variant, const char *port,
1103                             enum protocol_version version, int flags)
1104{
1105        if (variant == VARIANT_SSH &&
1106            version > 0) {
1107                argv_array_push(args, "-o");
1108                argv_array_push(args, "SendEnv=" GIT_PROTOCOL_ENVIRONMENT);
1109                argv_array_pushf(env, GIT_PROTOCOL_ENVIRONMENT "=version=%d",
1110                                 version);
1111        }
1112
1113        if (flags & CONNECT_IPV4) {
1114                switch (variant) {
1115                case VARIANT_AUTO:
1116                        BUG("VARIANT_AUTO passed to push_ssh_options");
1117                case VARIANT_SIMPLE:
1118                        die("ssh variant 'simple' does not support -4");
1119                case VARIANT_SSH:
1120                case VARIANT_PLINK:
1121                case VARIANT_PUTTY:
1122                case VARIANT_TORTOISEPLINK:
1123                        argv_array_push(args, "-4");
1124                }
1125        } else if (flags & CONNECT_IPV6) {
1126                switch (variant) {
1127                case VARIANT_AUTO:
1128                        BUG("VARIANT_AUTO passed to push_ssh_options");
1129                case VARIANT_SIMPLE:
1130                        die("ssh variant 'simple' does not support -6");
1131                case VARIANT_SSH:
1132                case VARIANT_PLINK:
1133                case VARIANT_PUTTY:
1134                case VARIANT_TORTOISEPLINK:
1135                        argv_array_push(args, "-6");
1136                }
1137        }
1138
1139        if (variant == VARIANT_TORTOISEPLINK)
1140                argv_array_push(args, "-batch");
1141
1142        if (port) {
1143                switch (variant) {
1144                case VARIANT_AUTO:
1145                        BUG("VARIANT_AUTO passed to push_ssh_options");
1146                case VARIANT_SIMPLE:
1147                        die("ssh variant 'simple' does not support setting port");
1148                case VARIANT_SSH:
1149                        argv_array_push(args, "-p");
1150                        break;
1151                case VARIANT_PLINK:
1152                case VARIANT_PUTTY:
1153                case VARIANT_TORTOISEPLINK:
1154                        argv_array_push(args, "-P");
1155                }
1156
1157                argv_array_push(args, port);
1158        }
1159}
1160
1161/* Prepare a child_process for use by Git's SSH-tunneled transport. */
1162static void fill_ssh_args(struct child_process *conn, const char *ssh_host,
1163                          const char *port, enum protocol_version version,
1164                          int flags)
1165{
1166        const char *ssh;
1167        enum ssh_variant variant;
1168
1169        if (looks_like_command_line_option(ssh_host))
1170                die("strange hostname '%s' blocked", ssh_host);
1171
1172        ssh = get_ssh_command();
1173        if (ssh) {
1174                variant = determine_ssh_variant(ssh, 1);
1175        } else {
1176                /*
1177                 * GIT_SSH is the no-shell version of
1178                 * GIT_SSH_COMMAND (and must remain so for
1179                 * historical compatibility).
1180                 */
1181                conn->use_shell = 0;
1182
1183                ssh = getenv("GIT_SSH");
1184                if (!ssh)
1185                        ssh = "ssh";
1186                variant = determine_ssh_variant(ssh, 0);
1187        }
1188
1189        if (variant == VARIANT_AUTO) {
1190                struct child_process detect = CHILD_PROCESS_INIT;
1191
1192                detect.use_shell = conn->use_shell;
1193                detect.no_stdin = detect.no_stdout = detect.no_stderr = 1;
1194
1195                argv_array_push(&detect.args, ssh);
1196                argv_array_push(&detect.args, "-G");
1197                push_ssh_options(&detect.args, &detect.env_array,
1198                                 VARIANT_SSH, port, version, flags);
1199                argv_array_push(&detect.args, ssh_host);
1200
1201                variant = run_command(&detect) ? VARIANT_SIMPLE : VARIANT_SSH;
1202        }
1203
1204        argv_array_push(&conn->args, ssh);
1205        push_ssh_options(&conn->args, &conn->env_array, variant, port, version, flags);
1206        argv_array_push(&conn->args, ssh_host);
1207}
1208
1209/*
1210 * This returns the dummy child_process `no_fork` if the transport protocol
1211 * does not need fork(2), or a struct child_process object if it does.  Once
1212 * done, finish the connection with finish_connect() with the value returned
1213 * from this function (it is safe to call finish_connect() with NULL to
1214 * support the former case).
1215 *
1216 * If it returns, the connect is successful; it just dies on errors (this
1217 * will hopefully be changed in a libification effort, to return NULL when
1218 * the connection failed).
1219 */
1220struct child_process *git_connect(int fd[2], const char *url,
1221                                  const char *prog, int flags)
1222{
1223        char *hostandport, *path;
1224        struct child_process *conn;
1225        enum protocol protocol;
1226        enum protocol_version version = get_protocol_version_config();
1227
1228        /*
1229         * NEEDSWORK: If we are trying to use protocol v2 and we are planning
1230         * to perform a push, then fallback to v0 since the client doesn't know
1231         * how to push yet using v2.
1232         */
1233        if (version == protocol_v2 && !strcmp("git-receive-pack", prog))
1234                version = protocol_v0;
1235
1236        /* Without this we cannot rely on waitpid() to tell
1237         * what happened to our children.
1238         */
1239        signal(SIGCHLD, SIG_DFL);
1240
1241        protocol = parse_connect_url(url, &hostandport, &path);
1242        if ((flags & CONNECT_DIAG_URL) && (protocol != PROTO_SSH)) {
1243                printf("Diag: url=%s\n", url ? url : "NULL");
1244                printf("Diag: protocol=%s\n", prot_name(protocol));
1245                printf("Diag: hostandport=%s\n", hostandport ? hostandport : "NULL");
1246                printf("Diag: path=%s\n", path ? path : "NULL");
1247                conn = NULL;
1248        } else if (protocol == PROTO_GIT) {
1249                conn = git_connect_git(fd, hostandport, path, prog, version, flags);
1250        } else {
1251                struct strbuf cmd = STRBUF_INIT;
1252                const char *const *var;
1253
1254                conn = xmalloc(sizeof(*conn));
1255                child_process_init(conn);
1256
1257                if (looks_like_command_line_option(path))
1258                        die("strange pathname '%s' blocked", path);
1259
1260                strbuf_addstr(&cmd, prog);
1261                strbuf_addch(&cmd, ' ');
1262                sq_quote_buf(&cmd, path);
1263
1264                /* remove repo-local variables from the environment */
1265                for (var = local_repo_env; *var; var++)
1266                        argv_array_push(&conn->env_array, *var);
1267
1268                conn->use_shell = 1;
1269                conn->in = conn->out = -1;
1270                if (protocol == PROTO_SSH) {
1271                        char *ssh_host = hostandport;
1272                        const char *port = NULL;
1273                        transport_check_allowed("ssh");
1274                        get_host_and_port(&ssh_host, &port);
1275
1276                        if (!port)
1277                                port = get_port(ssh_host);
1278
1279                        if (flags & CONNECT_DIAG_URL) {
1280                                printf("Diag: url=%s\n", url ? url : "NULL");
1281                                printf("Diag: protocol=%s\n", prot_name(protocol));
1282                                printf("Diag: userandhost=%s\n", ssh_host ? ssh_host : "NULL");
1283                                printf("Diag: port=%s\n", port ? port : "NONE");
1284                                printf("Diag: path=%s\n", path ? path : "NULL");
1285
1286                                free(hostandport);
1287                                free(path);
1288                                free(conn);
1289                                strbuf_release(&cmd);
1290                                return NULL;
1291                        }
1292                        fill_ssh_args(conn, ssh_host, port, version, flags);
1293                } else {
1294                        transport_check_allowed("file");
1295                        if (version > 0) {
1296                                argv_array_pushf(&conn->env_array, GIT_PROTOCOL_ENVIRONMENT "=version=%d",
1297                                                 version);
1298                        }
1299                }
1300                argv_array_push(&conn->args, cmd.buf);
1301
1302                if (start_command(conn))
1303                        die("unable to fork");
1304
1305                fd[0] = conn->out; /* read from child's stdout */
1306                fd[1] = conn->in;  /* write to child's stdin */
1307                strbuf_release(&cmd);
1308        }
1309        free(hostandport);
1310        free(path);
1311        return conn;
1312}
1313
1314int finish_connect(struct child_process *conn)
1315{
1316        int code;
1317        if (!conn || git_connection_is_socket(conn))
1318                return 0;
1319
1320        code = finish_command(conn);
1321        free(conn);
1322        return code;
1323}