diff options
author | Carlos Martín Nieto <cmn@dwim.me> | 2014-06-06 15:57:37 +0200 |
---|---|---|
committer | Carlos Martín Nieto <cmn@dwim.me> | 2014-06-06 15:57:37 +0200 |
commit | 61dcfe1400a5ff1cf4dc805795cb72657c524906 (patch) | |
tree | 1a195f643e79ccb72b1dee1d24472a5e34cd4488 | |
parent | 5a49ff9fa0b89c9fd479e04e0f694fa5f07fd6f4 (diff) | |
download | libgit2-61dcfe1400a5ff1cf4dc805795cb72657c524906.tar.gz |
remote: make sure the name stays valid on rename
We must make sure that the name pointer remains valid, so make sure to
allocate the new one before freeing the old one and swap them so the
user never sees an invalid pointer.
-rw-r--r-- | src/remote.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/remote.c b/src/remote.c index dd88cf91a..c7b97ca62 100644 --- a/src/remote.c +++ b/src/remote.c @@ -1484,6 +1484,7 @@ int git_remote_rename( void *payload) { int error; + char *tmp, *dup; assert(remote && new_name); @@ -1510,10 +1511,12 @@ int git_remote_rename( if ((error = rename_fetch_refspecs(remote, new_name, callback, payload)) < 0) return error; - git__free(remote->name); + dup = git__strdup(new_name); + GITERR_CHECK_ALLOC(dup); - remote->name = git__strdup(new_name); - GITERR_CHECK_ALLOC(remote->name); + tmp = remote->name; + remote->name = dup; + git__free(tmp); return 0; } |