[gdk-pixbuf] tests: Fix possible infinite loops



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]