Mercurial > emacs
changeset 45235:66271fa0bf60
(current_minor_maps): Fixed resizing of cmm_maps;
only update cmm_size if realloc actually succeeds.
Testing with initial size of 2 elements revealed that using
realloc on GNU/Linux would cause a random trap in xmalloc
later on, so I rewrote the code to use malloc/bcopy/free instead
of realloc.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Fri, 10 May 2002 23:57:14 +0000 |
parents | d32d2ad1b315 |
children | ebc4fa4ef475 |
files | src/keymap.c |
diffstat | 1 files changed, 28 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/src/keymap.c Fri May 10 23:56:06 2002 +0000 +++ b/src/keymap.c Fri May 10 23:57:14 2002 +0000 @@ -1248,8 +1248,8 @@ /* We can't put these variables inside current_minor_maps, since under some systems, static gets macro-defined to be the empty string. Ickypoo. */ -static Lisp_Object *cmm_modes, *cmm_maps; -static int cmm_size; +static Lisp_Object *cmm_modes = NULL, *cmm_maps = NULL; +static int cmm_size = 0; /* Error handler used in current_minor_maps. */ static Lisp_Object @@ -1321,40 +1321,41 @@ if (i >= cmm_size) { + int newsize, allocsize; Lisp_Object *newmodes, *newmaps; - /* Use malloc/realloc here. See the comment above - this function. */ - if (cmm_maps) + newsize = cmm_size == 0 ? 30 : cmm_size * 2; + allocsize = newsize * sizeof *newmodes; + + /* Use malloc here. See the comment above this function. + Avoid realloc here; it causes spurious traps on GNU/Linux [KFS] */ + BLOCK_INPUT; + newmodes = (Lisp_Object *) malloc (allocsize); + if (newmodes) { - BLOCK_INPUT; - cmm_size *= 2; - newmodes - = (Lisp_Object *) realloc (cmm_modes, - cmm_size * sizeof *newmodes); - newmaps - = (Lisp_Object *) realloc (cmm_maps, - cmm_size * sizeof *newmaps); - UNBLOCK_INPUT; + if (cmm_modes) + { + bcopy (cmm_modes, newmodes, cmm_size * sizeof cmm_modes[0]); + free (cmm_modes); + } + cmm_modes = newmodes; } - else + + newmaps = (Lisp_Object *) malloc (allocsize); + if (newmaps) { - BLOCK_INPUT; - cmm_size = 30; - newmodes - = (Lisp_Object *) malloc (cmm_size * sizeof *newmodes); - newmaps - = (Lisp_Object *) malloc (cmm_size * sizeof *newmaps); - UNBLOCK_INPUT; + if (cmm_maps) + { + bcopy (cmm_maps, newmaps, cmm_size * sizeof cmm_maps[0]); + free (cmm_maps); + } + cmm_maps = newmaps; } - - if (newmodes) - cmm_modes = newmodes; - if (newmaps) - cmm_maps = newmaps; + UNBLOCK_INPUT; if (newmodes == NULL || newmaps == NULL) break; + cmm_size = newsize; } /* Get the keymap definition--or nil if it is not defined. */