From xemacs-m  Thu Aug 21 00:23:49 1997
Received: from GS213.SP.CS.CMU.EDU (GS213.SP.CS.CMU.EDU [128.2.209.183])
	by xemacs.org (8.8.5/8.8.5) with SMTP id AAA25987
	for <xemacs-beta@xemacs.org>; Thu, 21 Aug 1997 00:23:48 -0500 (CDT)
Received: by GS213.SP.CS.CMU.EDU (AIX 3.2/UCB 5.64/4.03)
          id AA14631; Thu, 21 Aug 1997 01:23:47 -0400
Date: Thu, 21 Aug 1997 01:23:47 -0400
Message-Id: <9708210523.AA14631@GS213.SP.CS.CMU.EDU>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
From: Darrell Kindred <dkindred@cmu.edu>
To: xemacs-beta@xemacs.org
Subject: [PATCH] 19.15p7 multi-device core dump
Organization: Carnegie Mellon University School of Computer Science
X-Mailer: VM 6.22 under 19.15 XEmacs Lucid

The following causes a core dump in XEmacs 19.15p7:

    xemacs -nw -q
    M-x make-frame-on-display myhost:0

(where myhost:0 is a valid display).  The problem is that
extract_xpm_color_names() instantiates specifiers using the
selected window (rather than the appropriate device) as the
domain.

This bug was fixed in 20.1 back in March.  I've extracted
the relevant fixes from glyph.h, glyph.c, and glyph-x.c, and
created a patch for 19.15p7.  Basically, it just adds a
'domain' argument to a bunch of image instantiator
functions, and uses that argument's value in
extract_xpm_color_names(), rather than the selected
device.

IMO, this should definitely go in 19.16.

- Darrell

--- src/glyphs.h.orig	Tue Dec 17 22:37:49 1996
+++ src/glyphs.h	Thu Aug 21 01:07:31 1997
@@ -95,7 +95,8 @@
 			      Lisp_Object instantiator,
 			      Lisp_Object pointer_fg,
 			      Lisp_Object pointer_bg,
-			      int dest_mask);
+			      int dest_mask,
+			      Lisp_Object domain);
 };
 
 struct ii_keyword_entry
@@ -496,7 +497,7 @@
 Lisp_Object alist_to_tagged_vector (Lisp_Object tag, Lisp_Object alist);
 void string_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 			 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-			 int dest_mask);
+			 int dest_mask, Lisp_Object domain);
 Lisp_Object allocate_glyph (enum glyph_type type,
 			    void (*after_change) (Lisp_Object glyph,
 						  Lisp_Object property,
--- src/glyphs.c.orig	Tue Mar 25 23:34:40 1997
+++ src/glyphs.c	Thu Aug 21 01:05:55 1997
@@ -479,7 +479,8 @@
 }
 
 static Lisp_Object
-instantiate_image_instantiator (Lisp_Object device, Lisp_Object instantiator,
+instantiate_image_instantiator (Lisp_Object device, Lisp_Object domain,
+				Lisp_Object instantiator,
 				Lisp_Object pointer_fg, Lisp_Object pointer_bg,
 				int dest_mask)
 {
@@ -499,7 +500,7 @@
 	("Don't know how to instantiate this image instantiator?",
 	 instantiator);
     IIFORMAT_METH (meths, instantiate, (ii, instantiator, pointer_fg,
-					pointer_bg, dest_mask));
+					pointer_bg, dest_mask, domain));
   }
   UNGCPRO;
 
@@ -982,7 +983,8 @@
   if (VECTORP (data)
 	   && EQ (vector_data (XVECTOR (data))[0], Qinherit))
     signal_simple_error ("inheritance not allowed here", data);
-  ii = instantiate_image_instantiator (device, data, Qnil, Qnil, dest_mask);
+  ii = instantiate_image_instantiator (device, device, data,
+				       Qnil, Qnil, dest_mask);
   RETURN_UNGCPRO (ii);
 }
 
@@ -1327,7 +1329,7 @@
 static void
 nothing_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		     Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		     int dest_mask)
+		     int dest_mask, Lisp_Object domain)
 {
   struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
 
@@ -1369,7 +1371,7 @@
 static void
 inherit_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		     Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		     int dest_mask)
+		     int dest_mask, Lisp_Object domain)
 {
   /* handled specially in image_instantiate */
   abort ();
@@ -1396,7 +1398,7 @@
 void
 string_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		    Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		    int dest_mask)
