mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-21 18:03:54 +00:00
Fix bug when join_n refers to original buffer
There was a bug in git_buf_join_n when the contents of the original buffer were joined into itself and the realloc moved the pointer to the original buffer.
This commit is contained in:
parent
95dfb031f7
commit
952f94c8ab
24
src/buffer.c
24
src/buffer.c
@ -256,8 +256,8 @@ int git_buf_join_n(git_buf *buf, char separator, int nbuf, ...)
|
|||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
int i;
|
int i;
|
||||||
size_t total_size = 0;
|
size_t total_size = 0, original_size = buf->size;
|
||||||
char *out;
|
char *out, *original = buf->ptr;
|
||||||
|
|
||||||
if (buf->size > 0 && buf->ptr[buf->size - 1] != separator)
|
if (buf->size > 0 && buf->ptr[buf->size - 1] != separator)
|
||||||
++total_size; /* space for initial separator */
|
++total_size; /* space for initial separator */
|
||||||
@ -281,8 +281,9 @@ int git_buf_join_n(git_buf *buf, char separator, int nbuf, ...)
|
|||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
/* expand buffer if needed */
|
/* expand buffer if needed */
|
||||||
if (total_size > 0 &&
|
if (total_size == 0)
|
||||||
git_buf_grow(buf, buf->size + total_size + 1) < 0)
|
return 0;
|
||||||
|
if (git_buf_grow(buf, buf->size + total_size + 1) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
out = buf->ptr + buf->size;
|
out = buf->ptr + buf->size;
|
||||||
@ -300,12 +301,23 @@ int git_buf_join_n(git_buf *buf, char separator, int nbuf, ...)
|
|||||||
if (!segment)
|
if (!segment)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* deal with join that references buffer's original content */
|
||||||
|
if (segment >= original && segment < original + original_size) {
|
||||||
|
size_t offset = (segment - original);
|
||||||
|
segment = buf->ptr + offset;
|
||||||
|
segment_len = original_size - offset;
|
||||||
|
} else {
|
||||||
|
segment_len = strlen(segment);
|
||||||
|
}
|
||||||
|
|
||||||
/* skip leading separators */
|
/* skip leading separators */
|
||||||
if (out > buf->ptr && out[-1] == separator)
|
if (out > buf->ptr && out[-1] == separator)
|
||||||
while (*segment == separator) segment++;
|
while (segment_len > 0 && *segment == separator) {
|
||||||
|
segment++;
|
||||||
|
segment_len--;
|
||||||
|
}
|
||||||
|
|
||||||
/* copy over next buffer */
|
/* copy over next buffer */
|
||||||
segment_len = strlen(segment);
|
|
||||||
if (segment_len > 0) {
|
if (segment_len > 0) {
|
||||||
memmove(out, segment, segment_len);
|
memmove(out, segment, segment_len);
|
||||||
out += segment_len;
|
out += segment_len;
|
||||||
|
Loading…
Reference in New Issue
Block a user