http*: copy string returned by sha1_to_hex
authorTay Ray Chuan <rctay89@gmail.com>
Sat, 6 Jun 2009 08:43:36 +0000 (16:43 +0800)
committerJunio C Hamano <gitster@pobox.com>
Sat, 6 Jun 2009 17:56:27 +0000 (10:56 -0700)
In the fetch_index implementations in http-push.c and http-walker.c,
the string returned by sha1_to_hex is assumed to stay immutable.

This patch ensures that hex stays immutable by copying the string
returned by sha1_to_hex (via xstrdup) and frees it subsequently. It
also refactors free()'s and fclose()'s with labels.

Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
http-push.c
http-walker.c

index 64c9bb0f90d70c414aa9cbb15f188789ce087ad1..82018009f3fd52ac207aa0da29376c7dde80e798 100644 (file)
@@ -958,7 +958,8 @@ static int add_send_request(struct object *obj, struct remote_lock *lock)
 
 static int fetch_index(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];
@@ -980,18 +981,18 @@ static int fetch_index(unsigned char *sha1)
        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",
-                                    hex);
+                       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 (push_verbosely)
@@ -1003,9 +1004,9 @@ static int fetch_index(unsigned char *sha1)
        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();
@@ -1036,24 +1037,24 @@ static int fetch_index(unsigned char *sha1)
        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(unsigned char *sha1)
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)