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