Imported from libpng-1.0.11beta3.tar
diff --git a/pngrutil.c b/pngrutil.c
index 5b9b745..522af2a 100644
--- a/pngrutil.c
+++ b/pngrutil.c
@@ -1,7 +1,7 @@
 
 /* pngrutil.c - utilities to read a PNG file
  *
- * libpng 1.0.11beta2 - April 11, 2001
+ * libpng 1.0.11beta3 - April 15, 2001
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998-2001 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
@@ -201,15 +201,19 @@
             {
                text_size = prefix_size + sizeof(msg) + 1;
                text = (png_charp)png_malloc(png_ptr, text_size);
-               png_memcpy(text, chunkdata, prefix_size);
+               if (text != NULL)
+                 png_memcpy(text, chunkdata, prefix_size);
             }
 
-            text[text_size - 1] = 0x00;
+            if (text != NULL)
+            {
+               text[text_size - 1] = 0x00;
 
-            /* Copy what we can of the error message into the text chunk */
-            text_size = (png_size_t)(chunklength - (text - chunkdata) - 1);
-            text_size = sizeof(msg) > text_size ? text_size : sizeof(msg);
-            png_memcpy(text + prefix_size, msg, text_size + 1);
+               /* Copy what we can of the error message into the text chunk */
+               text_size = (png_size_t)(chunklength - (text - chunkdata) - 1);
+               text_size = sizeof(msg) > text_size ? text_size : sizeof(msg);
+               png_memcpy(text + prefix_size, msg, text_size + 1);
+            }
             break;
          }
          if (!png_ptr->zstream.avail_out || ret == Z_STREAM_END)
@@ -219,10 +223,13 @@
                text_size = prefix_size +
                    png_ptr->zbuf_size - png_ptr->zstream.avail_out;
                text = (png_charp)png_malloc(png_ptr, text_size + 1);
-               png_memcpy(text + prefix_size, png_ptr->zbuf,
+               if (text != NULL)
+               {
+                 png_memcpy(text + prefix_size, png_ptr->zbuf,
                           text_size - prefix_size);
-               png_memcpy(text, chunkdata, prefix_size);
-               *(text + text_size) = 0x00;
+                 png_memcpy(text, chunkdata, prefix_size);
+                 *(text + text_size) = 0x00;
+               }
             }
             else
             {
@@ -231,12 +238,20 @@
                tmp = text;
                text = (png_charp)png_malloc(png_ptr, (png_uint_32)(text_size +
                   png_ptr->zbuf_size - png_ptr->zstream.avail_out + 1));
+               if (text != NULL)
+               {
                png_memcpy(text, tmp, text_size);
                png_free(png_ptr, tmp);
                png_memcpy(text + text_size, png_ptr->zbuf,
                   (png_ptr->zbuf_size - png_ptr->zstream.avail_out));
                text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out;
                *(text + text_size) = 0x00;
+               }
+               else
+               {
+                  png_warning (png_ptr, "Could not malloc text buffer");
+                  text=tmp;
+               }
             }
             if (ret == Z_STREAM_END)
                break;
@@ -270,9 +285,13 @@
          if (text ==  NULL)
          {
             text = (png_charp)png_malloc(png_ptr, text_size+1);
-            png_memcpy(text, chunkdata, prefix_size);
+            if (text !=  NULL)
+               png_memcpy(text, chunkdata, prefix_size);
+            else
+               png_warning(png_ptr, "Could not malloc text chunkdata");
          }
-         *(text + text_size) = 0x00;
+         if (text !=  NULL)
+            *(text + text_size) = 0x00;
       }
 
       inflateReset(&png_ptr->zstream);
@@ -983,7 +1002,14 @@
 
    chunkdata = (png_charp)png_malloc(png_ptr, length + 1);
    slength = (png_size_t)length;
