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

Unified Diff: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp

Issue 322333002: Fix the potential integer overflow from "offset + size" (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 6 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | core/src/fxcrt/extension.h » ('j') | core/src/fxcrt/extension.h » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
index f82bf3a861959f31cfed56a905c485b91adb0d28..99afe829f6bc420930b0b73ef28fdbabfcf8f866 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
@@ -2864,13 +2864,27 @@ FX_BOOL CPDF_DataAvail::IsObjectsAvail(CFX_PtrArray& obj_array, FX_BOOL bParsePa
CPDF_Reference *pRef = (CPDF_Reference*)pObj;
FX_DWORD dwNum = pRef->GetRefObjNum();
FX_FILESIZE offset;
- FX_DWORD size = GetObjectSize(pRef->GetRefObjNum(), offset);
- if (!size) {
+ FX_DWORD original_size = GetObjectSize(dwNum, offset);
+ base::CheckedNumeric<FX_DWORD> size = original_size;
palmer 2014/07/23 17:58:36 I've already checked in this change (https://coder
jun_fang 2014/07/24 07:14:39 Yes. I already merged your change into this fix by
+
+ if (size.ValueOrDefault(0) == 0 || offset < 0 || offset >= m_dwFileLen)
break;
- }
- size = (FX_DWORD)((FX_FILESIZE)(offset + size + 512) > m_dwFileLen ? m_dwFileLen - offset : size + 512);
- if (!m_pFileAvail->IsDataAvail(offset, size)) {
- pHints->AddSegment(offset, size);
+
+ size += offset;
+ size += 512;
+ if (!size.IsValid())
+ break;
+
+ if (size.ValueOrDie() > m_dwFileLen)
+ size = m_dwFileLen - offset;
+ else
+ size = original_size + 512;
+
+ if (!size.IsValid())
+ break;
+
+ if (!m_pFileAvail->IsDataAvail(offset, size.ValueOrDie())) {
+ pHints->AddSegment(offset, size.ValueOrDie());
ret_array.Add(pObj);
count++;
} else if (!m_objnum_array.Find(dwNum)) {
@@ -3070,10 +3084,27 @@ CPDF_Object* CPDF_DataAvail::GetObject(FX_DWORD objnum, IFX_DownloadHints* pHint
*pExistInFile = FALSE;
return NULL;
}
- FX_DWORD size = (FX_DWORD)m_parser.GetObjectSize(objnum);
- size = (FX_DWORD)(((FX_FILESIZE)(offset + size + 512)) > m_dwFileLen ? m_dwFileLen - offset : size + 512);
- if (!m_pFileAvail->IsDataAvail(offset, size)) {
- pHints->AddSegment(offset, size);
+
+ FX_DWORD original_size = (FX_DWORD)m_parser.GetObjectSize(objnum);
+ base::CheckedNumeric<FX_DWORD> size = original_size;
+ if (size.ValueOrDefault(0) == 0 || offset < 0 || offset >= m_dwFileLen)
+ return NULL;
+
+ size += offset;
+ size += 512;
+ if (!size.IsValid())
+ return NULL;
+
+ if (size.ValueOrDie() > m_dwFileLen)
+ size = m_dwFileLen - offset;
+ else
+ size = original_size + 512;
+
+ if (!size.IsValid())
+ return NULL;
+
+ if (!m_pFileAvail->IsDataAvail(offset, size.ValueOrDie())) {
+ pHints->AddSegment(offset, size.ValueOrDie());
return NULL;
}
pRet = m_parser.ParseIndirectObject(NULL, objnum);
@@ -3083,10 +3114,26 @@ CPDF_Object* CPDF_DataAvail::GetObject(FX_DWORD objnum, IFX_DownloadHints* pHint
return pRet;
}
FX_FILESIZE offset = 0;
- FX_DWORD size = GetObjectSize(objnum, offset);
- size = (FX_DWORD)((FX_FILESIZE)(offset + size + 512) > m_dwFileLen ? m_dwFileLen - offset : size + 512);
- if (!m_pFileAvail->IsDataAvail(offset, size)) {
- pHints->AddSegment(offset, size);
+ FX_DWORD original_size = GetObjectSize(objnum, offset);
+ base::CheckedNumeric<FX_DWORD> size = original_size;
palmer 2014/07/23 17:58:36 So, this same basic chunk is now repeated 3 times.
jun_fang 2014/07/24 07:14:39 I will reconstruct this function to remove the red
+ if (size.ValueOrDefault(0) == 0 || offset < 0 || offset >= m_dwFileLen)
+ return NULL;
+
+ size += offset;
+ size += 512;
+ if (!size.IsValid())
+ return NULL;
+
+ if (size.ValueOrDie() > m_dwFileLen)
+ size = m_dwFileLen - offset;
+ else
+ size = original_size + 512;
+
+ if (!size.IsValid())
+ return NULL;
+
+ if (!m_pFileAvail->IsDataAvail(offset, size.ValueOrDie())) {
+ pHints->AddSegment(offset, size.ValueOrDie());
return NULL;
}
CPDF_Parser *pParser = (CPDF_Parser *)(m_pDocument->GetParser());
« no previous file with comments | « no previous file | core/src/fxcrt/extension.h » ('j') | core/src/fxcrt/extension.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698