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.  */