Problem with gdk_image_get() failing



I just ran into a problem with gdk_image_get().  The issue is that if
XGetImage() fails and returns NULL, gdk_image_get () will segfault
trying to dereference the NULL ximage result.

For example, if the dimensions passed to XGetImage() are bogus, a
BadMatch x error is triggered and the application seg faults.

Now, of course I agree that the caller of XGetImage() should pass in
good values and that's what my code does.  Im sure that the passed in
values are valid...

Im using gdk_pixbuf_get_from_drawable().  It does some sanity checks on
the passed in dimensions using gdk_window_get_size().  Unfortunately the
cached values returned by gdk_window_get_size() are out of whack with
reality thus producing the BadMatch x error.  

I have a test program that I can post that shows the problem, but it
seems harmless to make gdk_image_get() more robust - especially since
the caller will still get an x protocol error.

The simple attatched patch does this by calling XGetImage() before
allocating the private image struct and returning NULL if XGetImage()
fails.

thanks

-re
Index: gdkimage.c
===================================================================
RCS file: /cvs/gnome/gtk+/gdk/gdkimage.c,v
retrieving revision 1.14.2.4
diff -u -u -r1.14.2.4 gdkimage.c
--- gdkimage.c	2000/11/18 16:59:39	1.14.2.4
+++ gdkimage.c	2000/12/15 03:48:17
@@ -342,6 +342,7 @@
   GdkImage *image;
   GdkImagePrivate *private;
   GdkWindowPrivate *win_private;
+  XImage *ximage;
 
   g_return_val_if_fail (window != NULL, NULL);
 
@@ -349,16 +350,20 @@
   if (win_private->destroyed)
     return NULL;
 
+  ximage = XGetImage (gdk_display,
+		      win_private->xwindow,
+		      x, y, width, height,
+		      AllPlanes, ZPixmap);
+  
+  if (ximage == NULL)
+	  return NULL;
+  
   private = g_new (GdkImagePrivate, 1);
   image = (GdkImage*) private;
 
   private->xdisplay = gdk_display;
   private->image_put = gdk_image_put_normal;
-  private->ximage = XGetImage (private->xdisplay,
-			       win_private->xwindow,
-			       x, y, width, height,
-			       AllPlanes, ZPixmap);
-
+  private->ximage = ximage;
   image->type = GDK_IMAGE_NORMAL;
   image->visual = gdk_window_get_visual (window);
   image->width = width;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]