From: Tay Ray Chuan <rctay89@gmail•com>
To: Tay Ray Chuan <rctay89@gmail•com>
Cc: Clemens Buchacher <drizzd@aon•at>,
git@vger•kernel.org,
Johannes Schindelin <Johannes.Schindelin@gmx•de>
Subject: [PATCH] http*: cleanup slot->local after fclose
Date: Sun, 31 May 2009 00:09:55 +0800 [thread overview]
Message-ID: <20090531000955.953725d9.rctay89@gmail.com> (raw)
In-Reply-To: <20090530230153.527532b0.rctay89@gmail.com>
Set slot->local to NULL after doing a fclose on the FILE* pointer it
points to.
Move NULL assignment to request->slot from
http-push.c::finish_request() to http-push.c::release_request(). This
is safe, since the functions finish_request() invoke will overwrite
request->slot anyway.
Refactor http-push.c::fetch_index(), http-walker.c::fetch_index() and
http-walker.c::fetch_pack() to use labels while cleaning up.
This fixes the issue raised by Clemens Buchacher on 30th May:
http://www.spinics.net/lists/git/msg104623.html
Signed-off-by: Tay Ray Chuan <rctay89@gmail•com>
---
This applies on master, and is a resend, this time with the subject.
http-push.c | 23 ++++++++++++++---------
http-walker.c | 36 +++++++++++++++++++++++-------------
2 files changed, 37 insertions(+), 22 deletions(-)
diff --git a/http-push.c b/http-push.c
index dac2c6e..816824a 100644
--- a/http-push.c
+++ b/http-push.c
@@ -715,6 +715,8 @@ static void release_request(struct transfer_request *request)
close(request->local_fileno);
if (request->local_stream)
fclose(request->local_stream);
+ if (request->slot)
+ request->slot = NULL;
free(request->url);
free(request);
}
@@ -727,7 +729,6 @@ static void finish_request(struct transfer_request *request)
request->curl_result = request->slot->curl_result;
request->http_code = request->slot->http_code;
- request->slot = NULL;
/* Keep locks active */
check_locks();
@@ -823,6 +824,7 @@ static void finish_request(struct transfer_request *request)
fclose(request->local_stream);
request->local_stream = NULL;
+ request->slot->local = NULL;
if (!move_temp_to_file(request->tmpfile,
request->filename)) {
target = (struct packed_git *)request->userData;
@@ -946,6 +948,7 @@ static int add_send_request(struct object *obj, struct remote_lock *lock)
static int fetch_index(unsigned char *sha1)
{
+ int ret;
char *hex = sha1_to_hex(sha1);
char *filename;
char *url;
@@ -1022,21 +1025,23 @@ 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);
- 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;
}
} else {
- free(url);
- fclose(indexfile);
- return error("Unable to start request");
+ ret = error("Unable to start request");
+ goto cleanup;
}
+ ret = move_temp_to_file(tmpfile, filename);
+
+cleanup:
free(url);
fclose(indexfile);
+ slot->local = NULL;
- return move_temp_to_file(tmpfile, filename);
+ return ret;
}
static int setup_index(unsigned char *sha1)
diff --git a/http-walker.c b/http-walker.c
index 7321ccc..779947d 100644
--- a/http-walker.c
+++ b/http-walker.c
@@ -364,6 +364,7 @@ static void prefetch(struct walker *walker, unsigned char *sha1)
static int fetch_index(struct walker *walker, struct alt_base *repo, unsigned char *sha1)
{
+ int ret;
char *hex = sha1_to_hex(sha1);
char *filename;
char *url;
@@ -417,18 +418,21 @@ 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) {
- fclose(indexfile);
- 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;
}
} else {
- fclose(indexfile);
- return error("Unable to start request");
+ ret = error("Unable to start request");
+ goto cleanup;
}
- fclose(indexfile);
+ ret = move_temp_to_file(tmpfile, filename);
- return move_temp_to_file(tmpfile, filename);
+cleanup:
+ fclose(indexfile);
+ slot->local = NULL;
+ return ret;
}
static int setup_index(struct walker *walker, struct alt_base *repo, unsigned char *sha1)
@@ -718,7 +722,7 @@ static int fetch_pack(struct walker *walker, struct alt_base *repo, unsigned cha
FILE *packfile;
char *filename;
char tmpfile[PATH_MAX];
- int ret;
+ int ret = 0;
long prev_posn = 0;
char range[RANGE_HEADER_SIZE];
struct curl_slist *range_header = NULL;
@@ -775,17 +779,23 @@ static int fetch_pack(struct walker *walker, struct alt_base *repo, unsigned cha
if (start_active_slot(slot)) {
run_active_slot(slot);
if (results.curl_result != CURLE_OK) {
- fclose(packfile);
- return error("Unable to get pack file %s\n%s", url,
- curl_errorstr);
+ ret = error("Unable to get pack file %s\n%s", url,
+ curl_errorstr);
+ goto cleanup;
}
} else {
- fclose(packfile);
- return error("Unable to start request");
+ ret = error("Unable to start request");
+ goto cleanup;
}
target->pack_size = ftell(packfile);
+
+cleanup:
fclose(packfile);
+ slot->local = NULL;
+
+ if (ret)
+ return ret;
ret = move_temp_to_file(tmpfile, filename);
if (ret)
--
1.6.3.1
next prev parent reply other threads:[~2009-05-30 16:10 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-24 16:35 [PATCH 3/3] http-push: send out fetch requests on queue Tay Ray Chuan
2009-05-30 9:17 ` Clemens Buchacher
2009-05-30 9:31 ` Tay Ray Chuan
2009-05-30 9:37 ` Clemens Buchacher
2009-05-30 10:52 ` Tay Ray Chuan
2009-05-30 15:01 ` Tay Ray Chuan
2009-05-30 16:09 ` Tay Ray Chuan [this message]
2009-05-30 16:58 ` [PATCH] http*: cleanup slot->local after fclose Clemens Buchacher
2009-05-31 6:17 ` Junio C Hamano
2009-05-31 8:48 ` Tay Ray Chuan
2009-05-31 9:54 ` [PATCH v2] " Tay Ray Chuan
2009-05-31 20:21 ` Junio C Hamano
2009-06-01 13:52 ` Tay Ray Chuan
2009-06-01 16:13 ` Junio C Hamano
2009-06-02 13:55 ` Tay Ray Chuan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090531000955.953725d9.rctay89@gmail.com \
--to=rctay89@gmail$(echo .)com \
--cc=Johannes.Schindelin@gmx$(echo .)de \
--cc=drizzd@aon$(echo .)at \
--cc=git@vger$(echo .)kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox