Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Side by Side Diff: core/fpdfapi/fpdf_render/fpdf_render_image.cpp

Issue 2350193003: Fix "heap use after free" bug. (Closed)
Patch Set: Rebase to Head. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "core/fpdfapi/fpdf_render/render_int.h" 7 #include "core/fpdfapi/fpdf_render/render_int.h"
8 8
9 #include <memory> 9 #include <memory>
10 #include <utility> 10 #include <utility>
(...skipping 972 matching lines...) Expand 10 before | Expand all | Expand 10 after
983 FXDIB_Format format; 983 FXDIB_Format format;
984 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || defined _SKIA_SUPPORT_ 984 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || defined _SKIA_SUPPORT_
985 format = bLuminosity ? FXDIB_Rgb32 : FXDIB_8bppMask; 985 format = bLuminosity ? FXDIB_Rgb32 : FXDIB_8bppMask;
986 #else 986 #else
987 format = bLuminosity ? FXDIB_Rgb : FXDIB_8bppMask; 987 format = bLuminosity ? FXDIB_Rgb : FXDIB_8bppMask;
988 #endif 988 #endif
989 if (!bitmap_device.Create(width, height, format, nullptr)) 989 if (!bitmap_device.Create(width, height, format, nullptr))
990 return nullptr; 990 return nullptr;
991 991
992 CFX_DIBitmap& bitmap = *bitmap_device.GetBitmap(); 992 CFX_DIBitmap& bitmap = *bitmap_device.GetBitmap();
993 CPDF_Object* pCSObj = nullptr; 993 int color_space_family = 0;
994 CPDF_ColorSpace* pCS = nullptr;
995 if (bLuminosity) { 994 if (bLuminosity) {
996 CPDF_Array* pBC = pSMaskDict->GetArrayFor("BC"); 995 CPDF_Array* pBC = pSMaskDict->GetArrayFor("BC");
997 FX_ARGB back_color = 0xff000000; 996 FX_ARGB back_color = 0xff000000;
998 if (pBC) { 997 if (pBC) {
998 CPDF_Object* pCSObj = nullptr;
999 CPDF_Dictionary* pDict = pGroup->GetDict(); 999 CPDF_Dictionary* pDict = pGroup->GetDict();
1000 if (pDict && pDict->GetDictFor("Group")) 1000 if (pDict && pDict->GetDictFor("Group")) {
1001 pCSObj = pDict->GetDictFor("Group")->GetDirectObjectFor("CS"); 1001 pCSObj = pDict->GetDictFor("Group")->GetDirectObjectFor("CS");
1002 else 1002 }
1003 pCSObj = nullptr; 1003 const CPDF_ColorSpace* pCS =
1004 pCS = m_pContext->GetDocument()->LoadColorSpace(pCSObj); 1004 m_pContext->GetDocument()->LoadColorSpace(pCSObj);
1005 if (pCS) { 1005 if (pCS) {
1006 // Store Color Space Family to use in CPDF_RenderStatus::Initialize.
1007 color_space_family = pCS->GetFamily();
1008
1006 FX_FLOAT R, G, B; 1009 FX_FLOAT R, G, B;
1007 uint32_t comps = 8; 1010 uint32_t comps = 8;
1008 if (pCS->CountComponents() > comps) { 1011 if (pCS->CountComponents() > comps) {
1009 comps = pCS->CountComponents(); 1012 comps = pCS->CountComponents();
1010 } 1013 }
1011 CFX_FixedBufGrow<FX_FLOAT, 8> float_array(comps); 1014 CFX_FixedBufGrow<FX_FLOAT, 8> float_array(comps);
1012 FX_FLOAT* pFloats = float_array; 1015 FX_FLOAT* pFloats = float_array;
1013 FX_SAFE_UINT32 num_floats = comps; 1016 FX_SAFE_UINT32 num_floats = comps;
1014 num_floats *= sizeof(FX_FLOAT); 1017 num_floats *= sizeof(FX_FLOAT);
1015 if (!num_floats.IsValid()) { 1018 if (!num_floats.IsValid()) {
(...skipping 16 matching lines...) Expand all
1032 } 1035 }
1033 CPDF_Dictionary* pFormResource = nullptr; 1036 CPDF_Dictionary* pFormResource = nullptr;
1034 if (form.m_pFormDict) { 1037 if (form.m_pFormDict) {
1035 pFormResource = form.m_pFormDict->GetDictFor("Resources"); 1038 pFormResource = form.m_pFormDict->GetDictFor("Resources");
1036 } 1039 }
1037 CPDF_RenderOptions options; 1040 CPDF_RenderOptions options;
1038 options.m_ColorMode = bLuminosity ? RENDER_COLOR_NORMAL : RENDER_COLOR_ALPHA; 1041 options.m_ColorMode = bLuminosity ? RENDER_COLOR_NORMAL : RENDER_COLOR_ALPHA;
1039 CPDF_RenderStatus status; 1042 CPDF_RenderStatus status;
1040 status.Initialize(m_pContext, &bitmap_device, nullptr, nullptr, nullptr, 1043 status.Initialize(m_pContext, &bitmap_device, nullptr, nullptr, nullptr,
1041 nullptr, &options, 0, m_bDropObjects, pFormResource, TRUE, 1044 nullptr, &options, 0, m_bDropObjects, pFormResource, TRUE,
1042 nullptr, 0, pCS ? pCS->GetFamily() : 0, bLuminosity); 1045 nullptr, 0, color_space_family, bLuminosity);
1043 status.RenderObjectList(&form, &matrix); 1046 status.RenderObjectList(&form, &matrix);
1044 std::unique_ptr<CFX_DIBitmap> pMask(new CFX_DIBitmap); 1047 std::unique_ptr<CFX_DIBitmap> pMask(new CFX_DIBitmap);
1045 if (!pMask->Create(width, height, FXDIB_8bppMask)) 1048 if (!pMask->Create(width, height, FXDIB_8bppMask))
1046 return nullptr; 1049 return nullptr;
1047 1050
1048 uint8_t* dest_buf = pMask->GetBuffer(); 1051 uint8_t* dest_buf = pMask->GetBuffer();
1049 int dest_pitch = pMask->GetPitch(); 1052 int dest_pitch = pMask->GetPitch();
1050 uint8_t* src_buf = bitmap.GetBuffer(); 1053 uint8_t* src_buf = bitmap.GetBuffer();
1051 int src_pitch = bitmap.GetPitch(); 1054 int src_pitch = bitmap.GetPitch();
1052 std::vector<uint8_t> transfers(256); 1055 std::vector<uint8_t> transfers(256);
(...skipping 23 matching lines...) Expand all
1076 } else if (pFunc) { 1079 } else if (pFunc) {
1077 int size = dest_pitch * height; 1080 int size = dest_pitch * height;
1078 for (int i = 0; i < size; i++) { 1081 for (int i = 0; i < size; i++) {
1079 dest_buf[i] = transfers[src_buf[i]]; 1082 dest_buf[i] = transfers[src_buf[i]];
1080 } 1083 }
1081 } else { 1084 } else {
1082 FXSYS_memcpy(dest_buf, src_buf, dest_pitch * height); 1085 FXSYS_memcpy(dest_buf, src_buf, dest_pitch * height);
1083 } 1086 }
1084 return pMask.release(); 1087 return pMask.release();
1085 } 1088 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698