From c103ca3c908e276b0ae17d8be09ef6b609cb8a0d Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Thu, 3 Jul 2008 11:39:52 +0000 Subject: [PATCH] plug-ins/pygimp/pygimp-drawable.c plug-ins/pygimp/pygimp-vectors.c 2008-07-03 Lars-Peter Clausen * plug-ins/pygimp/pygimp-drawable.c * plug-ins/pygimp/pygimp-vectors.c * plug-ins/pygimp/pygimp-display.c * plug-ins/pygimp/pygimp-image.c: Added checks to ensure that a python object only is created if its id is valid. Fixes bug #536403. * plug-ins/pygimp/pygimp-pdb.c * plug-ins/pygimp/pygimp-tile.c * plug-ins/pygimp/pygimp-colors.c * plug-ins/pygimp/pygimp.h: Fix crashing when pygimp is used with python-2.5 on 64 bit systems. Fixes bug #540629. svn path=/trunk/; revision=26044 --- ChangeLog | 13 ++++ plug-ins/pygimp/pygimp-colors.c | 99 ++++++++++++++++--------------- plug-ins/pygimp/pygimp-display.c | 2 +- plug-ins/pygimp/pygimp-drawable.c | 24 ++++---- plug-ins/pygimp/pygimp-image.c | 2 +- plug-ins/pygimp/pygimp-pdb.c | 2 +- plug-ins/pygimp/pygimp-tile.c | 18 +++--- plug-ins/pygimp/pygimp-vectors.c | 2 +- plug-ins/pygimp/pygimp.h | 6 ++ 9 files changed, 92 insertions(+), 76 deletions(-) diff --git a/ChangeLog b/ChangeLog index dde5de66ca..edbb18dd05 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2008-07-03 Lars-Peter Clausen + + * plug-ins/pygimp/pygimp-drawable.c + * plug-ins/pygimp/pygimp-vectors.c + * plug-ins/pygimp/pygimp-display.c + * plug-ins/pygimp/pygimp-image.c: Added checks to ensure that a python + object only is created if its id is valid. Fixes bug #536403. + * plug-ins/pygimp/pygimp-pdb.c + * plug-ins/pygimp/pygimp-tile.c + * plug-ins/pygimp/pygimp-colors.c + * plug-ins/pygimp/pygimp.h: Fix crashing when pygimp is used with + python-2.5 on 64 bit systems. Fixes bug #540629. + 2008-07-03 Sven Neumann * app/widgets/gimpsettingsbox.c (gimp_settings_box_constructor) diff --git a/plug-ins/pygimp/pygimp-colors.c b/plug-ins/pygimp/pygimp-colors.c index 8aa8d32184..5eb4c8adfd 100644 --- a/plug-ins/pygimp/pygimp-colors.c +++ b/plug-ins/pygimp/pygimp-colors.c @@ -20,6 +20,7 @@ #define NO_IMPORT_PYGOBJECT +#include "pygimp.h" #include "pygimpcolor.h" #include @@ -459,14 +460,14 @@ static PyGetSetDef rgb_getsets[] = { { NULL, (getter)0, (setter)0 }, }; -static int +static Py_ssize_t rgb_length(PyObject *self) { return 4; } static PyObject * -rgb_getitem(PyObject *self, int pos) +rgb_getitem(PyObject *self, Py_ssize_t pos) { GimpRGB *rgb; double val; @@ -495,7 +496,7 @@ rgb_getitem(PyObject *self, int pos) } static int -rgb_setitem(PyObject *self, int pos, PyObject *value) +rgb_setitem(PyObject *self, Py_ssize_t pos, PyObject *value) { if (pos < 0) pos += 4; @@ -517,10 +518,10 @@ rgb_setitem(PyObject *self, int pos, PyObject *value) } static PyObject * -rgb_slice(PyObject *self, int start, int end) +rgb_slice(PyObject *self, Py_ssize_t start, Py_ssize_t end) { PyTupleObject *ret; - int i; + Py_ssize_t i; if (start < 0) start = 0; @@ -540,13 +541,13 @@ rgb_slice(PyObject *self, int start, int end) } static PySequenceMethods rgb_as_sequence = { - (inquiry)rgb_length, + rgb_length, (binaryfunc)0, - (intargfunc)0, - (intargfunc)rgb_getitem, - (intintargfunc)rgb_slice, - (intobjargproc)rgb_setitem, - (intintobjargproc)0, + 0, + rgb_getitem, + rgb_slice, + rgb_setitem, + 0, (objobjproc)0, }; @@ -562,7 +563,7 @@ rgb_subscript(PyObject *self, PyObject *item) return NULL; return rgb_getitem(self, i); } else if (PySlice_Check(item)) { - int start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, cur, i; PyObject *ret; if (PySlice_GetIndicesEx((PySliceObject*)item, 4, @@ -608,7 +609,7 @@ rgb_subscript(PyObject *self, PyObject *item) } static PyMappingMethods rgb_as_mapping = { - (inquiry)rgb_length, + rgb_length, (binaryfunc)rgb_subscript, (objobjargproc)0 }; @@ -982,14 +983,14 @@ static PyGetSetDef hsv_getsets[] = { { NULL, (getter)0, (setter)0 }, }; -static int +static Py_ssize_t hsv_length(PyObject *self) { return 4; } static PyObject * -hsv_getitem(PyObject *self, int pos) +hsv_getitem(PyObject *self, Py_ssize_t pos) { GimpHSV *hsv; double val, scale_factor; @@ -1040,10 +1041,10 @@ hsv_setitem(PyObject *self, int pos, PyObject *value) } static PyObject * -hsv_slice(PyObject *self, int start, int end) +hsv_slice(PyObject *self, Py_ssize_t start, Py_ssize_t end) { PyTupleObject *ret; - int i; + Py_ssize_t i; if (start < 0) start = 0; @@ -1063,13 +1064,13 @@ hsv_slice(PyObject *self, int start, int end) } static PySequenceMethods hsv_as_sequence = { - (inquiry)hsv_length, + hsv_length, (binaryfunc)0, - (intargfunc)0, - (intargfunc)hsv_getitem, - (intintargfunc)hsv_slice, - (intobjargproc)hsv_setitem, - (intintobjargproc)0, + 0, + hsv_getitem, + hsv_slice, + hsv_setitem, + 0, (objobjproc)0, }; @@ -1085,7 +1086,7 @@ hsv_subscript(PyObject *self, PyObject *item) return NULL; return hsv_getitem(self, i); } else if (PySlice_Check(item)) { - int start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, cur, i; PyObject *ret; if (PySlice_GetIndicesEx((PySliceObject*)item, 4, @@ -1131,7 +1132,7 @@ hsv_subscript(PyObject *self, PyObject *item) } static PyMappingMethods hsv_as_mapping = { - (inquiry)hsv_length, + hsv_length, (binaryfunc)hsv_subscript, (objobjargproc)0 }; @@ -1495,14 +1496,14 @@ static PyGetSetDef hsl_getsets[] = { { NULL, (getter)0, (setter)0 }, }; -static int +static Py_ssize_t hsl_length(PyObject *self) { return 4; } static PyObject * -hsl_getitem(PyObject *self, int pos) +hsl_getitem(PyObject *self, Py_ssize_t pos) { GimpHSL *hsl; double val, scale_factor; @@ -1553,10 +1554,10 @@ hsl_setitem(PyObject *self, int pos, PyObject *value) } static PyObject * -hsl_slice(PyObject *self, int start, int end) +hsl_slice(PyObject *self, Py_ssize_t start, Py_ssize_t end) { PyTupleObject *ret; - int i; + Py_ssize_t i; if (start < 0) start = 0; @@ -1576,13 +1577,13 @@ hsl_slice(PyObject *self, int start, int end) } static PySequenceMethods hsl_as_sequence = { - (inquiry)hsl_length, + hsl_length, (binaryfunc)0, - (intargfunc)0, - (intargfunc)hsl_getitem, - (intintargfunc)hsl_slice, - (intobjargproc)hsl_setitem, - (intintobjargproc)0, + 0, + hsl_getitem, + hsl_slice, + hsl_setitem, + 0, (objobjproc)0, }; @@ -1598,7 +1599,7 @@ hsl_subscript(PyObject *self, PyObject *item) return NULL; return hsl_getitem(self, i); } else if (PySlice_Check(item)) { - int start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, cur, i; PyObject *ret; if (PySlice_GetIndicesEx((PySliceObject*)item, 4, @@ -1644,7 +1645,7 @@ hsl_subscript(PyObject *self, PyObject *item) } static PyMappingMethods hsl_as_mapping = { - (inquiry)hsl_length, + hsl_length, (binaryfunc)hsl_subscript, (objobjargproc)0 }; @@ -1999,14 +2000,14 @@ static PyGetSetDef cmyk_getsets[] = { { NULL, (getter)0, (setter)0 }, }; -static int +static Py_ssize_t cmyk_length(PyObject *self) { return 5; } static PyObject * -cmyk_getitem(PyObject *self, int pos) +cmyk_getitem(PyObject *self, Py_ssize_t pos) { GimpCMYK *cmyk; double val; @@ -2059,10 +2060,10 @@ cmyk_setitem(PyObject *self, int pos, PyObject *value) } static PyObject * -cmyk_slice(PyObject *self, int start, int end) +cmyk_slice(PyObject *self, Py_ssize_t start, Py_ssize_t end) { PyTupleObject *ret; - int i; + Py_ssize_t i; if (start < 0) start = 0; @@ -2082,13 +2083,13 @@ cmyk_slice(PyObject *self, int start, int end) } static PySequenceMethods cmyk_as_sequence = { - (inquiry)cmyk_length, + cmyk_length, (binaryfunc)0, - (intargfunc)0, - (intargfunc)cmyk_getitem, - (intintargfunc)cmyk_slice, - (intobjargproc)cmyk_setitem, - (intintobjargproc)0, + 0, + cmyk_getitem, + cmyk_slice, + cmyk_setitem, + 0, (objobjproc)0, }; @@ -2104,7 +2105,7 @@ cmyk_subscript(PyObject *self, PyObject *item) return NULL; return cmyk_getitem(self, i); } else if (PySlice_Check(item)) { - int start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, cur, i; PyObject *ret; if (PySlice_GetIndicesEx((PySliceObject*)item, 5, @@ -2153,7 +2154,7 @@ cmyk_subscript(PyObject *self, PyObject *item) } static PyMappingMethods cmyk_as_mapping = { - (inquiry)cmyk_length, + cmyk_length, (binaryfunc)cmyk_subscript, (objobjargproc)0 }; diff --git a/plug-ins/pygimp/pygimp-display.c b/plug-ins/pygimp/pygimp-display.c index 3e95a106b7..eb4f064033 100644 --- a/plug-ins/pygimp/pygimp-display.c +++ b/plug-ins/pygimp/pygimp-display.c @@ -46,7 +46,7 @@ pygimp_display_new(gint32 ID) { PyGimpDisplay *self; - if (ID == -1) { + if (!gimp_display_is_valid(ID)) { Py_INCREF(Py_None); return Py_None; } diff --git a/plug-ins/pygimp/pygimp-drawable.c b/plug-ins/pygimp/pygimp-drawable.c index 2a67649de9..68a4f0ad25 100644 --- a/plug-ins/pygimp/pygimp-drawable.c +++ b/plug-ins/pygimp/pygimp-drawable.c @@ -1202,21 +1202,16 @@ pygimp_drawable_new(GimpDrawable *drawable, gint32 ID) { PyObject *self; - if (drawable == NULL && ID == -1) { + if (drawable != NULL) + ID = drawable->drawable_id; + + if (!gimp_drawable_is_valid(ID)) { Py_INCREF(Py_None); return Py_None; } - if (drawable != NULL) - ID = drawable->drawable_id; - /* create the appropriate object type */ - - /* avoids calling gimp_drawable_is_layer with an invalid id - * pygimp_channel_new handles it cleanly - */ - if (gimp_drawable_is_valid(ID) && - gimp_drawable_is_layer(ID)) + if (gimp_drawable_is_layer(ID)) self = pygimp_layer_new(ID); else self = pygimp_channel_new(ID); @@ -1224,6 +1219,7 @@ pygimp_drawable_new(GimpDrawable *drawable, gint32 ID) if (self == NULL) return NULL; + if (PyObject_TypeCheck(self, &PyGimpDrawable_Type)) ((PyGimpDrawable *)self)->drawable = drawable; return self; @@ -1692,7 +1688,7 @@ lay_repr(PyGimpLayer *self) gchar *name; name = gimp_drawable_get_name(self->ID); - s = PyString_FromFormat("", name); + s = PyString_FromFormat("", name ? name : "(null)"); g_free(name); return s; @@ -1778,7 +1774,7 @@ pygimp_layer_new(gint32 ID) { PyGimpLayer *self; - if (ID == -1) { + if (!gimp_drawable_is_valid(ID) || !gimp_drawable_is_layer(ID)) { Py_INCREF(Py_None); return Py_None; } @@ -1971,7 +1967,7 @@ chn_repr(PyGimpChannel *self) gchar *name; name = gimp_drawable_get_name(self->ID); - s = PyString_FromFormat("", name); + s = PyString_FromFormat("", name ? name : "(null)"); g_free(name); return s; @@ -2066,7 +2062,7 @@ pygimp_channel_new(gint32 ID) { PyGimpChannel *self; - if (ID == -1) { + if (!gimp_drawable_is_valid(ID) || !gimp_drawable_is_channel(ID)) { Py_INCREF(Py_None); return Py_None; } diff --git a/plug-ins/pygimp/pygimp-image.c b/plug-ins/pygimp/pygimp-image.c index ee06bac7a5..489796e371 100644 --- a/plug-ins/pygimp/pygimp-image.c +++ b/plug-ins/pygimp/pygimp-image.c @@ -1314,7 +1314,7 @@ pygimp_image_new(gint32 ID) { PyGimpImage *self; - if (ID == -1) { + if (!gimp_image_is_valid(ID)) { Py_INCREF(Py_None); return Py_None; } diff --git a/plug-ins/pygimp/pygimp-pdb.c b/plug-ins/pygimp/pygimp-pdb.c index 35e95084d7..fc435ec073 100644 --- a/plug-ins/pygimp/pygimp-pdb.c +++ b/plug-ins/pygimp/pygimp-pdb.c @@ -820,7 +820,7 @@ pf_call(PyGimpPDBFunction *self, PyObject *args, PyObject *kwargs) #endif if (kwargs) { - int len, pos; + Py_ssize_t len, pos; PyObject *key, *val; len = PyDict_Size(kwargs); diff --git a/plug-ins/pygimp/pygimp-tile.c b/plug-ins/pygimp/pygimp-tile.c index 9b3d36823e..14e654f025 100644 --- a/plug-ins/pygimp/pygimp-tile.c +++ b/plug-ins/pygimp/pygimp-tile.c @@ -146,10 +146,10 @@ tile_repr(PyGimpTile *self) return s; } -static int -tile_length(PyGimpTile *self) +static Py_ssize_t +tile_length(PyObject *self) { - return self->tile->ewidth * self->tile->eheight; + return ((PyGimpTile*)self)->tile->ewidth * ((PyGimpTile*)self)->tile->eheight; } static PyObject * @@ -251,7 +251,7 @@ tile_ass_sub(PyGimpTile *self, PyObject *v, PyObject *w) } static PyMappingMethods tile_as_mapping = { - (inquiry)tile_length, /*length*/ + tile_length, /*length*/ (binaryfunc)tile_subscript, /*subscript*/ (objobjargproc)tile_ass_sub, /*ass_sub*/ }; @@ -358,8 +358,8 @@ pr_dealloc(PyGimpPixelRgn *self) /* Code to access pr objects as mappings */ -static int -pr_length(PyGimpPixelRgn *self) +static Py_ssize_t +pr_length(PyObject *self) { PyErr_SetString(pygimp_error, "Can't get size of pixel region"); return -1; @@ -371,7 +371,7 @@ pr_subscript(PyGimpPixelRgn *self, PyObject *key) GimpPixelRgn *pr = &(self->pr); int bpp = pr->bpp; PyObject *x, *y; - int x1, y1, x2, y2, xs, ys; + Py_ssize_t x1, y1, x2, y2, xs, ys; if (!PyTuple_Check(key) || PyTuple_Size(key) != 2) { PyErr_SetString(PyExc_TypeError, "subscript must be a 2-tuple"); @@ -480,7 +480,7 @@ pr_ass_sub(PyGimpPixelRgn *self, PyObject *v, PyObject *w) int bpp = pr->bpp; PyObject *x, *y; guchar *buf; - int len, x1, x2, xs, y1, y2, ys; + Py_ssize_t len, x1, x2, xs, y1, y2, ys; if (w == NULL) { PyErr_SetString(PyExc_TypeError, "can't delete subscripts"); @@ -592,7 +592,7 @@ pr_ass_sub(PyGimpPixelRgn *self, PyObject *v, PyObject *w) } static PyMappingMethods pr_as_mapping = { - (inquiry)pr_length, /*mp_length*/ + pr_length, /*mp_length*/ (binaryfunc)pr_subscript, /*mp_subscript*/ (objobjargproc)pr_ass_sub, /*mp_ass_subscript*/ }; diff --git a/plug-ins/pygimp/pygimp-vectors.c b/plug-ins/pygimp/pygimp-vectors.c index 7811c2ac9f..e24147547c 100644 --- a/plug-ins/pygimp/pygimp-vectors.c +++ b/plug-ins/pygimp/pygimp-vectors.c @@ -981,7 +981,7 @@ pygimp_vectors_new(gint32 ID) { PyGimpVectors *self; - if (ID == -1) { + if (!gimp_vectors_is_valid(ID)) { Py_INCREF(Py_None); return Py_None; } diff --git a/plug-ins/pygimp/pygimp.h b/plug-ins/pygimp/pygimp.h index 7c81b83b54..352db8ce78 100644 --- a/plug-ins/pygimp/pygimp.h +++ b/plug-ins/pygimp/pygimp.h @@ -27,6 +27,12 @@ #define _INSIDE_PYGIMP_ #include "pygimp-api.h" +#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) +typedef int Py_ssize_t; +#define PY_SSIZE_T_MAX INT_MAX +#define PY_SSIZE_T_MIN INT_MIN +#endif + G_BEGIN_DECLS extern PyObject *pygimp_error;