OLD | NEW |
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/include/fpdfapi/fpdf_parser.h" | 7 #include "core/include/fpdfapi/fpdf_parser.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <memory> | 10 #include <memory> |
(...skipping 2022 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2033 return GetNextWord(nullptr); | 2033 return GetNextWord(nullptr); |
2034 } | 2034 } |
2035 | 2035 |
2036 CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, | 2036 CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, |
2037 FX_DWORD objnum, | 2037 FX_DWORD objnum, |
2038 FX_DWORD gennum, | 2038 FX_DWORD gennum, |
2039 PARSE_CONTEXT* pContext, | 2039 PARSE_CONTEXT* pContext, |
2040 FX_BOOL bDecrypt) { | 2040 FX_BOOL bDecrypt) { |
2041 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); | 2041 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); |
2042 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) { | 2042 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) { |
2043 return NULL; | 2043 return nullptr; |
2044 } | 2044 } |
2045 FX_FILESIZE SavedPos = m_Pos; | 2045 FX_FILESIZE SavedPos = m_Pos; |
2046 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); | |
2047 bool bIsNumber; | 2046 bool bIsNumber; |
2048 CFX_ByteString word = GetNextWord(&bIsNumber); | 2047 CFX_ByteString word = GetNextWord(&bIsNumber); |
2049 if (word.GetLength() == 0) { | 2048 if (word.GetLength() == 0) { |
2050 if (bTypeOnly) | 2049 return nullptr; |
2051 return (CPDF_Object*)PDFOBJ_INVALID; | |
2052 return NULL; | |
2053 } | 2050 } |
2054 if (bIsNumber) { | 2051 if (bIsNumber) { |
2055 FX_FILESIZE SavedPos = m_Pos; | 2052 FX_FILESIZE SavedPos = m_Pos; |
2056 CFX_ByteString nextword = GetNextWord(&bIsNumber); | 2053 CFX_ByteString nextword = GetNextWord(&bIsNumber); |
2057 if (bIsNumber) { | 2054 if (bIsNumber) { |
2058 CFX_ByteString nextword2 = GetNextWord(nullptr); | 2055 CFX_ByteString nextword2 = GetNextWord(nullptr); |
2059 if (nextword2 == "R") { | 2056 if (nextword2 == "R") { |
2060 FX_DWORD objnum = FXSYS_atoi(word); | 2057 FX_DWORD objnum = FXSYS_atoi(word); |
2061 if (bTypeOnly) | |
2062 return (CPDF_Object*)PDFOBJ_REFERENCE; | |
2063 return new CPDF_Reference(pObjList, objnum); | 2058 return new CPDF_Reference(pObjList, objnum); |
2064 } | 2059 } |
2065 } | 2060 } |
2066 m_Pos = SavedPos; | 2061 m_Pos = SavedPos; |
2067 if (bTypeOnly) | |
2068 return (CPDF_Object*)PDFOBJ_NUMBER; | |
2069 return new CPDF_Number(word); | 2062 return new CPDF_Number(word); |
2070 } | 2063 } |
2071 if (word == "true" || word == "false") { | 2064 if (word == "true" || word == "false") { |
2072 if (bTypeOnly) | |
2073 return (CPDF_Object*)PDFOBJ_BOOLEAN; | |
2074 return new CPDF_Boolean(word == "true"); | 2065 return new CPDF_Boolean(word == "true"); |
2075 } | 2066 } |
2076 if (word == "null") { | 2067 if (word == "null") { |
2077 if (bTypeOnly) | |
2078 return (CPDF_Object*)PDFOBJ_NULL; | |
2079 return new CPDF_Null; | 2068 return new CPDF_Null; |
2080 } | 2069 } |
2081 if (word == "(") { | 2070 if (word == "(") { |
2082 if (bTypeOnly) | |
2083 return (CPDF_Object*)PDFOBJ_STRING; | |
2084 CFX_ByteString str = ReadString(); | 2071 CFX_ByteString str = ReadString(); |
2085 if (m_pCryptoHandler && bDecrypt) { | 2072 if (m_pCryptoHandler && bDecrypt) { |
2086 m_pCryptoHandler->Decrypt(objnum, gennum, str); | 2073 m_pCryptoHandler->Decrypt(objnum, gennum, str); |
2087 } | 2074 } |
2088 return new CPDF_String(str, FALSE); | 2075 return new CPDF_String(str, FALSE); |
2089 } | 2076 } |
2090 if (word == "<") { | 2077 if (word == "<") { |
2091 if (bTypeOnly) | |
2092 return (CPDF_Object*)PDFOBJ_STRING; | |
2093 CFX_ByteString str = ReadHexString(); | 2078 CFX_ByteString str = ReadHexString(); |
2094 if (m_pCryptoHandler && bDecrypt) { | 2079 if (m_pCryptoHandler && bDecrypt) { |
2095 m_pCryptoHandler->Decrypt(objnum, gennum, str); | 2080 m_pCryptoHandler->Decrypt(objnum, gennum, str); |
2096 } | 2081 } |
2097 return new CPDF_String(str, TRUE); | 2082 return new CPDF_String(str, TRUE); |
2098 } | 2083 } |
2099 if (word == "[") { | 2084 if (word == "[") { |
2100 if (bTypeOnly) | |
2101 return (CPDF_Object*)PDFOBJ_ARRAY; | |
2102 CPDF_Array* pArray = new CPDF_Array; | 2085 CPDF_Array* pArray = new CPDF_Array; |
2103 while (CPDF_Object* pObj = | 2086 while (CPDF_Object* pObj = |
2104 GetObject(pObjList, objnum, gennum, nullptr, true)) { | 2087 GetObject(pObjList, objnum, gennum, nullptr, true)) { |
2105 pArray->Add(pObj); | 2088 pArray->Add(pObj); |
2106 } | 2089 } |
2107 return pArray; | 2090 return pArray; |
2108 } | 2091 } |
2109 if (word[0] == '/') { | 2092 if (word[0] == '/') { |
2110 if (bTypeOnly) | |
2111 return (CPDF_Object*)PDFOBJ_NAME; | |
2112 return new CPDF_Name( | 2093 return new CPDF_Name( |
2113 PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1))); | 2094 PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1))); |
2114 } | 2095 } |
2115 if (word == "<<") { | 2096 if (word == "<<") { |
2116 if (bTypeOnly) | |
2117 return (CPDF_Object*)PDFOBJ_DICTIONARY; | |
2118 | |
2119 if (pContext) | 2097 if (pContext) |
2120 pContext->m_DictStart = SavedPos; | 2098 pContext->m_DictStart = SavedPos; |
2121 | 2099 |
2122 int32_t nKeys = 0; | 2100 int32_t nKeys = 0; |
2123 FX_FILESIZE dwSignValuePos = 0; | 2101 FX_FILESIZE dwSignValuePos = 0; |
2124 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( | 2102 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( |
2125 new CPDF_Dictionary); | 2103 new CPDF_Dictionary); |
2126 while (1) { | 2104 while (1) { |
2127 CFX_ByteString key = GetNextWord(nullptr); | 2105 CFX_ByteString key = GetNextWord(nullptr); |
2128 if (key.IsEmpty()) | 2106 if (key.IsEmpty()) |
(...skipping 29 matching lines...) Expand all Loading... |
2158 // Only when this is a signature dictionary and has contents, we reset the | 2136 // Only when this is a signature dictionary and has contents, we reset the |
2159 // contents to the un-decrypted form. | 2137 // contents to the un-decrypted form. |
2160 if (IsSignatureDict(pDict.get()) && dwSignValuePos) { | 2138 if (IsSignatureDict(pDict.get()) && dwSignValuePos) { |
2161 CFX_AutoRestorer<FX_FILESIZE> save_pos(&m_Pos); | 2139 CFX_AutoRestorer<FX_FILESIZE> save_pos(&m_Pos); |
2162 m_Pos = dwSignValuePos; | 2140 m_Pos = dwSignValuePos; |
2163 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, nullptr, FALSE); | 2141 CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, nullptr, FALSE); |
2164 pDict->SetAt("Contents", pObj); | 2142 pDict->SetAt("Contents", pObj); |
2165 } | 2143 } |
2166 if (pContext) { | 2144 if (pContext) { |
2167 pContext->m_DictEnd = m_Pos; | 2145 pContext->m_DictEnd = m_Pos; |
2168 if (pContext->m_Flags & PDFPARSE_NOSTREAM) { | |
2169 return pDict.release(); | |
2170 } | |
2171 } | 2146 } |
2172 FX_FILESIZE SavedPos = m_Pos; | 2147 FX_FILESIZE SavedPos = m_Pos; |
2173 CFX_ByteString nextword = GetNextWord(nullptr); | 2148 CFX_ByteString nextword = GetNextWord(nullptr); |
2174 if (nextword != "stream") { | 2149 if (nextword != "stream") { |
2175 m_Pos = SavedPos; | 2150 m_Pos = SavedPos; |
2176 return pDict.release(); | 2151 return pDict.release(); |
2177 } | 2152 } |
2178 | |
2179 return ReadStream(pDict.release(), pContext, objnum, gennum); | 2153 return ReadStream(pDict.release(), pContext, objnum, gennum); |
2180 } | 2154 } |
2181 if (word == ">>") { | 2155 if (word == ">>") { |
2182 m_Pos = SavedPos; | 2156 m_Pos = SavedPos; |
2183 return nullptr; | |
2184 } | 2157 } |
2185 if (bTypeOnly) | |
2186 return (CPDF_Object*)PDFOBJ_INVALID; | |
2187 | |
2188 return nullptr; | 2158 return nullptr; |
2189 } | 2159 } |
2190 | 2160 |
2191 CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( | 2161 CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( |
2192 CPDF_IndirectObjectHolder* pObjList, | 2162 CPDF_IndirectObjectHolder* pObjList, |
2193 FX_DWORD objnum, | 2163 FX_DWORD objnum, |
2194 FX_DWORD gennum, | 2164 FX_DWORD gennum, |
2195 PARSE_CONTEXT* pContext) { | 2165 PARSE_CONTEXT* pContext) { |
2196 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); | 2166 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); |
2197 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) { | 2167 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) { |
2198 return NULL; | 2168 return nullptr; |
2199 } | 2169 } |
2200 FX_FILESIZE SavedPos = m_Pos; | 2170 FX_FILESIZE SavedPos = m_Pos; |
2201 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); | |
2202 bool bIsNumber; | 2171 bool bIsNumber; |
2203 CFX_ByteString word = GetNextWord(&bIsNumber); | 2172 CFX_ByteString word = GetNextWord(&bIsNumber); |
2204 if (word.GetLength() == 0) { | 2173 if (word.GetLength() == 0) { |
2205 if (bTypeOnly) | |
2206 return (CPDF_Object*)PDFOBJ_INVALID; | |
2207 return nullptr; | 2174 return nullptr; |
2208 } | 2175 } |
2209 if (bIsNumber) { | 2176 if (bIsNumber) { |
2210 FX_FILESIZE SavedPos = m_Pos; | 2177 FX_FILESIZE SavedPos = m_Pos; |
2211 CFX_ByteString nextword = GetNextWord(&bIsNumber); | 2178 CFX_ByteString nextword = GetNextWord(&bIsNumber); |
2212 if (bIsNumber) { | 2179 if (bIsNumber) { |
2213 CFX_ByteString nextword2 = GetNextWord(nullptr); | 2180 CFX_ByteString nextword2 = GetNextWord(nullptr); |
2214 if (nextword2 == "R") { | 2181 if (nextword2 == "R") { |
2215 if (bTypeOnly) | 2182 return new CPDF_Reference(pObjList, FXSYS_atoi(word)); |
2216 return (CPDF_Object*)PDFOBJ_REFERENCE; | |
2217 FX_DWORD objnum = FXSYS_atoi(word); | |
2218 return new CPDF_Reference(pObjList, objnum); | |
2219 } | 2183 } |
2220 } | 2184 } |
2221 m_Pos = SavedPos; | 2185 m_Pos = SavedPos; |
2222 if (bTypeOnly) | |
2223 return (CPDF_Object*)PDFOBJ_NUMBER; | |
2224 return new CPDF_Number(word); | 2186 return new CPDF_Number(word); |
2225 } | 2187 } |
2226 if (word == "true" || word == "false") { | 2188 if (word == "true" || word == "false") { |
2227 if (bTypeOnly) | |
2228 return (CPDF_Object*)PDFOBJ_BOOLEAN; | |
2229 return new CPDF_Boolean(word == "true"); | 2189 return new CPDF_Boolean(word == "true"); |
2230 } | 2190 } |
2231 if (word == "null") { | 2191 if (word == "null") { |
2232 if (bTypeOnly) | |
2233 return (CPDF_Object*)PDFOBJ_NULL; | |
2234 return new CPDF_Null; | 2192 return new CPDF_Null; |
2235 } | 2193 } |
2236 if (word == "(") { | 2194 if (word == "(") { |
2237 if (bTypeOnly) | |
2238 return (CPDF_Object*)PDFOBJ_STRING; | |
2239 CFX_ByteString str = ReadString(); | 2195 CFX_ByteString str = ReadString(); |
2240 if (m_pCryptoHandler) | 2196 if (m_pCryptoHandler) |
2241 m_pCryptoHandler->Decrypt(objnum, gennum, str); | 2197 m_pCryptoHandler->Decrypt(objnum, gennum, str); |
2242 return new CPDF_String(str, FALSE); | 2198 return new CPDF_String(str, FALSE); |
2243 } | 2199 } |
2244 if (word == "<") { | 2200 if (word == "<") { |
2245 if (bTypeOnly) | |
2246 return (CPDF_Object*)PDFOBJ_STRING; | |
2247 CFX_ByteString str = ReadHexString(); | 2201 CFX_ByteString str = ReadHexString(); |
2248 if (m_pCryptoHandler) | 2202 if (m_pCryptoHandler) |
2249 m_pCryptoHandler->Decrypt(objnum, gennum, str); | 2203 m_pCryptoHandler->Decrypt(objnum, gennum, str); |
2250 return new CPDF_String(str, TRUE); | 2204 return new CPDF_String(str, TRUE); |
2251 } | 2205 } |
2252 if (word == "[") { | 2206 if (word == "[") { |
2253 if (bTypeOnly) | |
2254 return (CPDF_Object*)PDFOBJ_ARRAY; | |
2255 std::unique_ptr<CPDF_Array, ReleaseDeleter<CPDF_Array>> pArray( | 2207 std::unique_ptr<CPDF_Array, ReleaseDeleter<CPDF_Array>> pArray( |
2256 new CPDF_Array); | 2208 new CPDF_Array); |
2257 while (CPDF_Object* pObj = | 2209 while (CPDF_Object* pObj = |
2258 GetObject(pObjList, objnum, gennum, nullptr, true)) { | 2210 GetObject(pObjList, objnum, gennum, nullptr, true)) { |
2259 pArray->Add(pObj); | 2211 pArray->Add(pObj); |
2260 } | 2212 } |
2261 return m_WordBuffer[0] == ']' ? pArray.release() : nullptr; | 2213 return m_WordBuffer[0] == ']' ? pArray.release() : nullptr; |
2262 } | 2214 } |
2263 if (word[0] == '/') { | 2215 if (word[0] == '/') { |
2264 if (bTypeOnly) | |
2265 return (CPDF_Object*)PDFOBJ_NAME; | |
2266 return new CPDF_Name( | 2216 return new CPDF_Name( |
2267 PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1))); | 2217 PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1))); |
2268 } | 2218 } |
2269 if (word == "<<") { | 2219 if (word == "<<") { |
2270 if (bTypeOnly) | |
2271 return (CPDF_Object*)PDFOBJ_DICTIONARY; | |
2272 if (pContext) | 2220 if (pContext) |
2273 pContext->m_DictStart = SavedPos; | 2221 pContext->m_DictStart = SavedPos; |
2274 | 2222 |
2275 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( | 2223 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( |
2276 new CPDF_Dictionary); | 2224 new CPDF_Dictionary); |
2277 while (1) { | 2225 while (1) { |
2278 FX_FILESIZE SavedPos = m_Pos; | 2226 FX_FILESIZE SavedPos = m_Pos; |
2279 CFX_ByteString key = GetNextWord(nullptr); | 2227 CFX_ByteString key = GetNextWord(nullptr); |
2280 if (key.IsEmpty()) | 2228 if (key.IsEmpty()) |
2281 return nullptr; | 2229 return nullptr; |
(...skipping 17 matching lines...) Expand all Loading... |
2299 } | 2247 } |
2300 return nullptr; | 2248 return nullptr; |
2301 } | 2249 } |
2302 if (key.GetLength() > 1) { | 2250 if (key.GetLength() > 1) { |
2303 pDict->SetAt(CFX_ByteStringC(key.c_str() + 1, key.GetLength() - 1), | 2251 pDict->SetAt(CFX_ByteStringC(key.c_str() + 1, key.GetLength() - 1), |
2304 obj.release()); | 2252 obj.release()); |
2305 } | 2253 } |
2306 } | 2254 } |
2307 if (pContext) { | 2255 if (pContext) { |
2308 pContext->m_DictEnd = m_Pos; | 2256 pContext->m_DictEnd = m_Pos; |
2309 if (pContext->m_Flags & PDFPARSE_NOSTREAM) { | |
2310 return pDict.release(); | |
2311 } | |
2312 } | 2257 } |
2313 FX_FILESIZE SavedPos = m_Pos; | 2258 FX_FILESIZE SavedPos = m_Pos; |
2314 CFX_ByteString nextword = GetNextWord(nullptr); | 2259 CFX_ByteString nextword = GetNextWord(nullptr); |
2315 if (nextword != "stream") { | 2260 if (nextword != "stream") { |
2316 m_Pos = SavedPos; | 2261 m_Pos = SavedPos; |
2317 return pDict.release(); | 2262 return pDict.release(); |
2318 } | 2263 } |
2319 | 2264 |
2320 return ReadStream(pDict.release(), pContext, objnum, gennum); | 2265 return ReadStream(pDict.release(), pContext, objnum, gennum); |
2321 } | 2266 } |
2322 if (word == ">>") { | 2267 if (word == ">>") { |
2323 m_Pos = SavedPos; | 2268 m_Pos = SavedPos; |
2324 return nullptr; | |
2325 } | 2269 } |
2326 if (bTypeOnly) | |
2327 return (CPDF_Object*)PDFOBJ_INVALID; | |
2328 return nullptr; | 2270 return nullptr; |
2329 } | 2271 } |
2330 | 2272 |
2331 unsigned int CPDF_SyntaxParser::ReadEOLMarkers(FX_FILESIZE pos) { | 2273 unsigned int CPDF_SyntaxParser::ReadEOLMarkers(FX_FILESIZE pos) { |
2332 unsigned char byte1 = 0; | 2274 unsigned char byte1 = 0; |
2333 unsigned char byte2 = 0; | 2275 unsigned char byte2 = 0; |
2334 GetCharAt(pos, byte1); | 2276 GetCharAt(pos, byte1); |
2335 GetCharAt(pos + 1, byte2); | 2277 GetCharAt(pos + 1, byte2); |
2336 unsigned int markers = 0; | 2278 unsigned int markers = 0; |
2337 if (byte1 == '\r' && byte2 == '\n') { | 2279 if (byte1 == '\r' && byte2 == '\n') { |
(...skipping 2642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4980 if (!m_pLinearizedDict) | 4922 if (!m_pLinearizedDict) |
4981 return -1; | 4923 return -1; |
4982 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H"); | 4924 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H"); |
4983 if (!pRange) | 4925 if (!pRange) |
4984 return -1; | 4926 return -1; |
4985 CPDF_Object* pStreamLen = pRange->GetElementValue(1); | 4927 CPDF_Object* pStreamLen = pRange->GetElementValue(1); |
4986 if (!pStreamLen) | 4928 if (!pStreamLen) |
4987 return -1; | 4929 return -1; |
4988 return pStreamLen->GetInteger(); | 4930 return pStreamLen->GetInteger(); |
4989 } | 4931 } |
OLD | NEW |