mirror of
https://github.com/neovim/neovim.git
synced 2025-09-29 22:48:34 +00:00
ga_growsize should be >= 1
I know it could be 0 sometimes. Running the tests with `assert(gap->ga_growsize > 0)` in ga_grow() crashes nvim while running the tests. - Add a setter for ga_growsize that checks whether the value passed is >=1 (log in case it's not) - log when ga_grow() tries to use a ga_growsize that's not >=1 - use GA_EMPTY_INIT_VALUE is many places
This commit is contained in:

committed by
Justin M. Keyes

parent
d723e7fd61
commit
be3a4b6ca8
@@ -6,6 +6,7 @@
|
||||
|
||||
#include "nvim/vim.h"
|
||||
#include "nvim/ascii.h"
|
||||
#include "nvim/log.h"
|
||||
#include "nvim/misc2.h"
|
||||
#include "nvim/memory.h"
|
||||
#include "nvim/path.h"
|
||||
@@ -52,7 +53,21 @@ void ga_init(garray_T *gap, int itemsize, int growsize)
|
||||
gap->ga_maxlen = 0;
|
||||
gap->ga_len = 0;
|
||||
gap->ga_itemsize = itemsize;
|
||||
gap->ga_growsize = growsize;
|
||||
ga_set_growsize(gap, growsize);
|
||||
}
|
||||
|
||||
/// A setter for the growsize that guarantees it will be at least 1.
|
||||
///
|
||||
/// @param gap
|
||||
/// @param growsize
|
||||
void ga_set_growsize(garray_T *gap, int growsize)
|
||||
{
|
||||
if (growsize < 1) {
|
||||
WLOG("trying to set an invalid ga_growsize: %d", growsize);
|
||||
gap->ga_growsize = 1;
|
||||
} else {
|
||||
gap->ga_growsize = growsize;
|
||||
}
|
||||
}
|
||||
|
||||
/// Make room in growing array "gap" for at least "n" items.
|
||||
@@ -66,17 +81,24 @@ void ga_grow(garray_T *gap, int n)
|
||||
return;
|
||||
}
|
||||
|
||||
// the garray grows by at least growsize (do we have a MIN macro somewhere?)
|
||||
n = (n < gap->ga_growsize) ? gap->ga_growsize : n;
|
||||
if (gap->ga_growsize < 1) {
|
||||
WLOG("ga_growsize(%d) is less than 1", gap->ga_growsize);
|
||||
}
|
||||
|
||||
size_t new_size = (size_t)(gap->ga_itemsize * (gap->ga_len + n));
|
||||
// the garray grows by at least growsize
|
||||
if (n < gap->ga_growsize) {
|
||||
n = gap->ga_growsize;
|
||||
}
|
||||
int new_maxlen = gap->ga_len + n;
|
||||
|
||||
size_t new_size = (size_t)(gap->ga_itemsize * new_maxlen);
|
||||
size_t old_size = (size_t)(gap->ga_itemsize * gap->ga_maxlen);
|
||||
|
||||
// reallocate and clear the new memory
|
||||
char_u *pp = xrealloc(gap->ga_data, new_size);
|
||||
char *pp = xrealloc(gap->ga_data, new_size);
|
||||
memset(pp + old_size, 0, new_size - old_size);
|
||||
|
||||
gap->ga_maxlen = gap->ga_len + n;
|
||||
gap->ga_maxlen = new_maxlen;
|
||||
gap->ga_data = pp;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user