Merge pull request #18648 from jamessan/coverity-fixes

This commit is contained in:
James McCoy 2022-05-20 14:22:15 -04:00 committed by GitHub
commit b3453ea4a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 86 additions and 14 deletions

View File

@ -1,7 +1,7 @@
name: Coverity name: Coverity
on: on:
schedule: schedule:
- cron: '10 0 * * 1' # Run every Monday at 00:10 - cron: '10 0 * * *' # Run every day at 00:10
workflow_dispatch: workflow_dispatch:
jobs: jobs:

View File

@ -42,3 +42,72 @@ int tv_dict_add(dict_T *const d, dictitem_T *const item)
{ {
__coverity_escape__(item); __coverity_escape__(item);
} }
void *malloc(size_t size)
{
int has_mem;
if (has_mem)
return __coverity_alloc__(size);
else
return 0;
}
void *try_malloc(size_t size)
{
size_t allocated_size = size ? size : 1;
return malloc(allocated_size);
}
void *xmalloc(size_t size)
{
void *p = malloc(size);
if (!p)
__coverity_panic__();
return p;
}
void xfree(void * ptr)
{
__coverity_free__(ptr);
}
void *xcalloc(size_t count, size_t size)
{
size_t allocated_count = count && size ? count : 1;
size_t allocated_size = count && size ? size : 1;
void *p = try_malloc(allocated_count * allocated_size);
if (!p)
__coverity_panic__();
__coverity_writeall0__(p);
return p;
}
void *xrealloc(void *ptr, size_t size)
{
__coverity_escape__(ptr);
void * p = xmalloc(size);
__coverity_writeall__(p);
return p;
}
void *xmallocz(size_t size)
{
void * p = malloc(size + 1);
((char*)p)[size] = 0;
return p;
}
void * xmemdupz(const void * data, size_t len)
{
void * p = xmallocz(len);
__coverity_writeall__(p);
((char*)p)[len] = 0;
return p;
}
void * xmemdup(const void *data, size_t len)
{
void * p = xmalloc(len);
__coverity_writeall__(p);
return p;
}

View File

@ -95,27 +95,27 @@ static bool ns_initialized(uint32_t ns)
} }
static Array extmark_to_array(ExtmarkInfo extmark, bool id, bool add_dict) static Array extmark_to_array(const ExtmarkInfo *extmark, bool id, bool add_dict)
{ {
Array rv = ARRAY_DICT_INIT; Array rv = ARRAY_DICT_INIT;
if (id) { if (id) {
ADD(rv, INTEGER_OBJ((Integer)extmark.mark_id)); ADD(rv, INTEGER_OBJ((Integer)extmark->mark_id));
} }
ADD(rv, INTEGER_OBJ(extmark.row)); ADD(rv, INTEGER_OBJ(extmark->row));
ADD(rv, INTEGER_OBJ(extmark.col)); ADD(rv, INTEGER_OBJ(extmark->col));
if (add_dict) { if (add_dict) {
Dictionary dict = ARRAY_DICT_INIT; Dictionary dict = ARRAY_DICT_INIT;
PUT(dict, "right_gravity", BOOLEAN_OBJ(extmark.right_gravity)); PUT(dict, "right_gravity", BOOLEAN_OBJ(extmark->right_gravity));
if (extmark.end_row >= 0) { if (extmark->end_row >= 0) {
PUT(dict, "end_row", INTEGER_OBJ(extmark.end_row)); PUT(dict, "end_row", INTEGER_OBJ(extmark->end_row));
PUT(dict, "end_col", INTEGER_OBJ(extmark.end_col)); PUT(dict, "end_col", INTEGER_OBJ(extmark->end_col));
PUT(dict, "end_right_gravity", BOOLEAN_OBJ(extmark.end_right_gravity)); PUT(dict, "end_right_gravity", BOOLEAN_OBJ(extmark->end_right_gravity));
} }
Decoration *decor = &extmark.decor; const Decoration *decor = &extmark->decor;
if (decor->hl_id) { if (decor->hl_id) {
String name = cstr_to_string((const char *)syn_id2name(decor->hl_id)); String name = cstr_to_string((const char *)syn_id2name(decor->hl_id));
PUT(dict, "hl_group", STRING_OBJ(name)); PUT(dict, "hl_group", STRING_OBJ(name));
@ -238,7 +238,7 @@ ArrayOf(Integer) nvim_buf_get_extmark_by_id(Buffer buffer, Integer ns_id,
if (extmark.row < 0) { if (extmark.row < 0) {
return rv; return rv;
} }
return extmark_to_array(extmark, false, details); return extmark_to_array(&extmark, false, details);
} }
/// Gets extmarks in "traversal order" from a |charwise| region defined by /// Gets extmarks in "traversal order" from a |charwise| region defined by
@ -357,7 +357,7 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id, Object start, Object e
u_row, u_col, (int64_t)limit, reverse); u_row, u_col, (int64_t)limit, reverse);
for (size_t i = 0; i < kv_size(marks); i++) { for (size_t i = 0; i < kv_size(marks); i++) {
ADD(rv, ARRAY_OBJ(extmark_to_array(kv_A(marks, i), true, (bool)details))); ADD(rv, ARRAY_OBJ(extmark_to_array(&kv_A(marks, i), true, (bool)details)));
} }
kv_destroy(marks); kv_destroy(marks);

View File

@ -1624,6 +1624,7 @@ void create_user_command(String name, Object command, Dict(user_command) *opts,
err: err:
NLUA_CLEAR_REF(luaref); NLUA_CLEAR_REF(luaref);
NLUA_CLEAR_REF(compl_luaref); NLUA_CLEAR_REF(compl_luaref);
xfree(compl_arg);
} }
int find_sid(uint64_t channel_id) int find_sid(uint64_t channel_id)

View File

@ -3598,5 +3598,6 @@ char_u *register_cfunc(cfunc_T cb, cfunc_free_T cb_free, void *state)
STRCPY(fp->uf_name, name); STRCPY(fp->uf_name, name);
hash_add(&func_hashtab, UF2HIKEY(fp)); hash_add(&func_hashtab, UF2HIKEY(fp));
// coverity[leaked_storage]
return fp->uf_name; return fp->uf_name;
} }

View File

@ -30,7 +30,7 @@ static void add_user(garray_T *users, char *user, bool need_copy)
if (user_copy == NULL || *user_copy == NUL) { if (user_copy == NULL || *user_copy == NUL) {
if (need_copy) { if (need_copy) {
xfree(user); xfree(user_copy);
} }
return; return;
} }

View File

@ -1496,6 +1496,7 @@ int kv_do_printf(StringBuilder *str, const char *fmt, ...)
// printed string didn't fit, resize and try again // printed string didn't fit, resize and try again
if ((size_t)printed >= remaining) { if ((size_t)printed >= remaining) {
kv_ensure_space(*str, (size_t)printed + 1); // include space for NUL terminator at the end kv_ensure_space(*str, (size_t)printed + 1); // include space for NUL terminator at the end
assert(str->items != NULL);
va_start(ap, fmt); va_start(ap, fmt);
printed = vsnprintf(str->items + str->size, str->capacity - str->size, fmt, ap); printed = vsnprintf(str->items + str->size, str->capacity - str->size, fmt, ap);
va_end(ap); va_end(ap);