use malloc() + copy + free() instead of realloc()
This commit is contained in:
parent
3ffa1684ae
commit
0e9c6932c4
1 changed files with 11 additions and 4 deletions
|
@ -66,19 +66,26 @@ cpf_grow(void)
|
||||||
new_size = (1+ngrants)*2;
|
new_size = (1+ngrants)*2;
|
||||||
assert(new_size > ngrants);
|
assert(new_size > ngrants);
|
||||||
|
|
||||||
/* Grow block to new size. */
|
/* Allocate a block of new size. */
|
||||||
if(!(new_grants=realloc(grants, new_size * sizeof(grants[0]))))
|
if(!(new_grants=malloc(new_size * sizeof(grants[0]))))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* Copy old block to new block. */
|
||||||
|
if(grants && ngrants > 0)
|
||||||
|
memcpy(new_grants, grants, ngrants * sizeof(grants[0]));
|
||||||
|
|
||||||
/* Make sure new slots are marked unused (CPF_USED is clear). */
|
/* Make sure new slots are marked unused (CPF_USED is clear). */
|
||||||
for(g = ngrants; g < new_size; g++)
|
for(g = ngrants; g < new_size; g++)
|
||||||
grants[g].cp_flags = 0;
|
new_grants[g].cp_flags = 0;
|
||||||
|
|
||||||
/* Inform kernel about new size (and possibly new location). */
|
/* Inform kernel about new size (and possibly new location). */
|
||||||
if(sys_privctl(SELF, SYS_PRIV_SET_GRANTS, new_size, new_grants))
|
if(sys_privctl(SELF, SYS_PRIV_SET_GRANTS, new_size, new_grants)) {
|
||||||
|
free(new_grants);
|
||||||
return; /* Failed - don't grow then. */
|
return; /* Failed - don't grow then. */
|
||||||
|
}
|
||||||
|
|
||||||
/* Update internal data. */
|
/* Update internal data. */
|
||||||
|
if(grants && ngrants > 0) free(grants);
|
||||||
grants = new_grants;
|
grants = new_grants;
|
||||||
ngrants = new_size;
|
ngrants = new_size;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue