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 "public/fpdfview.h" | 7 #include "public/fpdfview.h" |
8 | 8 |
9 #include "core/include/fxcodec/fx_codec.h" | 9 #include "core/include/fxcodec/fx_codec.h" |
10 #include "core/include/fxcrt/fx_safe_types.h" | 10 #include "core/include/fxcrt/fx_safe_types.h" |
(...skipping 807 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
818 DLLEXPORT FPDF_DWORD STDCALL FPDF_CountNamedDests(FPDF_DOCUMENT document) { | 818 DLLEXPORT FPDF_DWORD STDCALL FPDF_CountNamedDests(FPDF_DOCUMENT document) { |
819 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); | 819 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
820 if (!pDoc) | 820 if (!pDoc) |
821 return 0; | 821 return 0; |
822 | 822 |
823 CPDF_Dictionary* pRoot = pDoc->GetRoot(); | 823 CPDF_Dictionary* pRoot = pDoc->GetRoot(); |
824 if (!pRoot) | 824 if (!pRoot) |
825 return 0; | 825 return 0; |
826 | 826 |
827 CPDF_NameTree nameTree(pDoc, "Dests"); | 827 CPDF_NameTree nameTree(pDoc, "Dests"); |
828 int count = nameTree.GetCount(); | 828 pdfium::base::CheckedNumeric<FPDF_DWORD> count = nameTree.GetCount(); |
829 CPDF_Dictionary* pDest = pRoot->GetDict("Dests"); | 829 CPDF_Dictionary* pDest = pRoot->GetDict("Dests"); |
830 if (pDest) | 830 if (pDest) |
831 count += pDest->GetCount(); | 831 count += pDest->GetCount(); |
832 return count; | 832 |
| 833 if (!count.IsValid()) |
| 834 return 0; |
| 835 |
| 836 return count.ValueOrDie(); |
833 } | 837 } |
834 | 838 |
835 DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document, | 839 DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document, |
836 FPDF_BYTESTRING name) { | 840 FPDF_BYTESTRING name) { |
837 if (!name || name[0] == 0) | 841 if (!name || name[0] == 0) |
838 return nullptr; | 842 return nullptr; |
839 | 843 |
840 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); | 844 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
841 if (!pDoc) | 845 if (!pDoc) |
842 return nullptr; | 846 return nullptr; |
(...skipping 13 matching lines...) Expand all Loading... |
856 return nullptr; | 860 return nullptr; |
857 | 861 |
858 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); | 862 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
859 if (!pDoc) | 863 if (!pDoc) |
860 return nullptr; | 864 return nullptr; |
861 | 865 |
862 CPDF_Dictionary* pRoot = pDoc->GetRoot(); | 866 CPDF_Dictionary* pRoot = pDoc->GetRoot(); |
863 if (!pRoot) | 867 if (!pRoot) |
864 return nullptr; | 868 return nullptr; |
865 | 869 |
866 CPDF_Object* pDestObj = NULL; | 870 CPDF_Object* pDestObj = nullptr; |
867 CFX_ByteString bsName; | 871 CFX_ByteString bsName; |
868 CPDF_NameTree nameTree(pDoc, "Dests"); | 872 CPDF_NameTree nameTree(pDoc, "Dests"); |
869 int count = nameTree.GetCount(); | 873 int count = nameTree.GetCount(); |
870 if (index >= count) { | 874 if (index >= count) { |
871 CPDF_Dictionary* pDest = pRoot->GetDict("Dests"); | 875 CPDF_Dictionary* pDest = pRoot->GetDict("Dests"); |
872 if (!pDest) | 876 if (!pDest) |
873 return NULL; | 877 return nullptr; |
874 if (index >= count + pDest->GetCount()) | 878 |
875 return NULL; | 879 pdfium::base::CheckedNumeric<int> checked_count = count; |
| 880 checked_count += pDest->GetCount(); |
| 881 if (!checked_count.IsValid() || index >= checked_count.ValueOrDie()) |
| 882 return nullptr; |
| 883 |
876 index -= count; | 884 index -= count; |
877 FX_POSITION pos = pDest->GetStartPos(); | |
878 int i = 0; | 885 int i = 0; |
879 while (pos) { | 886 for (const auto& it : *pDest) { |
880 pDestObj = pDest->GetNextElement(pos, bsName); | 887 bsName = it.first; |
| 888 pDestObj = it.second; |
881 if (!pDestObj) | 889 if (!pDestObj) |
882 continue; | 890 continue; |
883 if (i == index) | 891 if (i == index) |
884 break; | 892 break; |
885 i++; | 893 i++; |
886 } | 894 } |
887 } else { | 895 } else { |
888 pDestObj = nameTree.LookupValue(index, bsName); | 896 pDestObj = nameTree.LookupValue(index, bsName); |
889 } | 897 } |
890 if (!pDestObj) | 898 if (!pDestObj) |
(...skipping 12 matching lines...) Expand all Loading... |
903 if (!buffer) { | 911 if (!buffer) { |
904 *buflen = len; | 912 *buflen = len; |
905 } else if (*buflen >= len) { | 913 } else if (*buflen >= len) { |
906 memcpy(buffer, utf16Name.c_str(), len); | 914 memcpy(buffer, utf16Name.c_str(), len); |
907 *buflen = len; | 915 *buflen = len; |
908 } else { | 916 } else { |
909 *buflen = -1; | 917 *buflen = -1; |
910 } | 918 } |
911 return (FPDF_DEST)pDestObj; | 919 return (FPDF_DEST)pDestObj; |
912 } | 920 } |
OLD | NEW |