[gdk-pixbuf] tests: Fix possible infinite loops
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdk-pixbuf] tests: Fix possible infinite loops
- Date: Mon, 9 Jan 2017 17:12:42 +0000 (UTC)
commit 0144147d5597837bdbfb7e6b2f694d80eb5154f9
Author: Bastien Nocera <hadess hadess net>
Date: Fri Jan 6 14:31:13 2017 +0100
tests: Fix possible infinite loops
In the unlikely case that the just created pixbuf is invalid, the
returned sizes would be negative. Ensure that those are positive
to avoid possible infinite loops.
Coverity CID 1391987
Coverity CID 1391988
https://bugzilla.gnome.org/show_bug.cgi?id=776945
tests/pixbuf-scale.c | 31 +++++++++++++++++++++----------
1 files changed, 21 insertions(+), 10 deletions(-)
---
diff --git a/tests/pixbuf-scale.c b/tests/pixbuf-scale.c
index 8a3f8f5..9fb9be6 100644
--- a/tests/pixbuf-scale.c
+++ b/tests/pixbuf-scale.c
@@ -237,6 +237,7 @@ test_halve_checkerboard (gconstpointer data)
GdkInterpType interp_type = *(GdkInterpType *) data;
const GdkPixbuf *source; /* Source image */
gint width = 256, height = 256; /* Size of source image */
+ gint scaled_width, scaled_height; /* Size of scaled image */
GdkPixbuf *scaled; /* Scaled version */
guchar *row; /* Pointer to start of row of pixels within the image */
guchar *pixel; /* Pointer to current pixel data in row */
@@ -248,14 +249,18 @@ test_halve_checkerboard (gconstpointer data)
source = make_checkerboard (width, height);
scaled = gdk_pixbuf_scale_simple (source, width / 2, height / 2, interp_type);
+ scaled_width = gdk_pixbuf_get_width (scaled);
+ scaled_height = gdk_pixbuf_get_height (scaled);
+ g_assert_cmpint (scaled_width, >, 0);
+ g_assert_cmpint (scaled_height, >, 0);
/* Check that the result is all gray (or all white in the case of NEAREST) */
for (y = 0, row = gdk_pixbuf_get_pixels (scaled);
- y < gdk_pixbuf_get_height (scaled);
+ y < (guint) scaled_height;
y++, row += gdk_pixbuf_get_rowstride (scaled))
{
for (x = 0, pixel = row;
- x < gdk_pixbuf_get_width (scaled);
+ x < (guint) scaled_width;
x++, pixel += gdk_pixbuf_get_n_channels (scaled))
{
if (!(pixel[0] == expected && pixel[1] == expected && pixel[2] == expected))
@@ -263,8 +268,8 @@ test_halve_checkerboard (gconstpointer data)
/* Expected failure: HYPER has a different opinion about the color
* of the corner pixels: (126,126,126) and (130,130,130) */
if (interp_type == GDK_INTERP_HYPER &&
- (x == 0 || x == gdk_pixbuf_get_width (scaled) - 1) &&
- (y == 0 || y == gdk_pixbuf_get_height (scaled) - 1))
+ (x == 0 || x == scaled_width - 1) &&
+ (y == 0 || y == scaled_height - 1))
{
continue;
}
@@ -288,9 +293,10 @@ crop_n_compare (const GdkPixbuf *source,
GdkInterpType interp_type)
{
GdkPixbuf *cropped, *scaled;
- guchar *crow, *srow; /* Pointer to current row in image data */
- guchar *cpixel, *spixel; /* Pointer to current pixel in row */
+ guchar *crow, *srow; /* Pointer to current row in image data */
+ guchar *cpixel, *spixel; /* Pointer to current pixel in row */
guint x, y;
+ gint scaled_width, scaled_height; /* Size of scaled image */
cropped = gdk_pixbuf_new_subpixbuf ((GdkPixbuf *)source, offset_x, offset_y, width, height);
g_assert_nonnull (cropped);
@@ -304,14 +310,19 @@ crop_n_compare (const GdkPixbuf *source,
1.0, 1.0, /* scale_[xy] */
interp_type);
+ scaled_width = gdk_pixbuf_get_width (scaled);
+ scaled_height = gdk_pixbuf_get_height (scaled);
+ g_assert_cmpint (scaled_width, >, 0);
+ g_assert_cmpint (scaled_height, >, 0);
+
for (y = 0, crow = gdk_pixbuf_get_pixels (cropped),
srow = gdk_pixbuf_get_pixels (scaled);
- y < gdk_pixbuf_get_height (scaled);
+ y < scaled_height;
y++, crow += gdk_pixbuf_get_rowstride (cropped),
srow += gdk_pixbuf_get_rowstride (scaled))
{
for (x = 0, cpixel = crow, spixel = srow;
- x < gdk_pixbuf_get_width (scaled);
+ x < scaled_width;
x++, cpixel += gdk_pixbuf_get_n_channels (cropped),
spixel += gdk_pixbuf_get_n_channels (scaled))
{
@@ -322,8 +333,8 @@ crop_n_compare (const GdkPixbuf *source,
/* Expected failure: HYPER has a different opinion about the
* colors of the edge pixels */
if (interp_type == GDK_INTERP_HYPER &&
- ((x == 0 || x == gdk_pixbuf_get_width (scaled) - 1) ||
- (y == 0 || y == gdk_pixbuf_get_height (scaled) - 1)))
+ ((x == 0 || x == scaled_width - 1) ||
+ (y == 0 || y == scaled_height - 1)))
{
continue;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]