diff options
| author | Junio C Hamano <gitster@pobox.com> | 2024-12-15 17:54:29 -0800 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2024-12-15 17:54:29 -0800 |
| commit | 67761be92776fec85c9638ba0fc357bc9bc0ac6d (patch) | |
| tree | 01ab9f734bba55bbb1fa17b7e020c7ca1237ba7c | |
| parent | e6663b9ac58a64bd9712a10e28764f54ac6f9434 (diff) | |
| parent | 14ef8c04c545d729174839b3ecbad2b5f24b1de6 (diff) | |
| download | git-67761be92776fec85c9638ba0fc357bc9bc0ac6d.tar.gz | |
Merge branch 'rj/strvec-splice-fix'
Correct strvec_splice() that misbehaved when the strvec is empty.
* rj/strvec-splice-fix:
strvec: `strvec_splice()` to a statically initialized vector
| -rw-r--r-- | strvec.c | 11 | ||||
| -rw-r--r-- | t/unit-tests/strvec.c | 10 |
2 files changed, 17 insertions, 4 deletions
@@ -61,16 +61,19 @@ void strvec_splice(struct strvec *array, size_t idx, size_t len, { if (idx + len > array->nr) BUG("range outside of array boundary"); - if (replacement_len > len) + if (replacement_len > len) { + if (array->v == empty_strvec) + array->v = NULL; ALLOC_GROW(array->v, array->nr + (replacement_len - len) + 1, array->alloc); + array->v[array->nr + (replacement_len - len)] = NULL; + } for (size_t i = 0; i < len; i++) free((char *)array->v[idx + i]); - if (replacement_len != len) { + if ((replacement_len != len) && array->nr) memmove(array->v + idx + replacement_len, array->v + idx + len, (array->nr - idx - len + 1) * sizeof(char *)); - array->nr += (replacement_len - len); - } + array->nr += replacement_len - len; for (size_t i = 0; i < replacement_len; i++) array->v[idx + i] = xstrdup(replacement[i]); } diff --git a/t/unit-tests/strvec.c b/t/unit-tests/strvec.c index 855b602337..e66b7bbfae 100644 --- a/t/unit-tests/strvec.c +++ b/t/unit-tests/strvec.c @@ -88,6 +88,16 @@ void test_strvec__pushv(void) strvec_clear(&vec); } +void test_strvec__splice_just_initialized_strvec(void) +{ + struct strvec vec = STRVEC_INIT; + const char *replacement[] = { "foo" }; + + strvec_splice(&vec, 0, 0, replacement, ARRAY_SIZE(replacement)); + check_strvec(&vec, "foo", NULL); + strvec_clear(&vec); +} + void test_strvec__splice_with_same_size_replacement(void) { struct strvec vec = STRVEC_INIT; |
