vim-patch:8.1.1827: allocating more memory than needed for extended structs (#22081)

Problem:    Allocating more memory than needed for extended structs.
Solution:   Use offsetof() instead of sizeof(). (Dominique Pelle,
            closes vim/vim#4786)

47ed553fd5
This commit is contained in:
zeertzjq 2023-02-01 18:07:09 +08:00 committed by GitHub
parent d63ad600e0
commit 01d3a64e28
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 7 additions and 7 deletions

View File

@ -252,7 +252,7 @@ static void add_buff(buffheader_T *const buf, const char *const s, ptrdiff_t sle
} else { } else {
len = (size_t)slen; len = (size_t)slen;
} }
buffblock_T *p = xmalloc(sizeof(buffblock_T) + len); buffblock_T *p = xmalloc(offsetof(buffblock_T, b_str) + len + 1);
buf->bh_space = len - (size_t)slen; buf->bh_space = len - (size_t)slen;
xstrlcpy(p->b_str, s, (size_t)slen + 1); xstrlcpy(p->b_str, s, (size_t)slen + 1);

View File

@ -2862,7 +2862,7 @@ static regprog_T *bt_regcomp(uint8_t *expr, int re_flags)
} }
// Allocate space. // Allocate space.
bt_regprog_T *r = xmalloc(sizeof(bt_regprog_T) + (size_t)regsize); bt_regprog_T *r = xmalloc(offsetof(bt_regprog_T, program) + (size_t)regsize);
r->re_in_use = false; r->re_in_use = false;
// Second pass: emit code. // Second pass: emit code.

View File

@ -103,7 +103,7 @@ static signgroup_T *sign_group_ref(const char *groupname)
hi = hash_lookup(&sg_table, (char *)groupname, strlen(groupname), hash); hi = hash_lookup(&sg_table, (char *)groupname, strlen(groupname), hash);
if (HASHITEM_EMPTY(hi)) { if (HASHITEM_EMPTY(hi)) {
// new group // new group
group = xmalloc(sizeof(signgroup_T) + strlen(groupname)); group = xmalloc(offsetof(signgroup_T, sg_name) + strlen(groupname) + 1);
STRCPY(group->sg_name, groupname); STRCPY(group->sg_name, groupname);
group->sg_refcount = 1; group->sg_refcount = 1;

View File

@ -10,9 +10,9 @@
// Sign group // Sign group
typedef struct signgroup_S { typedef struct signgroup_S {
uint16_t sg_refcount; // number of signs in this group int sg_next_sign_id; ///< next sign id for this group
int sg_next_sign_id; // next sign id for this group uint16_t sg_refcount; ///< number of signs in this group
char sg_name[1]; // sign group name char sg_name[1]; ///< sign group name, actually longer
} signgroup_T; } signgroup_T;
// Macros to get the sign group structure from the group name // Macros to get the sign group structure from the group name

View File

@ -3736,7 +3736,7 @@ static void add_keyword(char *const name, const int id, const int flags,
sizeof(name_folded)) sizeof(name_folded))
: name; : name;
keyentry_T *const kp = xmalloc(sizeof(keyentry_T) + strlen(name_ic)); keyentry_T *const kp = xmalloc(offsetof(keyentry_T, keyword) + strlen(name_ic) + 1);
STRCPY(kp->keyword, name_ic); STRCPY(kp->keyword, name_ic);
kp->k_syn.id = (int16_t)id; kp->k_syn.id = (int16_t)id;
kp->k_syn.inc_tag = current_syn_inc_tag; kp->k_syn.inc_tag = current_syn_inc_tag;