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

Side by Side Diff: core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp

Issue 477323002: Font is used after release in CPDF_TextStateData::~CPDF_TextStateData (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 6 years, 4 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
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 "../../../include/fpdfapi/fpdf_page.h" 7 #include "../../../include/fpdfapi/fpdf_page.h"
8 #include "../../../include/fpdfapi/fpdf_module.h" 8 #include "../../../include/fpdfapi/fpdf_module.h"
9 #include "../../../include/fdrm/fx_crypt.h" 9 #include "../../../include/fdrm/fx_crypt.h"
10 #include "../fpdf_font/font_int.h" 10 #include "../fpdf_font/font_int.h"
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 GetPageData()->ReleaseColorSpace(pCSObj); 127 GetPageData()->ReleaseColorSpace(pCSObj);
128 } 128 }
129 CPDF_DocPageData::CPDF_DocPageData(CPDF_Document *pPDFDoc) 129 CPDF_DocPageData::CPDF_DocPageData(CPDF_Document *pPDFDoc)
130 : m_pPDFDoc(pPDFDoc) 130 : m_pPDFDoc(pPDFDoc)
131 , m_FontMap() 131 , m_FontMap()
132 , m_ColorSpaceMap() 132 , m_ColorSpaceMap()
133 , m_PatternMap() 133 , m_PatternMap()
134 , m_ImageMap() 134 , m_ImageMap()
135 , m_IccProfileMap() 135 , m_IccProfileMap()
136 , m_FontFileMap() 136 , m_FontFileMap()
137 , m_bForceClear(FALSE)
137 { 138 {
138 m_FontMap.InitHashTable(64); 139 m_FontMap.InitHashTable(64);
139 m_ColorSpaceMap.InitHashTable(32); 140 m_ColorSpaceMap.InitHashTable(32);
140 m_PatternMap.InitHashTable(16); 141 m_PatternMap.InitHashTable(16);
141 m_ImageMap.InitHashTable(64); 142 m_ImageMap.InitHashTable(64);
142 m_IccProfileMap.InitHashTable(16); 143 m_IccProfileMap.InitHashTable(16);
143 m_FontFileMap.InitHashTable(32); 144 m_FontFileMap.InitHashTable(32);
144 } 145 }
145 CPDF_DocPageData::~CPDF_DocPageData() 146 CPDF_DocPageData::~CPDF_DocPageData()
146 { 147 {
147 Clear(FALSE); 148 Clear(FALSE);
148 Clear(TRUE); 149 Clear(TRUE);
149 } 150 }
150 void CPDF_DocPageData::Clear(FX_BOOL bRelease) 151 void CPDF_DocPageData::Clear(FX_BOOL bForceRelease)
151 { 152 {
152 FX_POSITION pos; 153 FX_POSITION pos;
153 FX_DWORD nCount; 154 FX_DWORD nCount;
154 { 155
155 pos = m_PatternMap.GetStartPosition(); 156 m_bForceClear = bForceRelease;
156 while (pos) { 157 pos = m_PatternMap.GetStartPosition();
157 CPDF_Object* ptObj; 158 while (pos) {
158 CPDF_CountedObject<CPDF_Pattern*>* ptData; 159 CPDF_Object* ptObj;
159 m_PatternMap.GetNextAssoc(pos, ptObj, ptData); 160 CPDF_CountedObject<CPDF_Pattern*>* ptData;
160 nCount = ptData->m_nCount; 161 m_PatternMap.GetNextAssoc(pos, ptObj, ptData);
161 if (bRelease || nCount < 2) { 162 nCount = ptData->m_nCount;
162 delete ptData->m_Obj; 163 if (bForceRelease || nCount < 2) {
163 ptData->m_Obj = NULL; 164 delete ptData->m_Obj;
164 } 165 ptData->m_Obj = NULL;
165 } 166 }
166 } 167 }
167 { 168 pos = m_FontMap.GetStartPosition();
168 pos = m_FontMap.GetStartPosition(); 169 while (pos) {
169 while (pos) { 170 CPDF_Dictionary* fontDict;
170 CPDF_Dictionary* fontDict; 171 CPDF_CountedObject<CPDF_Font*>* fontData;
171 CPDF_CountedObject<CPDF_Font*>* fontData; 172 m_FontMap.GetNextAssoc(pos, fontDict, fontData);
172 m_FontMap.GetNextAssoc(pos, fontDict, fontData); 173 nCount = fontData->m_nCount;
173 nCount = fontData->m_nCount; 174 if (bForceRelease || nCount < 2) {
174 if (bRelease || nCount < 2) { 175 delete fontData->m_Obj;
175 delete fontData->m_Obj; 176 fontData->m_Obj = NULL;
176 fontData->m_Obj = NULL;
177 }
178 } 177 }
179 } 178 }
180 { 179 pos = m_ImageMap.GetStartPosition();
181 pos = m_ImageMap.GetStartPosition(); 180 while (pos) {
182 while (pos) { 181 FX_DWORD objNum;
183 FX_DWORD objNum; 182 CPDF_CountedObject<CPDF_Image*>* imageData;
184 CPDF_CountedObject<CPDF_Image*>* imageData; 183 m_ImageMap.GetNextAssoc(pos, objNum, imageData);
185 m_ImageMap.GetNextAssoc(pos, objNum, imageData); 184 nCount = imageData->m_nCount;
186 nCount = imageData->m_nCount; 185 if (bForceRelease || nCount < 2) {
187 if (bRelease || nCount < 2) { 186 delete imageData->m_Obj;
188 delete imageData->m_Obj; 187 delete imageData;
189 delete imageData; 188 m_ImageMap.RemoveKey(objNum);
190 m_ImageMap.RemoveKey(objNum);
191 }
192 } 189 }
193 } 190 }
194 { 191 pos = m_ColorSpaceMap.GetStartPosition();
195 pos = m_ColorSpaceMap.GetStartPosition(); 192 while (pos) {
196 while (pos) { 193 CPDF_Object* csKey;
197 CPDF_Object* csKey; 194 CPDF_CountedObject<CPDF_ColorSpace*>* csData;
198 CPDF_CountedObject<CPDF_ColorSpace*>* csData; 195 m_ColorSpaceMap.GetNextAssoc(pos, csKey, csData);
199 m_ColorSpaceMap.GetNextAssoc(pos, csKey, csData); 196 nCount = csData->m_nCount;
200 nCount = csData->m_nCount; 197 if (bForceRelease || nCount < 2) {
201 if (bRelease || nCount < 2) { 198 csData->m_Obj->ReleaseCS();
202 csData->m_Obj->ReleaseCS(); 199 csData->m_Obj = NULL;
203 csData->m_Obj = NULL;
204 }
205 } 200 }
206 } 201 }
207 { 202 pos = m_IccProfileMap.GetStartPosition();
208 pos = m_IccProfileMap.GetStartPosition(); 203 while (pos) {
209 while (pos) { 204 CPDF_Stream* ipKey;
210 CPDF_Stream* ipKey; 205 CPDF_CountedObject<CPDF_IccProfile*>* ipData;
211 CPDF_CountedObject<CPDF_IccProfile*>* ipData; 206 m_IccProfileMap.GetNextAssoc(pos, ipKey, ipData);
212 m_IccProfileMap.GetNextAssoc(pos, ipKey, ipData); 207 nCount = ipData->m_nCount;
213 nCount = ipData->m_nCount; 208 if (bForceRelease || nCount < 2) {
214 if (bRelease || nCount < 2) { 209 FX_POSITION pos2 = m_HashProfileMap.GetStartPosition();
215 FX_POSITION pos2 = m_HashProfileMap.GetStartPosition(); 210 while (pos2) {
216 while (pos2) { 211 CFX_ByteString bsKey;
217 CFX_ByteString bsKey; 212 CPDF_Stream* pFindStream = NULL;
218 CPDF_Stream* pFindStream = NULL; 213 m_HashProfileMap.GetNextAssoc(pos2, bsKey, (void*&)pFindStream);
219 m_HashProfileMap.GetNextAssoc(pos2, bsKey, (void*&)pFindStre am); 214 if (ipKey == pFindStream) {
220 if (ipKey == pFindStream) { 215 m_HashProfileMap.RemoveKey(bsKey);
221 m_HashProfileMap.RemoveKey(bsKey); 216 break;
222 break;
223 }
224 } 217 }
225 delete ipData->m_Obj;
226 delete ipData;
227 m_IccProfileMap.RemoveKey(ipKey);
228 } 218 }
219 delete ipData->m_Obj;
220 delete ipData;
221 m_IccProfileMap.RemoveKey(ipKey);
229 } 222 }
230 } 223 }
231 { 224 pos = m_FontFileMap.GetStartPosition();
232 pos = m_FontFileMap.GetStartPosition(); 225 while (pos) {
233 while (pos) { 226 CPDF_Stream* ftKey;
234 CPDF_Stream* ftKey; 227 CPDF_CountedObject<CPDF_StreamAcc*>* ftData;
235 CPDF_CountedObject<CPDF_StreamAcc*>* ftData; 228 m_FontFileMap.GetNextAssoc(pos, ftKey, ftData);
236 m_FontFileMap.GetNextAssoc(pos, ftKey, ftData); 229 nCount = ftData->m_nCount;
237 nCount = ftData->m_nCount; 230 if (bForceRelease || nCount < 2) {
238 if (bRelease || nCount < 2) { 231 delete ftData->m_Obj;
239 delete ftData->m_Obj; 232 delete ftData;
240 delete ftData; 233 m_FontFileMap.RemoveKey(ftKey);
241 m_FontFileMap.RemoveKey(ftKey);
242 }
243 } 234 }
244 } 235 }
245 } 236 }
246 CPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnl y) 237 CPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnl y)
247 { 238 {
248 if (!pFontDict) { 239 if (!pFontDict) {
249 return NULL; 240 return NULL;
250 } 241 }
251 if (findOnly) { 242 if (findOnly) {
252 CPDF_CountedObject<CPDF_Font*>* fontData; 243 CPDF_CountedObject<CPDF_Font*>* fontData;
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
637 m_FontFileMap.SetAt(pFontStream, ftData); 628 m_FontFileMap.SetAt(pFontStream, ftData);
638 return pFontFile; 629 return pFontFile;
639 } 630 }
640 void CPDF_DocPageData::ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOO L bForce) 631 void CPDF_DocPageData::ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOO L bForce)
641 { 632 {
642 if (!pFontStream) { 633 if (!pFontStream) {
643 return; 634 return;
644 } 635 }
645 PDF_DocPageData_Release<CPDF_Stream*, CPDF_StreamAcc*>(m_FontFileMap, pFontS tream, NULL, bForce); 636 PDF_DocPageData_Release<CPDF_Stream*, CPDF_StreamAcc*>(m_FontFileMap, pFontS tream, NULL, bForce);
646 } 637 }
OLDNEW
« no previous file with comments | « core/include/fpdfapi/fpdf_pageobj.h ('k') | core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698