• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <limits>
6 #include <string>
7 
8 #include "core/fpdfapi/parser/cpdf_object.h"
9 #include "core/fpdfapi/parser/cpdf_parser.h"
10 #include "core/fpdfapi/parser/cpdf_syntax_parser.h"
11 #include "core/fxcrt/fx_ext.h"
12 #include "core/fxcrt/fx_stream.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 #include "testing/utils/path_service.h"
15 
TEST(cpdf_syntax_parser,ReadHexString)16 TEST(cpdf_syntax_parser, ReadHexString) {
17   {
18     // Empty string.
19     uint8_t data[] = "";
20     CPDF_SyntaxParser parser;
21     parser.InitParser(IFX_MemoryStream::Create(data, 0, false), 0);
22     EXPECT_EQ("", parser.ReadHexString());
23     EXPECT_EQ(0, parser.SavePos());
24   }
25 
26   {
27     // Blank string.
28     uint8_t data[] = "  ";
29     CPDF_SyntaxParser parser;
30     parser.InitParser(IFX_MemoryStream::Create(data, 2, false), 0);
31     EXPECT_EQ("", parser.ReadHexString());
32     EXPECT_EQ(2, parser.SavePos());
33   }
34 
35   {
36     // Skips unknown characters.
37     uint8_t data[] = "z12b";
38     CPDF_SyntaxParser parser;
39     parser.InitParser(IFX_MemoryStream::Create(data, 4, false), 0);
40     EXPECT_EQ("\x12\xb0", parser.ReadHexString());
41     EXPECT_EQ(4, parser.SavePos());
42   }
43 
44   {
45     // Skips unknown characters.
46     uint8_t data[] = "*<&*#$^&@1";
47     CPDF_SyntaxParser parser;
48     parser.InitParser(IFX_MemoryStream::Create(data, 10, false), 0);
49     EXPECT_EQ("\x10", parser.ReadHexString());
50     EXPECT_EQ(10, parser.SavePos());
51   }
52 
53   {
54     // Skips unknown characters.
55     uint8_t data[] = "\x80zab";
56     CPDF_SyntaxParser parser;
57     parser.InitParser(IFX_MemoryStream::Create(data, 4, false), 0);
58     EXPECT_EQ("\xab", parser.ReadHexString());
59     EXPECT_EQ(4, parser.SavePos());
60   }
61 
62   {
63     // Skips unknown characters.
64     uint8_t data[] = "\xffzab";
65     CPDF_SyntaxParser parser;
66     parser.InitParser(IFX_MemoryStream::Create(data, 4, false), 0);
67     EXPECT_EQ("\xab", parser.ReadHexString());
68     EXPECT_EQ(4, parser.SavePos());
69   }
70 
71   {
72     // Regular conversion.
73     uint8_t data[] = "1A2b>abcd";
74     CPDF_SyntaxParser parser;
75     parser.InitParser(IFX_MemoryStream::Create(data, 9, false), 0);
76     EXPECT_EQ("\x1a\x2b", parser.ReadHexString());
77     EXPECT_EQ(5, parser.SavePos());
78   }
79 
80   {
81     // Position out of bounds.
82     uint8_t data[] = "12ab>";
83     CPDF_SyntaxParser parser;
84     parser.InitParser(IFX_MemoryStream::Create(data, 5, false), 0);
85     parser.RestorePos(5);
86     EXPECT_EQ("", parser.ReadHexString());
87 
88     parser.RestorePos(6);
89     EXPECT_EQ("", parser.ReadHexString());
90 
91     parser.RestorePos(-1);
92     EXPECT_EQ("", parser.ReadHexString());
93 
94     parser.RestorePos(std::numeric_limits<FX_FILESIZE>::max());
95     EXPECT_EQ("", parser.ReadHexString());
96 
97     // Check string still parses when set to 0.
98     parser.RestorePos(0);
99     EXPECT_EQ("\x12\xab", parser.ReadHexString());
100   }
101 
102   {
103     // Missing ending >.
104     uint8_t data[] = "1A2b";
105     CPDF_SyntaxParser parser;
106     parser.InitParser(IFX_MemoryStream::Create(data, 4, false), 0);
107     EXPECT_EQ("\x1a\x2b", parser.ReadHexString());
108     EXPECT_EQ(4, parser.SavePos());
109   }
110 
111   {
112     // Missing ending >.
113     uint8_t data[] = "12abz";
114     CPDF_SyntaxParser parser;
115     parser.InitParser(IFX_MemoryStream::Create(data, 5, false), 0);
116     EXPECT_EQ("\x12\xab", parser.ReadHexString());
117     EXPECT_EQ(5, parser.SavePos());
118   }
119 
120   {
121     // Uneven number of bytes.
122     uint8_t data[] = "1A2>asdf";
123     CPDF_SyntaxParser parser;
124     parser.InitParser(IFX_MemoryStream::Create(data, 8, false), 0);
125     EXPECT_EQ("\x1a\x20", parser.ReadHexString());
126     EXPECT_EQ(4, parser.SavePos());
127   }
128 
129   {
130     // Uneven number of bytes.
131     uint8_t data[] = "1A2zasdf";
132     CPDF_SyntaxParser parser;
133     parser.InitParser(IFX_MemoryStream::Create(data, 8, false), 0);
134     EXPECT_EQ("\x1a\x2a\xdf", parser.ReadHexString());
135     EXPECT_EQ(8, parser.SavePos());
136   }
137 
138   {
139     // Just ending character.
140     uint8_t data[] = ">";
141     CPDF_SyntaxParser parser;
142     parser.InitParser(IFX_MemoryStream::Create(data, 1, false), 0);
143     EXPECT_EQ("", parser.ReadHexString());
144     EXPECT_EQ(1, parser.SavePos());
145   }
146 }
147 
TEST(cpdf_syntax_parser,GetInvalidReference)148 TEST(cpdf_syntax_parser, GetInvalidReference) {
149   CPDF_SyntaxParser parser;
150   // Data with a reference with number CPDF_Object::kInvalidObjNum
151   uint8_t data[] = "4294967295 0 R";
152   parser.InitParser(IFX_MemoryStream::Create(data, 14, false), 0);
153   std::unique_ptr<CPDF_Object> ref =
154       parser.GetObject(nullptr, CPDF_Object::kInvalidObjNum, 0, false);
155   EXPECT_FALSE(ref);
156 }
157