From: "David Rydh" <dary@math.berkeley.edu>
To: "git@vger.kernel.org" <git@vger.kernel.org>
Cc: "David Rydh" <dary@math.berkeley.edu>, "Johannes Sixt" <j6t@kdbg.org>
Subject: [PATCH] git-mv: Fix error with multiple sources.
Date: Thu, 21 Jan 2010 12:39:41 -0800 [thread overview]
Message-ID: <718290.769818367-sendEmail@darysmbp> (raw)
Commit b8f26269 (fix directory separator treatment on Windows,
30-06-2009) introduced a bug on Mac OS X. The problem is that
basename() may return a pointer to internal static storage space that
will be overwritten by subsequent calls:
> git mv dir/a.txt dir/b.txt other/
Checking rename of 'dir/a.txt' to 'other/b.txt'
Checking rename of 'dir/b.txt' to 'other/b.txt'
fatal: multiple sources for the same target,
source=dir/b.txt, destination=other/b.txt
This commit also fixed two potentially dangerous uses of
prefix_filename() -- which returns static storage space -- in
builtin-config.c and hash-object.c.
get_pathspec(): If called with an empty pathspec, allocate a new
pathspec with a copy of prefix. This is consistent with the behavior
when called with a non-empty pathspec and prevents potential errors.
Signed-off-by: David Rydh <dary@math.berkeley.edu>
---
This is my first patch submission to git. Perhaps this patch should
be split into two? The one-line change to builtin-mv.c suffices to
fix the bug.
builtin-config.c | 4 ++--
builtin-mv.c | 2 +-
hash-object.c | 2 +-
setup.c | 4 ++--
4 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/builtin-config.c b/builtin-config.c
index 2e3ef91..bf60f93 100644
--- a/builtin-config.c
+++ b/builtin-config.c
@@ -356,9 +356,9 @@ int cmd_config(int argc, const char **argv, const char *unused_prefix)
config_exclusive_filename = git_etc_gitconfig();
else if (given_config_file) {
if (!is_absolute_path(given_config_file) && prefix)
- config_exclusive_filename = prefix_filename(prefix,
+ config_exclusive_filename = xstrdup(prefix_filename(prefix,
strlen(prefix),
- argv[2]);
+ argv[2]));
else
config_exclusive_filename = given_config_file;
}
diff --git a/builtin-mv.c b/builtin-mv.c
index 8247186..1c1f8be 100644
--- a/builtin-mv.c
+++ b/builtin-mv.c
@@ -27,7 +27,7 @@ static const char **copy_pathspec(const char *prefix, const char **pathspec,
if (length > 0 && is_dir_sep(result[i][length - 1]))
result[i] = xmemdupz(result[i], length - 1);
if (base_name)
- result[i] = basename((char *)result[i]);
+ result[i] = xstrdup(basename((char *)result[i]));
}
return get_pathspec(prefix, result);
}
diff --git a/hash-object.c b/hash-object.c
index 9455dd0..3c509aa 100644
--- a/hash-object.c
+++ b/hash-object.c
@@ -91,7 +91,7 @@ int main(int argc, const char **argv)
prefix = setup_git_directory();
prefix_length = prefix ? strlen(prefix) : 0;
if (vpath && prefix)
- vpath = prefix_filename(prefix, prefix_length, vpath);
+ vpath = xstrdup(prefix_filename(prefix, prefix_length, vpath));
}
git_config(git_default_config, NULL);
diff --git a/setup.c b/setup.c
index 710e2f3..80cf535 100644
--- a/setup.c
+++ b/setup.c
@@ -132,8 +132,8 @@ const char **get_pathspec(const char *prefix, const char **pathspec)
return NULL;
if (!entry) {
- static const char *spec[2];
- spec[0] = prefix;
+ const char **spec = xmalloc(sizeof(char *) * 2);
+ spec[0] = xstrdup(prefix);
spec[1] = NULL;
return spec;
}
--
1.6.6.1
next reply other threads:[~2010-01-22 4:15 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-01-21 20:39 David Rydh [this message]
2010-01-22 5:57 ` [PATCH] git-mv: Fix error with multiple sources Junio C Hamano
2010-01-22 16:41 ` David Rydh
2010-01-22 6:17 ` Junio C Hamano
2010-01-22 16:49 ` David Rydh
2010-01-22 6:24 ` Junio C Hamano
[not found] ` <7vr5pi8x6z.fsf@alter.siamese.dyndns.org>
2010-01-22 17:30 ` David Rydh
2010-01-22 18:34 ` Johannes Sixt
2010-01-22 7:03 ` Matthieu Moy
2010-01-22 7:29 ` Johannes Sixt
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=718290.769818367-sendEmail@darysmbp \
--to=dary@math.berkeley.edu \
--cc=git@vger.kernel.org \
--cc=j6t@kdbg.org \
/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).