+		    int dest_mask, Lisp_Object domain)
 {
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
   struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
@@ -1432,7 +1434,7 @@
 formatted_string_instantiate (Lisp_Object image_instance,
 			      Lisp_Object instantiator,
 			      Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-			      int dest_mask)
+			      int dest_mask, Lisp_Object domain)
 {
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
   struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
@@ -1596,6 +1598,7 @@
 	  record_unwind_protect (image_instantiate_cache_result,
 				 locative);
 	  instance = instantiate_image_instantiator (device,
+						     domain,
 						     instantiator,
 						     pointer_fg, pointer_bg,
 						     dest_mask);
--- src/glyphs-x.c.orig	Fri Jun 13 17:59:09 1997
+++ src/glyphs-x.c	Thu Aug 21 00:51:45 1997
@@ -114,7 +114,8 @@
 				     Lisp_Object instantiator,
 				     Lisp_Object pointer_fg,
 				     Lisp_Object pointer_bg,
-				     int dest_mask);
+				     int dest_mask,
+				     Lisp_Object domain);
 
 #include "bitmaps.h"
 
@@ -1038,7 +1039,7 @@
 static void
 xbm_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		 int dest_mask)
+		 int dest_mask, Lisp_Object domain)
 {
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
   CONST char *gcc_go_home;
@@ -1272,7 +1273,7 @@
 static void
 jpeg_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		  Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		  int dest_mask)
+		  int dest_mask, Lisp_Object domain)
 {
   struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
@@ -1749,7 +1750,7 @@
 static void
 gif_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		 int dest_mask)
+		 int dest_mask, Lisp_Object domain)
 {
   struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
@@ -2032,7 +2033,7 @@
 static void
 png_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		 int dest_mask)
+		 int dest_mask, Lisp_Object domain)
 {
   struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
@@ -2326,7 +2327,7 @@
 static void
 tiff_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		  Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		  int dest_mask)
+		  int dest_mask, Lisp_Object domain)
 {
   abort ();
 }
@@ -2556,6 +2557,7 @@
 
 static XpmColorSymbol *
 extract_xpm_color_names (XpmAttributes *xpmattrs, Lisp_Object device,
+			 Lisp_Object domain,
 			 Lisp_Object color_symbol_alist)
 {
   /* This function can GC */
@@ -2589,7 +2591,7 @@
       else
         {
           assert (COLOR_SPECIFIERP (value));
-          value = Fspecifier_instance (value, Qnil, Qnil, Qnil);
+          value = Fspecifier_instance (value, domain, Qnil, Qnil);
         }
       if (NILP (value))
         continue;
@@ -2638,7 +2640,7 @@
 static void
 xpm_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		 int dest_mask)
+		 int dest_mask, Lisp_Object domain)
 {
   /* This function can GC */
   struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
@@ -2699,7 +2701,7 @@
       xpmattrs.valuemask |= XpmCloseness;
     }
   
-  color_symbols = extract_xpm_color_names (&xpmattrs, device,
+  color_symbols = extract_xpm_color_names (&xpmattrs, device, domain,
 					   color_symbol_alist);
 
   result = XpmCreatePixmapFromBuffer (dpy,
@@ -3050,7 +3052,7 @@
 static void
 xface_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		   Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		   int dest_mask)
+		   int dest_mask, Lisp_Object domain)
 {
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
   int i, stattis;
@@ -3215,7 +3217,7 @@
 static void
 autodetect_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 			Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-			int dest_mask)
+			int dest_mask, Lisp_Object domain)
 {
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
   struct gcpro gcpro1, gcpro2, gcpro3;
@@ -3243,10 +3245,10 @@
 
   if (is_cursor_font)
     cursor_font_instantiate (image_instance, result, pointer_fg,
-			     pointer_bg, dest_mask);
+			     pointer_bg, dest_mask, domain);
   else
     string_instantiate (image_instance, result, pointer_fg,
-			pointer_bg, dest_mask);
+			pointer_bg, dest_mask, domain);
 
   UNGCPRO;
 }
@@ -3312,7 +3314,7 @@
 static void
 font_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		  Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		  int dest_mask)
+		  int dest_mask, Lisp_Object domain)
 {
   /* This function can GC */
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
@@ -3410,7 +3412,7 @@
 static void
 cursor_font_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 			 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-			 int dest_mask)
+			 int dest_mask, Lisp_Object domain)
 {
   /* This function can GC */
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);

