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;
|