Fix undefined behavior in libpng
authorscroggo <scroggo@chromium.org>
Fri, 3 Jun 2016 16:36:53 +0000 (09:36 -0700)
committerCommit bot <commit-bot@chromium.org>
Fri, 3 Jun 2016 16:36:53 +0000 (09:36 -0700)
Check for a null source before calling memcpy.

BUG=skia:5390
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2040433002

Review-Url: https://codereview.chromium.org/2040433002

third_party/libpng/README.google
third_party/libpng/pngpread.c

index 20f5d46..1acc408 100644 (file)
@@ -9,3 +9,4 @@ Local Modifications:
     (2) Included Intel optimizations by running:
     "patch -i contrib/intel/intel_sse.patch -p1"
     (3) Removed files unused by Skia
+    (4) Fixed an undefined behavior bug (skbug.com/5390)
index 0dc1e53..0266cbe 100644 (file)
@@ -499,7 +499,18 @@ png_push_save_buffer(png_structrp png_ptr)
          png_error(png_ptr, "Insufficient memory for save_buffer");
       }
 
+#if 0
+      // This is the code checked into libpng. Calling memcpy with a null
+      // source is undefined, even if count is 0, but libpng does not
+      // currently check for null or 0. The Skia fix is below.
+      // skbug.com/5390
       memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
+#else
+      if (old_buffer)
+         memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
+      else if (png_ptr->save_buffer_size)
+         png_error(png_ptr, "save_buffer error");
+#endif
       png_free(png_ptr, old_buffer);
       png_ptr->save_buffer_max = new_max;
    }