Commit fa48d2ea by Etienne Samson

vector: do not malloc 0-length vectors on dup

parent c70713d6
...@@ -50,22 +50,24 @@ int git_vector_size_hint(git_vector *v, size_t size_hint) ...@@ -50,22 +50,24 @@ int git_vector_size_hint(git_vector *v, size_t size_hint)
int git_vector_dup(git_vector *v, const git_vector *src, git_vector_cmp cmp) int git_vector_dup(git_vector *v, const git_vector *src, git_vector_cmp cmp)
{ {
size_t bytes;
assert(v && src); assert(v && src);
GITERR_CHECK_ALLOC_MULTIPLY(&bytes, src->length, sizeof(void *)); v->_alloc_size = 0;
v->contents = NULL;
v->_alloc_size = src->length;
v->_cmp = cmp ? cmp : src->_cmp; v->_cmp = cmp ? cmp : src->_cmp;
v->length = src->length; v->length = src->length;
v->flags = src->flags; v->flags = src->flags;
if (cmp != src->_cmp) if (cmp != src->_cmp)
git_vector_set_sorted(v, 0); git_vector_set_sorted(v, 0);
if (src->length) {
size_t bytes;
GITERR_CHECK_ALLOC_MULTIPLY(&bytes, src->length, sizeof(void *));
v->contents = git__malloc(bytes); v->contents = git__malloc(bytes);
GITERR_CHECK_ALLOC(v->contents); GITERR_CHECK_ALLOC(v->contents);
v->_alloc_size = src->length;
memcpy(v->contents, src->contents, bytes); memcpy(v->contents, src->contents, bytes);
}
return 0; return 0;
} }
......
...@@ -407,3 +407,22 @@ void test_core_vector__reverse(void) ...@@ -407,3 +407,22 @@ void test_core_vector__reverse(void)
git_vector_free(&v); git_vector_free(&v);
} }
void test_core_vector__dup_empty_vector(void)
{
git_vector v = GIT_VECTOR_INIT;
git_vector dup = GIT_VECTOR_INIT;
void *dummy = 0xDEAFBEEB;
cl_assert_equal_i(0, v.length);
cl_git_pass(git_vector_dup(&dup, &v, v._cmp));
cl_assert_equal_i(0, dup._alloc_size);
cl_assert_equal_i(0, dup.length);
cl_git_pass(git_vector_insert(&dup, dummy));
cl_assert_equal_i(8, dup._alloc_size);
cl_assert_equal_i(1, dup.length);
git_vector_free(&dup);
}
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