[devel] Revised png_check_IHDR() again

to check info_ptr members instead of the contents of the returned parameters.
diff --git a/ANNOUNCE b/ANNOUNCE
index f83ee0e..6429ae0 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,5 +1,5 @@
 
-Libpng 1.4.0beta85 - September 30, 2009
+Libpng 1.4.0beta85 - October 1, 2009
 
 This is not intended to be a public release.  It will be replaced
 within a few weeks by a public version or by another test version.
@@ -570,7 +570,9 @@
   Fixed some inconsistent indentation in pngconf.h
   Revised png_check_IHDR() to add a test for width variable less than 32-bit.
 
-version 1.4.0beta85 [September 30, 2009]
+version 1.4.0beta85 [October 1, 2009]
+  Revised png_check_IHDR() again, to check info_ptr members instead of
+    the contents of the returned parameters.
 
 version 1.4.0betaN [future]
   Build shared libraries with -lz and sometimes -lm.
diff --git a/CHANGES b/CHANGES
index 9cfea81..0e89025 100644
--- a/CHANGES
+++ b/CHANGES
@@ -2256,7 +2256,9 @@
   Fixed some inconsistent indentation in pngconf.h
   Revised png_check_IHDR() to add a test for width variable less than 32-bit.
 
-version 1.4.0beta85 [September 30, 2009]
+version 1.4.0beta85 [October 1, 2009]
+  Revised png_check_IHDR() again, to check info_ptr members instead of
+    the contents of the returned parameters.
 
 version 1.4.0betaN [future]
   Build shared libraries with -lz and sometimes -lm.
diff --git a/libpng-1.4.0beta85.txt b/libpng-1.4.0beta85.txt
index 33d18f9..1e29fd9 100644
--- a/libpng-1.4.0beta85.txt
+++ b/libpng-1.4.0beta85.txt
@@ -1,6 +1,6 @@
 libpng.txt - A description on how to use and modify libpng
 
- libpng version 1.4.0beta85 - September 30, 2009
+ libpng version 1.4.0beta85 - October 1, 2009
  Updated and distributed by Glenn Randers-Pehrson
  <glennrp at users.sourceforge.net>
  Copyright (c) 1998-2009 Glenn Randers-Pehrson
@@ -11,7 +11,7 @@
 
  Based on:
 
- libpng versions 0.97, January 1998, through 1.4.0beta85 - September 30, 2009
+ libpng versions 0.97, January 1998, through 1.4.0beta85 - October 1, 2009
  Updated and distributed by Glenn Randers-Pehrson
  Copyright (c) 1998-2009 Glenn Randers-Pehrson
 
@@ -557,10 +557,33 @@
                      for PNG 1.0)
     interlace_type - (PNG_INTERLACE_NONE or
                      PNG_INTERLACE_ADAM7)
-    Any or all of interlace_type, compression_type, of
+
+    Any or all of interlace_type, compression_type, or
     filter_method can be NULL if you are
     not interested in their values.
 
+    Note that png_get_IHDR() returns 32-bit data into
+    the application's width and height variables.
+    This is an unsafe situation if these are 16-bit
+    variables.  In such situations, the
+    png_get_image_width() and png_get_image_height()
+    functions described below are safer.
+
+    width            = png_get_image_width(png_ptr,
+                         info_ptr);
+    height           = png_get_image_height(png_ptr,
+                         info_ptr);
+    bit_depth        = png_get_bit_depth(png_ptr,
+                         info_ptr);
+    color_type       = png_get_color_type(png_ptr,
+                         info_ptr);
+    filter_method    = png_get_filter_type(png_ptr,
+                         info_ptr);
+    compression_type = png_get_compression_type(png_ptr,
+                         info_ptr);
+    interlace_type   = png_get_interlace_type(png_ptr,
+                         info_ptr);
+
     channels = png_get_channels(png_ptr, info_ptr);
     channels       - number of channels of info for the
                      color type (valid values are 1 (GRAY,
@@ -580,23 +603,6 @@
                      be in signature[4] through signature[7]
                      (see png_set_sig_bytes())).
 
-
-    width            = png_get_image_width(png_ptr,
-                         info_ptr);
-    height           = png_get_image_height(png_ptr,
-                         info_ptr);
-    bit_depth        = png_get_bit_depth(png_ptr,
-                         info_ptr);
-    color_type       = png_get_color_type(png_ptr,
-                         info_ptr);
-    filter_method    = png_get_filter_type(png_ptr,
-                         info_ptr);
-    compression_type = png_get_compression_type(png_ptr,
-                         info_ptr);
-    interlace_type   = png_get_interlace_type(png_ptr,
-                         info_ptr);
-
-
 These are also important, but their validity depends on whether the chunk
 has been read.  The png_get_valid(png_ptr, info_ptr, PNG_INFO_<chunk>) and
 png_get_<chunk>(png_ptr, info_ptr, ...) functions return non-zero if the
@@ -3205,7 +3211,7 @@
 
 XIII. Y2K Compliance in libpng
 
-September 30, 2009
+October 1, 2009
 
 Since the PNG Development group is an ad-hoc body, we can't make
 an official declaration.
diff --git a/png.c b/png.c
index 37802fe..a24f598 100644
--- a/png.c
+++ b/png.c
@@ -1,7 +1,7 @@
 
 /* png.c - location for general purpose libpng functions
  *
- * Last changed in libpng 1.4.0 [September 30, 2009]
+ * Last changed in libpng 1.4.0 [October 1, 2009]
  * Copyright (c) 1998-2009 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
@@ -547,13 +547,13 @@
 #else
 #ifdef __STDC__
    return ((png_charp) PNG_STRING_NEWLINE \
-     "libpng version x 1.4.0beta85 - September 30, 2009" PNG_STRING_NEWLINE \
+     "libpng version x 1.4.0beta85 - October 1, 2009" PNG_STRING_NEWLINE \
      "Copyright (c) 1998-2009 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \
      "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
      "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
      PNG_STRING_NEWLINE);
 #else
-      return ((png_charp) "libpng version 1.4.0beta85 - September 30, 2009\
+      return ((png_charp) "libpng version 1.4.0beta85 - October 1, 2009\
       Copyright (c) 1998-2009 Glenn Randers-Pehrson\
       Copyright (c) 1996-1997 Andreas Dilger\
       Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.");
@@ -796,14 +796,6 @@
 #endif
    {
       png_warning(png_ptr, "Image width exceeds user limit in IHDR");
-      if ((width >> 16) == height)
-      {
-         /* This is likely to be caused by passing consecutive addresses
-          * of 16-bit width and height variables to png_get_IHDR(), which
-          * overflowed when we tried to fill them with 31-bit data.
-          */ 
-         png_warning(png_ptr, "High bytes of width == low bytes of height");
-      }
       error = 1;
    }
 