-   png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
+   if (chunkdata != (png_charp)NULL)
+      png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
+   else
+   {
+      png_warning(png_ptr, "Could not allocate memory for iCCP chunk");
+      png_crc_finish(png_ptr, slength);
+      return;
+   }
 
    if (png_crc_finish(png_ptr, skip))
    {
@@ -1079,8 +1105,16 @@
 #endif
 
    chunkdata = (png_bytep)png_malloc(png_ptr, length + 1);
-   slength = (png_size_t)length;
-   png_crc_read(png_ptr, chunkdata, slength);
+   if (chunkdata != (png_bytep)NULL)
+   {
+      slength = (png_size_t)length;
+      png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
+   }
+   else
+   {
+      png_warning(png_ptr, "Could not allocate memory for sPLT chunk");
+      skip = (png_size_t)length;
+   }
 
    if (png_crc_finish(png_ptr, skip))
    {
@@ -1110,12 +1144,19 @@
    if (data_length % entry_size)
    {
       png_free(png_ptr, chunkdata);
-      png_error(png_ptr, "sPLT chunk has bad length");
+      png_warning(png_ptr, "sPLT chunk has bad length");
+      return;
    }
 
    new_palette.nentries = data_length / entry_size;
    new_palette.entries = (png_sPLT_entryp)png_malloc(
        png_ptr, new_palette.nentries * sizeof(png_sPLT_entry));
+   if (new_palette.entries == (png_sPLT_entryp)NULL)
+   {
+       png_free(png_ptr, chunkdata);
+       png_warning (png_ptr, "Could not allocate sPLT entries");
+       return;
+   }
 
 #ifndef PNG_NO_POINTER_INDEXING
    for (i = 0; i < new_palette.nentries; i++)
@@ -1525,6 +1566,12 @@
    png_debug1(2, "Allocating and reading pCAL chunk data (%lu bytes)\n",
       length + 1);
    purpose = (png_charp)png_malloc(png_ptr, length + 1);
+   if (purpose == (png_charp)NULL)
+   {
+     png_warning (png_ptr, "Could not allocate memory for pCAL purpose");
+     png_crc_finish(png_ptr, length);
+     return;
+   }
    slength = (png_size_t)length;
    png_crc_read(png_ptr, (png_bytep)purpose, slength);
 
@@ -1581,6 +1628,11 @@
    png_debug(3, "Allocating pCAL parameters array\n");
    params = (png_charpp)png_malloc(png_ptr, (png_uint_32)(nparams
       *sizeof(png_charp))) ;
+   if (params == (png_charpp)NULL)
+   {
+      png_warning (png_ptr, "Could not allocate pCAL parameters array");
+      nparams=0;
+   }
 
    /* Get pointers to the start of each parameter string. */
    for (i = 0; i < (int)nparams; i++)
@@ -1645,6 +1697,12 @@
    png_debug1(2, "Allocating and reading sCAL chunk data (%lu bytes)\n",
       length + 1);
    buffer = (png_charp)png_malloc(png_ptr, length + 1);
+   if (buffer == (png_charp)NULL)
+   {
+     png_warning (png_ptr, "Could not allocate memory for sCAL buffer");
+     png_crc_finish(png_ptr, length);
+     return;
+   }
    slength = (png_size_t)length;
    png_crc_read(png_ptr, (png_bytep)buffer, slength);
 
@@ -1668,7 +1726,8 @@
 #else
 #ifdef PNG_FIXED_POINT_SUPPORTED
    swidth = (png_charp)png_malloc(png_ptr, png_strlen(ep) + 1);
-   png_memcpy(swidth, ep, (png_size_t)png_strlen(ep));
+   if (swidth != (png_charp)NULL)
+     png_memcpy(swidth, ep, (png_size_t)png_strlen(ep));
 #endif
 #endif
 
@@ -1686,7 +1745,8 @@
 #else
 #ifdef PNG_FIXED_POINT_SUPPORTED
    sheight = (png_charp)png_malloc(png_ptr, png_strlen(ep) + 1);
-   png_memcpy(sheight, ep, (png_size_t)png_strlen(ep));
+   if (sheight != (png_charp)NULL)
+      png_memcpy(sheight, ep, (png_size_t)png_strlen(ep));
 #endif
 #endif
 
@@ -1795,7 +1855,14 @@
 
    key = (png_charp)png_malloc(png_ptr, length + 1);
    slength = (png_size_t)length;
-   png_crc_read(png_ptr, (png_bytep)key, slength);
+   if (key == (png_charp)NULL)
+   {
+      png_warning (png_ptr, "Could not allocate memory for tEXt chunk");
+      png_crc_finish(png_ptr, slength);
+      return;
+   }
+   else
+      png_crc_read(png_ptr, (png_bytep)key, slength);
 
    if (png_crc_finish(png_ptr, skip))
    {
@@ -1812,6 +1879,8 @@
       text++;
 
    text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
+   if (text_ptr != (png_textp)NULL)
+   {
    text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
    text_ptr->key = key;
 #ifdef PNG_iTXt_SUPPORTED
@@ -1824,8 +1893,11 @@
 
    png_set_text(png_ptr, info_ptr, text_ptr, 1);
 
-   png_free(png_ptr, key);
    png_free(png_ptr, text_ptr);
+   }
+   else
+     png_warning(png_ptr, "Could not allocate iTXt pointer");
+   png_free(png_ptr, key);
 }
 #endif
 
@@ -1859,8 +1931,17 @@
 #endif
 
    chunkdata = (png_charp)png_malloc(png_ptr, length + 1);
-   slength = (png_size_t)length;
-   png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
+   if (chunkdata != (png_charp)NULL)
+   {
+     slength = (png_size_t)length;
+     png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
+   }
+   else
+   {
+     png_warning (png_ptr, "Could not allocate memory for zTXt chunk data");
+     png_crc_finish(png_ptr, length);
+     return;
+   }
    if (png_crc_finish(png_ptr, 0))
    {
       png_free(png_ptr, chunkdata);
@@ -1894,19 +1975,24 @@
                                     (png_size_t)length, prefix_len, &data_len);
 
    text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
-   text_ptr->compression = comp_type;
-   text_ptr->key = chunkdata;
+   if (text_ptr != (png_textp)NULL)
+   {
+     text_ptr->compression = comp_type;
+     text_ptr->key = chunkdata;
 #ifdef PNG_iTXt_SUPPORTED
-   text_ptr->lang = NULL;
-   text_ptr->lang_key = NULL;
-   text_ptr->itxt_length = 0;
+     text_ptr->lang = NULL;
+     text_ptr->lang_key = NULL;
+     text_ptr->itxt_length = 0;
 #endif
-   text_ptr->text = chunkdata + prefix_len;
-   text_ptr->text_length = data_len;
+     text_ptr->text = chunkdata + prefix_len;
+     text_ptr->text_length = data_len;
 
-   png_set_text(png_ptr, info_ptr, text_ptr, 1);
+     png_set_text(png_ptr, info_ptr, text_ptr, 1);
 
-   png_free(png_ptr, text_ptr);
+     png_free(png_ptr, text_ptr);
+   }
+   else
+      png_warning (png_ptr, "Could not allocate memory for zTXt data");
    png_free(png_ptr, chunkdata);
 }
 #endif
@@ -1943,8 +2029,17 @@
 #endif
 
    chunkdata = (png_charp)png_malloc(png_ptr, length + 1);
-   slength = (png_size_t)length;
-   png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
+   if (chunkdata != (png_charp)NULL)
+   {
+     slength = (png_size_t)length;
+     png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
+   }
+   else
+   {
+     png_warning (png_ptr, "Could not allocate memory for iTXt chunk data");
+     png_crc_finish(png_ptr, length);
+     return;
+   }
    if (png_crc_finish(png_ptr, 0))
    {
       png_free(png_ptr, chunkdata);
@@ -1989,17 +2084,22 @@
    else
        data_len=png_strlen(chunkdata + prefix_len);
    text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
-   text_ptr->compression = (int)comp_flag + 1;
-   text_ptr->lang_key = chunkdata+(lang_key-key);
-   text_ptr->lang = chunkdata+(lang-key);
-   text_ptr->itxt_length = data_len;
-   text_ptr->text_length = 0;
-   text_ptr->key = chunkdata;
-   text_ptr->text = chunkdata + prefix_len;
+   if (text_ptr != (png_textp)NULL)
+   {
+     text_ptr->compression = (int)comp_flag + 1;
+     text_ptr->lang_key = chunkdata+(lang_key-key);
+     text_ptr->lang = chunkdata+(lang-key);
+     text_ptr->itxt_length = data_len;
+     text_ptr->text_length = 0;
+     text_ptr->key = chunkdata;
+     text_ptr->text = chunkdata + prefix_len;
 
-   png_set_text(png_ptr, info_ptr, text_ptr, 1);
+     png_set_text(png_ptr, info_ptr, text_ptr, 1);
 
-   png_free(png_ptr, text_ptr);
+     png_free(png_ptr, text_ptr);
+   }
+   else
+     png_warning (png_ptr, "Could not allocate memory for iTXt chunk data");
    png_free(png_ptr, chunkdata);
 }
 #endif
@@ -2055,8 +2155,17 @@
 #endif
        png_strcpy((png_charp)chunk.name, (png_charp)png_ptr->chunk_name);
        chunk.data = (png_bytep)png_malloc(png_ptr, length);
-       png_crc_read(png_ptr, chunk.data, length);
-       chunk.size = length;
+       if (chunk.data != (png_bytep)NULL)
+       {
+         chunk.size = (png_size_t)length;
+         png_crc_read(png_ptr, (png_bytep)chunk.data, length);
+       }
+       else
+       {
+         png_warning (png_ptr, "Could not allocate memory for iTXt chunk data");
+         png_crc_finish(png_ptr, length);
+         return;
+       }
 #if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
        if(png_ptr->read_user_chunk_fn != (png_user_chunk_ptr)NULL)
        {
@@ -2963,6 +3072,8 @@
       png_error(png_ptr, "This image requires a row greater than 64KB");
 #endif
    png_ptr->row_buf = (png_bytep)png_malloc(png_ptr, row_bytes);
+   if (png_ptr->row_buf == (png_bytep)NULL)
+      png_error (png_ptr, "Could not allocate memory for row buffer");
    png_ptr->row_buf_size = row_bytes;
 
 #ifdef PNG_MAX_MALLOC_64K
@@ -2971,6 +3082,11 @@
 #endif
    png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)(
       png_ptr->rowbytes + 1));
+   if (png_ptr->prev_row == (png_bytep)NULL)
+   {
+      png_free (png_ptr, png_ptr->row_buf);
+      png_error (png_ptr, "Could not allocate memory for previous row buffer");
+   }
 
    png_memset_check(png_ptr, png_ptr->prev_row, 0, png_ptr->rowbytes + 1);