plug-ins/pygimp/pygimp-drawable.c plug-ins/pygimp/pygimp-vectors.c

2008-07-03  Lars-Peter Clausen  <lars@metafoo.de>

	* 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
This commit is contained in:
Lars-Peter Clausen 2008-07-03 11:39:52 +00:00 committed by Lars-Peter Clausen
parent 4f606de456
commit c103ca3c90
9 changed files with 92 additions and 76 deletions

View file

@ -1,3 +1,16 @@
2008-07-03 Lars-Peter Clausen <lars@metafoo.de>
* 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 <sven@gimp.org>
* app/widgets/gimpsettingsbox.c (gimp_settings_box_constructor)

View file

@ -20,6 +20,7 @@
#define NO_IMPORT_PYGOBJECT
#include "pygimp.h"
#include "pygimpcolor.h"
#include <libgimpmath/gimpmath.h>
@ -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
};

View file

@ -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;
}

View file

@ -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("<gimp.Layer '%s'>", name);
s = PyString_FromFormat("<gimp.Layer '%s'>", 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("<gimp.Channel '%s'>", name);
s = PyString_FromFormat("<gimp.Channel '%s'>", 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;
}

View file

@ -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;
}

View file

@ -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);

View file

@ -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*/
};

View file

@ -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;
}

View file

@ -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;