Problem with gdk_image_get() failing
- From: Ramiro Estrugo <ramiro eazel com>
- To: gtk-devel-list gnome org
- Subject: Problem with gdk_image_get() failing
- Date: Thu, 14 Dec 2000 20:00:02 -0800
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]