From: Jeff King <peff@peff.net>
To: "Erik Elfström" <erik.elfstrom@gmail.com>
Cc: Junio C Hamano <gitster@pobox.com>, git@vger.kernel.org
Subject: Re: [PATCH v8 1/5] setup: add gentle version of read_gitfile
Date: Fri, 26 Jun 2015 05:03:31 -0400 [thread overview]
Message-ID: <20150626090331.GA4196@peff.net> (raw)
In-Reply-To: <1434397195-1823-2-git-send-email-erik.elfstrom@gmail.com>
On Mon, Jun 15, 2015 at 09:39:51PM +0200, Erik Elfström wrote:
> +cleanup_return:
> free(buf);
> +
> + if (return_error_code)
> + *return_error_code = error_code;
> +
> + if (error_code) {
> + if (return_error_code)
> + return NULL;
> +
> + switch (error_code) {
> + case READ_GITFILE_ERR_STAT_FAILED:
> + case READ_GITFILE_ERR_NOT_A_FILE:
> + return NULL;
> + case READ_GITFILE_ERR_OPEN_FAILED:
> + die_errno("Error opening '%s'", path);
> + case READ_GITFILE_ERR_READ_FAILED:
> + die("Error reading %s", path);
> + case READ_GITFILE_ERR_INVALID_FORMAT:
> + die("Invalid gitfile format: %s", path);
> + case READ_GITFILE_ERR_NO_PATH:
> + die("No path in gitfile: %s", path);
> + case READ_GITFILE_ERR_NOT_A_REPO:
> + die("Not a git repository: %s", dir);
> + default:
> + assert(0);
> + }
I happened to be playing with clang's static analyzer today, and it
noticed that there is a subtle use-after-free here. Here's a patch (on
top of ee/clean-remove-dirs, which is in 'next').
In practice I suspect it prints the right thing on most platforms, just
because nobody else has a chance to clobber the heap. But doing:
echo "gitdir: /some/not-gitdir/path" >.git
valgrind git status
does detect the problem.
-- >8 --
Subject: [PATCH] read_gitfile_gently: fix use-after-free
The "dir" variable is a pointer into the "buf" array. When
we hit the cleanup_return path, the first thing we do is
free(buf); but one of the error messages prints "dir", which
will access the memory after the free.
We can fix this by reorganizing the error path a little. We
act on the fatal, error-printing conditions first, as they
want to access memory and do not care about freeing. Then we
free any memory, and finally return.
Signed-off-by: Jeff King <peff@peff.net>
---
We can also spell the "else if" below as:
if (error_code && !return_error_code)
but IMHO it reads better as I have it here: we report the error code if
the user asked for it, and otherwise follow the print-and-die path. We
could even spell it as just "else" and bump the "0" case down into the
switch statement.
setup.c | 14 +++++---------
1 file changed, 5 insertions(+), 9 deletions(-)
diff --git a/setup.c b/setup.c
index 7b30f32..5eaca48 100644
--- a/setup.c
+++ b/setup.c
@@ -517,19 +517,14 @@ const char *read_gitfile_gently(const char *path, int *return_error_code)
path = real_path(dir);
cleanup_return:
- free(buf);
-
if (return_error_code)
*return_error_code = error_code;
-
- if (error_code) {
- if (return_error_code)
- return NULL;
-
+ else if (error_code) {
switch (error_code) {
case READ_GITFILE_ERR_STAT_FAILED:
case READ_GITFILE_ERR_NOT_A_FILE:
- return NULL;
+ /* non-fatal; follow return path */
+ break;
case READ_GITFILE_ERR_OPEN_FAILED:
die_errno("Error opening '%s'", path);
case READ_GITFILE_ERR_TOO_LARGE:
@@ -547,7 +542,8 @@ cleanup_return:
}
}
- return path;
+ free(buf);
+ return error_code ? NULL : path;
}
static const char *setup_explicit_git_dir(const char *gitdirenv,
--
2.5.0.rc0.336.g8460790
next prev parent reply other threads:[~2015-06-26 9:04 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-15 19:39 [PATCH v8 0/5] Improving performance of git clean Erik Elfström
2015-06-15 19:39 ` [PATCH v8 1/5] setup: add gentle version of read_gitfile Erik Elfström
2015-06-26 9:03 ` Jeff King [this message]
2015-06-26 16:23 ` Junio C Hamano
2015-06-26 17:53 ` erik elfström
2015-06-26 18:09 ` Junio C Hamano
2015-06-15 19:39 ` [PATCH v8 2/5] setup: sanity check file size in read_gitfile_gently Erik Elfström
2015-06-15 19:39 ` [PATCH v8 3/5] t7300: add tests to document behavior of clean and nested git Erik Elfström
2015-06-15 19:39 ` [PATCH v8 4/5] p7300: add performance tests for clean Erik Elfström
2015-06-15 19:39 ` [PATCH v8 5/5] clean: improve performance when removing lots of directories Erik Elfström
2015-06-15 20:16 ` [PATCH v8 0/5] Improving performance of git clean 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=20150626090331.GA4196@peff.net \
--to=peff@peff.net \
--cc=erik.elfstrom@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.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).