From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>,
"Max Kirillov" <max@max630.net>,
"Eric Sunshine" <sunshine@sunshineco.com>,
"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH 2/5] prune --repos: fix uninitialized access
Date: Wed, 23 Jul 2014 18:43:12 +0700 [thread overview]
Message-ID: <1406115795-24082-3-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1406115795-24082-1-git-send-email-pclouds@gmail.com>
There's a code path in prune_repo_dir() that does not initialize 'st'
buffer, which is checked by the caller, prune_repos_dir(). Instead
of leaking some prune logic out to prune_repos_dir(), move 'st' into
prune_repo_dir().
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/prune.c | 16 ++++++----------
t/t2026-prune-linked-checkouts.sh | 2 +-
2 files changed, 7 insertions(+), 11 deletions(-)
diff --git a/builtin/prune.c b/builtin/prune.c
index 28b7adf..e72c391 100644
--- a/builtin/prune.c
+++ b/builtin/prune.c
@@ -112,8 +112,9 @@ static void prune_object_dir(const char *path)
}
}
-static int prune_repo_dir(const char *id, struct stat *st, struct strbuf *reason)
+static int prune_repo_dir(const char *id, struct strbuf *reason)
{
+ struct stat st;
char *path;
int fd, len;
@@ -123,26 +124,23 @@ static int prune_repo_dir(const char *id, struct stat *st, struct strbuf *reason
}
if (file_exists(git_path("repos/%s/locked", id)))
return 0;
- if (stat(git_path("repos/%s/gitdir", id), st)) {
- st->st_mtime = expire;
+ if (stat(git_path("repos/%s/gitdir", id), &st)) {
strbuf_addf(reason, _("Removing repos/%s: gitdir file does not exist"), id);
return 1;
}
fd = open(git_path("repos/%s/gitdir", id), O_RDONLY);
if (fd < 0) {
- st->st_mtime = expire;
strbuf_addf(reason, _("Removing repos/%s: unable to read gitdir file (%s)"),
id, strerror(errno));
return 1;
}
- len = st->st_size;
+ len = st.st_size;
path = xmalloc(len + 1);
read_in_full(fd, path, len);
close(fd);
while (len && (path[len - 1] == '\n' || path[len - 1] == '\r'))
len--;
if (!len) {
- st->st_mtime = expire;
strbuf_addf(reason, _("Removing repos/%s: invalid gitdir file"), id);
free(path);
return 1;
@@ -162,7 +160,7 @@ static int prune_repo_dir(const char *id, struct stat *st, struct strbuf *reason
return 1;
}
free(path);
- return 0;
+ return st.st_mtime <= expire;
}
static void prune_repos_dir(void)
@@ -172,15 +170,13 @@ static void prune_repos_dir(void)
DIR *dir = opendir(git_path("repos"));
struct dirent *d;
int ret;
- struct stat st;
if (!dir)
return;
while ((d = readdir(dir)) != NULL) {
if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
continue;
strbuf_reset(&reason);
- if (!prune_repo_dir(d->d_name, &st, &reason) ||
- st.st_mtime > expire)
+ if (!prune_repo_dir(d->d_name, &reason))
continue;
if (show_only || verbose)
printf("%s\n", reason.buf);
diff --git a/t/t2026-prune-linked-checkouts.sh b/t/t2026-prune-linked-checkouts.sh
index 4ccfa4e..79d84cb 100755
--- a/t/t2026-prune-linked-checkouts.sh
+++ b/t/t2026-prune-linked-checkouts.sh
@@ -77,7 +77,7 @@ test_expect_success 'not prune recent checkouts' '
mkdir zz &&
mkdir -p .git/repos/jlm &&
echo "$TRASH_DIRECTORY"/zz >.git/repos/jlm/gitdir &&
- git prune --repos --verbose &&
+ git prune --repos --verbose --expire=2.days.ago &&
test -d .git/repos/jlm
'
--
1.9.1.346.ga2b5940
next prev parent reply other threads:[~2014-07-23 11:44 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-23 11:43 [PATCH 0/5] nd/multiple-work-trees follow-ups Nguyễn Thái Ngọc Duy
2014-07-23 11:43 ` [PATCH 1/5] gitrepository-layout.txt: s/ignored/ignored if/ Nguyễn Thái Ngọc Duy
2014-07-23 11:43 ` Nguyễn Thái Ngọc Duy [this message]
2014-07-23 19:59 ` [PATCH 2/5] prune --repos: fix uninitialized access Junio C Hamano
2014-07-24 10:14 ` Duy Nguyen
2014-07-23 11:43 ` [PATCH 3/5] checkout --to: no auto-detach if the ref is already checked out Nguyễn Thái Ngọc Duy
2014-07-23 13:48 ` Michael J Gruber
2014-07-23 17:46 ` Junio C Hamano
2014-07-24 9:58 ` Duy Nguyen
2014-07-24 21:30 ` Junio C Hamano
2014-07-25 6:51 ` Michael J Gruber
2014-07-30 18:03 ` Junio C Hamano
2014-07-30 18:52 ` Junio C Hamano
2014-08-27 11:58 ` Duy Nguyen
2014-08-27 16:08 ` Junio C Hamano
2014-07-23 21:16 ` Junio C Hamano
2014-07-24 10:09 ` Duy Nguyen
2014-07-24 16:39 ` Junio C Hamano
2014-07-24 18:13 ` Junio C Hamano
2014-07-23 11:43 ` [PATCH 4/5] checkout --to: fix dangling pointers in remove_junk() Nguyễn Thái Ngọc Duy
2014-07-23 11:43 ` [PATCH 5/5] environment.c: fix incorrect git_graft_file initialization Nguyễn Thái Ngọc Duy
2014-07-23 21:22 ` Junio C Hamano
2014-07-29 13:50 ` [PATCH v2 0/8] nd/multiple-work-trees follow-ups Nguyễn Thái Ngọc Duy
2014-07-29 13:50 ` [PATCH v2 1/8] gitrepository-layout.txt: s/ignored/ignored if/ Nguyễn Thái Ngọc Duy
2014-07-29 13:50 ` [PATCH v2 2/8] checkout: no need to call check_linked_checkouts if head_ref is NULL Nguyễn Thái Ngọc Duy
2014-07-29 13:50 ` [PATCH v2 3/8] prune --repos: fix uninitialized access Nguyễn Thái Ngọc Duy
2014-07-29 13:50 ` [PATCH v2 4/8] checkout: no auto-detach if the ref is already checked out Nguyễn Thái Ngọc Duy
2014-07-29 13:50 ` [PATCH v2 5/8] checkout --to: fix dangling pointers in remove_junk() Nguyễn Thái Ngọc Duy
2014-07-29 13:50 ` [PATCH v2 6/8] environment.c: fix incorrect git_graft_file initialization Nguyễn Thái Ngọc Duy
2014-07-29 13:50 ` [PATCH v2 7/8] checkout: prefix --to argument properly when cwd is moved Nguyễn Thái Ngọc Duy
2014-07-29 20:51 ` Junio C Hamano
2014-07-30 10:32 ` Duy Nguyen
2014-07-29 13:50 ` [PATCH v2 8/8] checkout --to: do not touch existing target directory Nguyễn Thái Ngọc Duy
2014-07-30 17:51 ` [PATCH 0/5] nd/multiple-work-trees follow-ups Junio C Hamano
2014-07-31 10:13 ` Duy Nguyen
2014-07-31 17:00 ` Junio C Hamano
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=1406115795-24082-3-git-send-email-pclouds@gmail.com \
--to=pclouds@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=max@max630.net \
--cc=sunshine@sunshineco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
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;
as well as URLs for NNTP newsgroup(s).