Code

http*: copy string returned by sha1_to_hex
[git.git] / http-walker.c
index bbc3023e40021877a9fd1bba9e36d97ca6e06a23..d6cc622e96d2aaa8ece45c517729b2d949471f4b 100644 (file)
@@ -371,7 +371,8 @@ static void prefetch(struct walker *walker, unsigned char *sha1)
 
 static int fetch_index(struct walker *walker, struct alt_base *repo, unsigned char *sha1)
 {
-       char *hex = sha1_to_hex(sha1);
+       int ret = 0;
+       char *hex = xstrdup(sha1_to_hex(sha1));
        char *filename;
        char *url;
        char tmpfile[PATH_MAX];
@@ -394,18 +395,18 @@ static int fetch_index(struct walker *walker, struct alt_base *repo, unsigned ch
        if (start_active_slot(slot)) {
                run_active_slot(slot);
                if (results.curl_result != CURLE_OK) {
-                       free(url);
-                       return error("Unable to verify pack %s is available",
+                       ret = error("Unable to verify pack %s is available",
                                     hex);
+                       goto cleanup_pack;
                }
        } else {
-               free(url);
-               return error("Unable to start request");
+               ret = error("Unable to start request");
+               goto cleanup_pack;
        }
 
        if (has_pack_index(sha1)) {
-               free(url);
-               return 0;
+               ret = 0;
+               goto cleanup_pack;
        }
 
        if (walker->get_verbosely)
@@ -417,9 +418,9 @@ static int fetch_index(struct walker *walker, struct alt_base *repo, unsigned ch
        snprintf(tmpfile, sizeof(tmpfile), "%s.temp", filename);
        indexfile = fopen(tmpfile, "a");
        if (!indexfile) {
-               free(url);
-               return error("Unable to open local file %s for pack index",
-                            tmpfile);
+               ret = error("Unable to open local file %s for pack index",
+                           tmpfile);
+               goto cleanup_pack;
        }
 
        slot = get_active_slot();
@@ -450,24 +451,24 @@ static int fetch_index(struct walker *walker, struct alt_base *repo, unsigned ch
        if (start_active_slot(slot)) {
                run_active_slot(slot);
                if (results.curl_result != CURLE_OK) {
-                       free(url);
-                       fclose(indexfile);
-                       slot->local = NULL;
-                       return error("Unable to get pack index %s\n%s", url,
-                                    curl_errorstr);
+                       ret = error("Unable to get pack index %s\n%s", url,
+                                   curl_errorstr);
+                       goto cleanup_index;
                }
        } else {
-               free(url);
-               fclose(indexfile);
-               slot->local = NULL;
-               return error("Unable to start request");
+               ret = error("Unable to start request");
+               goto cleanup_index;
        }
 
-       free(url);
+       ret = move_temp_to_file(tmpfile, filename);
+
+cleanup_index:
        fclose(indexfile);
        slot->local = NULL;
-
-       return move_temp_to_file(tmpfile, filename);
+cleanup_pack:
+       free(url);
+       free(hex);
+       return ret;
 }
 
 static int setup_index(struct walker *walker, struct alt_base *repo, unsigned char *sha1)