diff --git a/pngget.c b/pngget.c
index cd9d62e..556b43d 100644
--- a/pngget.c
+++ b/pngget.c
@@ -1,7 +1,7 @@
 
 /* pngget.c - retrieval of values from info struct
  *
- * Last changed in libpng 1.4.0 [September 30, 2009]
+ * Last changed in libpng 1.4.0 [October 1, 2009]
  * Copyright (c) 1998-2009 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
@@ -579,10 +579,6 @@
    int *filter_type)
 
 {
-   int test_interlace_type = 0;
-   int test_compression_type = 0;
-   int test_filter_type = 0;
-
    png_debug1(1, "in %s retrieval function", "IHDR");
 
    if (png_ptr == NULL || info_ptr == NULL || width == NULL ||
@@ -595,26 +591,22 @@
    *color_type = info_ptr->color_type;
 
    if (compression_type != NULL)
-   {
       *compression_type = info_ptr->compression_type;
-      test_compression_type=*compression_type;
-   }
 
    if (filter_type != NULL)
-   {
       *filter_type = info_ptr->filter_type;
-      test_filter_type=*filter_type;
-   }
 
    if (interlace_type != NULL)
-   {
       *interlace_type = info_ptr->interlace_type;
-      test_interlace_type=*interlace_type;
-   }
 
-   png_check_IHDR (png_ptr, *width, *height, *bit_depth, *color_type,
-      info_ptr->interlace_type, info_ptr->compression_type,
-      info_ptr->filter_type);
+   /* This is redundant if we can be sure that the info_ptr values were all
+    * assigned in png_set_IHDR().  We do the check anyhow in case an
+    * application has ignored our advice not to mess with the members
+    * of info_ptr directly.
+    */
+   png_check_IHDR (png_ptr, info_ptr->width, info_ptr->height,
+       info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type,
+       info_ptr->compression_type, info_ptr->filter_type);
 
    return (1);
 }
diff --git a/pngset.c b/pngset.c
index bd1f496..b494cd5 100644
--- a/pngset.c
+++ b/pngset.c
@@ -1,7 +1,7 @@
 
 /* pngset.c - storage of image information into info struct
  *
- * Last changed in libpng 1.4.0 [September 30, 2009]
+ * Last changed in libpng 1.4.0 [October 1, 2009]
  * Copyright (c) 1998-2009 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
@@ -227,16 +227,18 @@
    if (png_ptr == NULL || info_ptr == NULL)
       return;
 
-   png_check_IHDR (png_ptr, width, height, bit_depth, color_type,
-       interlace_type, compression_type, filter_type);
-
    info_ptr->width = width;
    info_ptr->height = height;
    info_ptr->bit_depth = (png_byte)bit_depth;
-   info_ptr->color_type =(png_byte) color_type;
+   info_ptr->color_type = (png_byte)color_type;
    info_ptr->compression_type = (png_byte)compression_type;
    info_ptr->filter_type = (png_byte)filter_type;
    info_ptr->interlace_type = (png_byte)interlace_type;
+
+   png_check_IHDR (png_ptr, info_ptr->width, info_ptr->height,
+       info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type,
+       info_ptr->compression_type, info_ptr->filter_type);
+
    if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
       info_ptr->channels = 1;
    else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR)