diff options
author | Russell Belfer <rb@github.com> | 2014-01-20 10:04:20 -0800 |
---|---|---|
committer | Russell Belfer <rb@github.com> | 2014-01-20 10:04:20 -0800 |
commit | fb62dc906882940af287efe7f225676fc76e660f (patch) | |
tree | 507cdbd7adb08e361609301174f617cf214fd44f /src | |
parent | b97e55f2f16ea91f2e1c4e4a7e35af9b5260ca78 (diff) | |
parent | abdaf9366262ea034e092e8a9a707f5a7837ca65 (diff) | |
download | libgit2-fb62dc906882940af287efe7f225676fc76e660f.tar.gz |
Merge pull request #2064 from piki/piki/buffer-corner-cases
Fix a couple of corner cases and an undefined behavior
Diffstat (limited to 'src')
-rw-r--r-- | src/buffer.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/buffer.c b/src/buffer.c index 3283c2d4f..318fee753 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -66,8 +66,10 @@ int git_buf_try_grow( new_ptr = git__realloc(new_ptr, new_size); if (!new_ptr) { - if (mark_oom) + if (mark_oom) { + if (buf->ptr) git__free(buf->ptr); buf->ptr = git_buf__oom; + } return -1; } @@ -432,7 +434,7 @@ int git_buf_join( ssize_t offset_a = -1; /* not safe to have str_b point internally to the buffer */ - assert(str_b < buf->ptr || str_b > buf->ptr + buf->size); + assert(str_b < buf->ptr || str_b >= buf->ptr + buf->size); /* figure out if we need to insert a separator */ if (separator && strlen_a) { @@ -447,13 +449,14 @@ int git_buf_join( if (git_buf_grow(buf, strlen_a + strlen_b + need_sep + 1) < 0) return -1; + assert(buf->ptr); /* fix up internal pointers */ if (offset_a >= 0) str_a = buf->ptr + offset_a; /* do the actual copying */ - if (offset_a != 0) + if (offset_a != 0 && str_a) memmove(buf->ptr, str_a, strlen_a); if (need_sep) buf->ptr[strlen_a] = separator; |