Merge branch 'maint-1.6.0' into maint-1.6.1
authorJunio C Hamano <gitster@pobox.com>
Sun, 14 Jun 2009 00:09:45 +0000 (17:09 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sun, 14 Jun 2009 00:09:45 +0000 (17:09 -0700)
* maint-1.6.0:
git-rerere.txt: grammatical fixups and cleanups
http-push.c::remove_locks(): fix use after free

1  2 
http-push.c
diff --combined http-push.c
index cb5bf95a736c571259aef51884cc20e4169bf707,0696da0fec5a4e1f2f089b1f47ff6bb88d1032e7..f743c9796a369a44c84238c244314da3c7b45dab
@@@ -87,7 -87,6 +87,7 @@@ static struct object_list *objects
  struct repo
  {
        char *url;
 +      char *path;
        int path_len;
        int has_info_refs;
        int can_update_info_refs;
@@@ -127,7 -126,7 +127,7 @@@ struct transfer_reques
        char errorstr[CURL_ERROR_SIZE];
        long http_code;
        unsigned char real_sha1[20];
 -      SHA_CTX c;
 +      git_SHA_CTX c;
        z_stream stream;
        int zret;
        int rename;
@@@ -209,8 -208,8 +209,8 @@@ static size_t fwrite_sha1_file(void *pt
        do {
                request->stream.next_out = expn;
                request->stream.avail_out = sizeof(expn);
 -              request->zret = inflate(&request->stream, Z_SYNC_FLUSH);
 -              SHA1_Update(&request->c, expn,
 +              request->zret = git_inflate(&request->stream, Z_SYNC_FLUSH);
 +              git_SHA1_Update(&request->c, expn,
                            sizeof(expn) - request->stream.avail_out);
        } while (request->stream.avail_in && request->zret == Z_OK);
        data_received++;
@@@ -269,9 -268,9 +269,9 @@@ static void start_fetch_loose(struct tr
  
        memset(&request->stream, 0, sizeof(request->stream));
  
 -      inflateInit(&request->stream);
 +      git_inflate_init(&request->stream);
  
 -      SHA1_Init(&request->c);
 +      git_SHA1_Init(&request->c);
  
        url = xmalloc(strlen(remote->url) + 50);
        request->url = xmalloc(strlen(remote->url) + 50);
           file; also rewind to the beginning of the local file. */
        if (prev_read == -1) {
                memset(&request->stream, 0, sizeof(request->stream));
 -              inflateInit(&request->stream);
 -              SHA1_Init(&request->c);
 +              git_inflate_init(&request->stream);
 +              git_SHA1_Init(&request->c);
                if (prev_posn>0) {
                        prev_posn = 0;
                        lseek(request->local_fileno, 0, SEEK_SET);
@@@ -596,7 -595,7 +596,7 @@@ static int refresh_lock(struct remote_l
        lock->refreshing = 1;
  
        if_header = xmalloc(strlen(lock->token) + 25);
 -      sprintf(if_header, "If: (<opaquelocktoken:%s>)", lock->token);
 +      sprintf(if_header, "If: (<%s>)", lock->token);
        sprintf(timeout_header, "Timeout: Second-%ld", lock->timeout);
        dav_headers = curl_slist_append(dav_headers, if_header);
        dav_headers = curl_slist_append(dav_headers, timeout_header);
@@@ -742,8 -741,8 +742,8 @@@ static void finish_request(struct trans
                        if (request->http_code == 416)
                                fprintf(stderr, "Warning: requested range invalid; we may already have all the data.\n");
  
 -                      inflateEnd(&request->stream);
 -                      SHA1_Final(request->real_sha1, &request->c);
 +                      git_inflate_end(&request->stream);
 +                      git_SHA1_Final(request->real_sha1, &request->c);
                        if (request->zret != Z_STREAM_END) {
                                unlink(request->tmpfile);
                        } else if (hashcmp(request->obj->sha1, request->real_sha1)) {
@@@ -1121,8 -1120,10 +1121,8 @@@ static void handle_new_lock_ctx(struct 
                                lock->timeout =
                                        strtol(ctx->cdata + 7, NULL, 10);
                } else if (!strcmp(ctx->name, DAV_ACTIVELOCK_TOKEN)) {
 -                      if (!prefixcmp(ctx->cdata, "opaquelocktoken:")) {
 -                              lock->token = xmalloc(strlen(ctx->cdata) - 15);
 -                              strcpy(lock->token, ctx->cdata + 16);
 -                      }
 +                      lock->token = xmalloc(strlen(ctx->cdata) + 1);
 +                      strcpy(lock->token, ctx->cdata);
                }
        }
  }
@@@ -1201,8 -1202,7 +1201,8 @@@ static struct remote_lock *lock_remote(
        /* Make sure leading directories exist for the remote ref */
        ep = strchr(url + strlen(remote->url) + 1, '/');
        while (ep) {
 -              *ep = 0;
 +              char saved_character = ep[1];
 +              ep[1] = '\0';
                slot = get_active_slot();
                slot->results = &results;
                curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1);
                        free(url);
                        return NULL;
                }
 -              *ep = '/';
 +              ep[1] = saved_character;
                ep = strchr(ep + 1, '/');
        }
  
@@@ -1308,7 -1308,7 +1308,7 @@@ static int unlock_remote(struct remote_
        int rc = 0;
  
        lock_token_header = xmalloc(strlen(lock->token) + 31);
 -      sprintf(lock_token_header, "Lock-Token: <opaquelocktoken:%s>",
 +      sprintf(lock_token_header, "Lock-Token: <%s>",
                lock->token);
        dav_headers = curl_slist_append(dav_headers, lock_token_header);
  
@@@ -1356,8 -1356,9 +1356,9 @@@ static void remove_locks(void
  
        fprintf(stderr, "Removing remote locks...\n");
        while (lock) {
+               struct remote_lock *next = lock->next;
                unlock_remote(lock);
-               lock = lock->next;
+               lock = next;
        }
  }
  
@@@ -1426,17 -1427,9 +1427,17 @@@ static void handle_remote_ls_ctx(struc
                                ls->userFunc(ls);
                        }
                } else if (!strcmp(ctx->name, DAV_PROPFIND_NAME) && ctx->cdata) {
 -                      ls->dentry_name = xmalloc(strlen(ctx->cdata) -
 -                                                remote->path_len + 1);
 -                      strcpy(ls->dentry_name, ctx->cdata + remote->path_len);
 +                      char *path = ctx->cdata;
 +                      if (*ctx->cdata == 'h') {
 +                              path = strstr(path, "//");
 +                              if (path) {
 +                                      path = strchr(path+2, '/');
 +                              }
 +                      }
 +                      if (path) {
 +                              path += remote->path_len;
 +                              ls->dentry_name = xstrdup(path);
 +                      }
                } else if (!strcmp(ctx->name, DAV_PROPFIND_COLLECTION)) {
                        ls->dentry_flags |= IS_DIR;
                }
        }
  }
  
 +/*
 + * NEEDSWORK: remote_ls() ignores info/refs on the remote side.  But it
 + * should _only_ heed the information from that file, instead of trying to
 + * determine the refs from the remote file system (badly: it does not even
 + * know about packed-refs).
 + */
  static void remote_ls(const char *path, int flags,
                      void (*userFunc)(struct remote_ls_ctx *ls),
                      void *userData)
@@@ -1736,7 -1723,7 +1737,7 @@@ static int update_remote(unsigned char 
        struct curl_slist *dav_headers = NULL;
  
        if_header = xmalloc(strlen(lock->token) + 25);
 -      sprintf(if_header, "If: (<opaquelocktoken:%s>)", lock->token);
 +      sprintf(if_header, "If: (<%s>)", lock->token);
        dav_headers = curl_slist_append(dav_headers, if_header);
  
        strbuf_addf(&out_buffer.buf, "%s\n", sha1_to_hex(sha1));
@@@ -1794,7 -1781,7 +1795,7 @@@ static void one_remote_ref(char *refnam
        struct ref *ref;
        struct object *obj;
  
 -      ref = alloc_ref_from_str(refname);
 +      ref = alloc_ref(refname);
  
        if (http_fetch_ref(remote->url, ref) != 0) {
                fprintf(stderr,
@@@ -1901,7 -1888,7 +1902,7 @@@ static void add_remote_info_ref(struct 
        char *ref_info;
        struct ref *ref;
  
 -      ref = alloc_ref_from_str(ls->dentry_name);
 +      ref = alloc_ref(ls->dentry_name);
  
        if (http_fetch_ref(remote->url, ref) != 0) {
                fprintf(stderr,
@@@ -1955,7 -1942,7 +1956,7 @@@ static void update_remote_info_refs(str
                  add_remote_info_ref, &buffer.buf);
        if (!aborted) {
                if_header = xmalloc(strlen(lock->token) + 25);
 -              sprintf(if_header, "If: (<opaquelocktoken:%s>)", lock->token);
 +              sprintf(if_header, "If: (<%s>)", lock->token);
                dav_headers = curl_slist_append(dav_headers, if_header);
  
                slot = get_active_slot();
@@@ -2222,11 -2209,10 +2223,11 @@@ int main(int argc, char **argv
                if (!remote->url) {
                        char *path = strstr(arg, "//");
                        remote->url = arg;
 +                      remote->path_len = strlen(arg);
                        if (path) {
 -                              path = strchr(path+2, '/');
 -                              if (path)
 -                                      remote->path_len = strlen(path);
 +                              remote->path = strchr(path+2, '/');
 +                              if (remote->path)
 +                                      remote->path_len = strlen(remote->path);
                        }
                        continue;
                }
        no_pragma_header = curl_slist_append(no_pragma_header, "Pragma:");
  
        if (remote->url && remote->url[strlen(remote->url)-1] != '/') {
 -              rewritten_url = malloc(strlen(remote->url)+2);
 +              rewritten_url = xmalloc(strlen(remote->url)+2);
                strcpy(rewritten_url, remote->url);
                strcat(rewritten_url, "/");
 +              remote->path = rewritten_url + (remote->path - remote->url);
 +              remote->path_len++;
                remote->url = rewritten_url;
 -              ++remote->path_len;
        }
  
        /* Verify DAV compliance/lock support */