Commit 55ededfd by Russell Belfer

Make refspec_transform paranoid about arguments

parent 278ce746
...@@ -225,25 +225,31 @@ int git_refspec_rtransform(char *out, size_t outlen, const git_refspec *spec, co ...@@ -225,25 +225,31 @@ int git_refspec_rtransform(char *out, size_t outlen, const git_refspec *spec, co
return refspec_transform_internal(out, outlen, spec->dst, spec->src, name); return refspec_transform_internal(out, outlen, spec->dst, spec->src, name);
} }
static int refspec_transform(git_buf *out, const char *from, const char *to, const char *name) static int refspec_transform(
git_buf *out, const char *from, const char *to, const char *name)
{ {
if (git_buf_sets(out, to) < 0) size_t to_len = to ? strlen(to) : 0;
size_t from_len = from ? strlen(from) : 0;
size_t name_len = name ? strlen(name) : 0;
if (git_buf_set(out, to, to_len) < 0)
return -1; return -1;
/* if (to_len > 0) {
* No '*' at the end means that it's mapped to one specific /* No '*' at the end of 'to' means that refspec is mapped to one
* branch, so no actual transformation is needed. * specific branch, so no actual transformation is needed.
*/ */
if (git_buf_len(out) > 0 && out->ptr[git_buf_len(out) - 1] != '*') if (out->ptr[to_len - 1] != '*')
return 0; return 0;
git_buf_shorten(out, 1); /* remove trailing '*' copied from 'to' */
}
git_buf_truncate(out, git_buf_len(out) - 1); /* remove trailing '*' */ if (from_len > 0) /* ignore trailing '*' from 'from' */
git_buf_puts(out, name + strlen(from) - 1); from_len--;
if (from_len > name_len)
if (git_buf_oom(out)) from_len = name_len;
return -1;
return 0; return git_buf_put(out, name + from_len, name_len - from_len);
} }
int git_refspec_transform_r(git_buf *out, const git_refspec *spec, const char *name) int git_refspec_transform_r(git_buf *out, const git_refspec *spec, const char *name)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment