[libpng16] Restored png_get_eXIf_1() and png_set_eXIf_1() because strlen(eXIf_buf)

does not work (the eXIf chunk data can contain zeroes).
diff --git a/ANNOUNCE b/ANNOUNCE
index a8f52d7..2f09057 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -61,6 +61,8 @@
 Version 1.6.32beta08 [August 3, 2017]
   Check length of IDAT against maximum possible IDAT size, accounting
     for height, rowbytes, interlacing and zlib/deflate overhead.
+  Restored png_get_eXIf_1() and png_set_eXIf_1(), because strlen(eXIf_buf)
+    does not work (the eXIf chunk data can contain zeroes).
 
 Send comments/corrections/commendations to png-mng-implement at lists.sf.net
 (subscription required; visit
diff --git a/CHANGES b/CHANGES
index d2dc000..889c0d1 100644
--- a/CHANGES
+++ b/CHANGES
@@ -5944,6 +5944,8 @@
 Version 1.6.32beta08 [August 3, 2017]
   Check length of IDAT against maximum possible IDAT size, accounting
     for height, rowbytes, interlacing and zlib/deflate overhead.
+  Restored png_get_eXIf_1() and png_set_eXIf_1(), because strlen(eXIf_buf)
+    does not work (the eXIf chunk data can contain zeroes).
   
 Send comments/corrections/commendations to png-mng-implement at lists.sf.net
 (subscription required; visit
diff --git a/png.h b/png.h
index a2cd990..46ed7d8 100644
--- a/png.h
+++ b/png.h
@@ -2014,6 +2014,10 @@
     png_inforp info_ptr, png_bytep *exif));
 PNG_EXPORT(247, void, png_set_eXIf, (png_const_structrp png_ptr,
     png_inforp info_ptr, const png_bytep exif));
+PNG_EXPORT(248, png_uint_32, png_get_eXIf_1, (png_const_structrp png_ptr,
+    png_inforp info_ptr, png_uint_32 *num_exif, png_bytep *exif));
+PNG_EXPORT(249, void, png_set_eXIf_1, (png_const_structrp png_ptr,
+    png_inforp info_ptr, png_uint_32 num_exif, const png_bytep exif));
 #endif
 
 #ifdef PNG_gAMA_SUPPORTED
@@ -3259,7 +3263,7 @@
  * one to use is one more than this.)
  */
 #ifdef PNG_EXPORT_LAST_ORDINAL
-  PNG_EXPORT_LAST_ORDINAL(247);
+  PNG_EXPORT_LAST_ORDINAL(249);
 #endif
 
 #ifdef __cplusplus
diff --git a/pngget.c b/pngget.c
index 9068952..5046db5 100644
--- a/pngget.c
+++ b/pngget.c
@@ -778,11 +778,22 @@
 png_get_eXIf(png_const_structrp png_ptr, png_inforp info_ptr,
     png_bytep *exif)
 {
+  png_warning(png_ptr, "png_get_eXIf does not work; use png_get_eXIf_1");
+  PNG_UNUSED(info_ptr)
+  PNG_UNUSED(exif)
+  return 0;
+}
+
+png_uint_32 PNGAPI
+png_get_eXIf_1(png_const_structrp png_ptr, png_inforp info_ptr,
+    png_uint_32 *num_exif, png_bytep *exif)
+{
    png_debug1(1, "in %s retrieval function", "eXIf");
 
    if (png_ptr != NULL && info_ptr != NULL &&
        (info_ptr->valid & PNG_INFO_eXIf) != 0 && exif != NULL)
    {
+      *num_exif = info_ptr->num_exif;
       *exif = info_ptr->exif;
       return (PNG_INFO_eXIf);
    }
diff --git a/pngrutil.c b/pngrutil.c
index 703f03d..f7964fc 100644
--- a/pngrutil.c
+++ b/pngrutil.c
@@ -2078,7 +2078,7 @@
    if (png_crc_finish(png_ptr, 0) != 0)
       return;
 
-   png_set_eXIf(png_ptr, info_ptr, info_ptr->eXIf_buf);
+   png_set_eXIf_1(png_ptr, info_ptr, length, info_ptr->eXIf_buf);
 
    png_free(png_ptr, info_ptr->eXIf_buf);
    info_ptr->eXIf_buf = NULL;
diff --git a/pngset.c b/pngset.c
index fc8bbc8..0efebb0 100644
--- a/pngset.c
+++ b/pngset.c
@@ -139,6 +139,15 @@
 png_set_eXIf(png_const_structrp png_ptr, png_inforp info_ptr,
     const png_bytep eXIf_buf)
 {
+  png_warning(png_ptr, "png_set_eXIf does not work; use png_set_eXIf_1");
+  PNG_UNUSED(info_ptr)
+  PNG_UNUSED(eXIf_buf)
+}
+
+void PNGAPI
+png_set_eXIf_1(png_const_structrp png_ptr, png_inforp info_ptr,
+    const png_uint_32 num_exif, const png_bytep eXIf_buf)
+{
    int i;
 
    png_debug1(1, "in %s storage function", "eXIf");
@@ -152,7 +161,7 @@
       info_ptr->exif = NULL;
    }
 
-   info_ptr->num_exif = (png_uint_32)strlen((const char *)eXIf_buf);
+   info_ptr->num_exif = num_exif;
 
    info_ptr->exif = png_voidcast(png_bytep, png_malloc_warn(png_ptr,
        info_ptr->num_exif));
diff --git a/pngtest.c b/pngtest.c
index dfa2ad3..3786547 100644
--- a/pngtest.c
+++ b/pngtest.c
@@ -1201,16 +1201,15 @@
 #ifdef PNG_READ_eXIf_SUPPORTED
    {
       png_bytep exif=NULL;
-      size_t exif_length;
+      png_uint_32 exif_length;
 
-      if (png_get_eXIf(read_ptr, read_info_ptr, &exif) != 0)
+      if (png_get_eXIf_1(read_ptr, read_info_ptr, &exif_length, &exif) != 0)
       {
-         exif_length=strlen((const char *)exif);
          if (exif_length > 1)
             printf(" eXIf type %c%c, %lu bytes\n",exif[0],exif[1],
-               exif_length);
+               (unsigned long)exif_length);
 # ifdef PNG_WRITE_eXIf_SUPPORTED
-         png_set_eXIf(write_ptr, write_info_ptr, exif);
+         png_set_eXIf_1(write_ptr, write_info_ptr, exif_length, exif);
 # endif
       }
    }
@@ -1562,14 +1561,13 @@
       png_bytep exif=NULL;
       png_uint_32 exif_length;
 
-      if (png_get_eXIf(read_ptr, end_info_ptr, &exif) != 0)
+      if (png_get_eXIf_1(read_ptr, end_info_ptr, &exif_length, &exif) != 0)
       {
-         exif_length=(png_uint_32)strlen((const char *)exif);
          if (exif_length > 1)
-            printf(" eXIf type %c%c, %d bytes\n",exif[0],exif[1],
-               (int)exif_length);
+            printf(" eXIf type %c%c, %lu bytes\n",exif[0],exif[1],
+               (unsigned long)exif_length);
 # ifdef PNG_WRITE_eXIf_SUPPORTED
-         png_set_eXIf(write_ptr, write_end_info_ptr, exif);
+         png_set_eXIf_1(write_ptr, write_end_info_ptr, exif_length, exif);
 # endif
       }
    }