summaryrefslogtreecommitdiff
path: root/staging/xulrunner/5007_fix_libpr0n_nsPNGDecoder.patch
blob: dc93a2e8a631fc405dec580383e5b1e9686b57fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# HG changeset patch
# User Glenn Randers-Pehrson <glennrp+bmo@gmail.com>
# Date 1320490106 0
# Node ID aff1bd412058cb6926a8feae1e8c0fc76b4c04a3
# Parent  8248dbffd64534fb6c65ad3d757b795119e783c6
Bug 682677 - Eliminated direct access to mInfo->pixel_depth, which is not allowed in libpng15.  We access pixel_depth via png_get_IHDR() instead; r=joedrew

diff --git a/modules/libpr0n/decoders/nsICODecoder.cpp b/modules/libpr0n/decoders/nsICODecoder.cpp
--- a/modules/libpr0n/decoders/nsICODecoder.cpp
+++ b/modules/libpr0n/decoders/nsICODecoder.cpp
@@ -381,18 +381,17 @@ nsICODecoder::WriteInternal(const char* 
       return;
     }
     mPos += aCount;
     aBuffer += aCount;
     aCount = 0;
 
     // Raymond Chen says that 32bpp only are valid PNG ICOs
     // http://blogs.msdn.com/b/oldnewthing/archive/2010/10/22/10079192.aspx
-    if (static_cast<nsPNGDecoder*>(mContainedDecoder.get())->HasValidInfo() && 
-        static_cast<nsPNGDecoder*>(mContainedDecoder.get())->GetPixelDepth() != 32) {
+    if (!static_cast<nsPNGDecoder*>(mContainedDecoder.get())->IsValidICO()) {
       PostDataError();
     }
     return;
   }
 
   // We've processed all of the icon dir entries and are within the 
   // bitmap info size
   if (!mIsPNG && mCurrIcon == mNumIcons && mPos >= mImageOffset && 
diff --git a/modules/libpr0n/decoders/nsPNGDecoder.h b/modules/libpr0n/decoders/nsPNGDecoder.h
--- a/modules/libpr0n/decoders/nsPNGDecoder.h
+++ b/modules/libpr0n/decoders/nsPNGDecoder.h
@@ -68,29 +68,35 @@ public:
 
   void CreateFrame(png_uint_32 x_offset, png_uint_32 y_offset,
                    PRInt32 width, PRInt32 height,
                    gfxASurface::gfxImageFormat format);
   void SetAnimFrameInfo();
 
   void EndImageFrame();
 
-  // Checks if the info header contains valid information
-  bool HasValidInfo() const 
+  // Check if PNG is valid ICO (32bpp RGBA)
+  // http://blogs.msdn.com/b/oldnewthing/archive/2010/10/22/10079192.aspx
+  bool IsValidICO() const
   {
-    return mInfo && mInfo->valid;
-  }
+    png_uint_32
+        png_width,  // Unused
+        png_height; // Unused
 
-  // Obtain the pixel depth if available or 0 otherwise
-  PRInt32 GetPixelDepth() const
-  {
-    if (!mInfo) {
-      return 0;
+    int png_bit_depth,
+        png_color_type;
+
+    if (png_get_IHDR(mPNG, mInfo, &png_width, &png_height, &png_bit_depth,
+                     &png_color_type, NULL, NULL, NULL)) {
+
+      return (png_color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
+              png_bit_depth == 8);
+    } else {
+      return false;
     }
-    return mInfo->pixel_depth;
   }
 
 public:
   png_structp mPNG;
   png_infop mInfo;
   nsIntRect mFrameRect;
   PRUint8 *mCMSLine;
   PRUint8 *interlacebuf;