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

Side by Side Diff: core/src/fxcodec/codec/fx_codec_jpx_unittest.cpp

Issue 1016203002: Fix subtle issues in opj_skip_from_memory and add unit tests. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Fix type botch. Created 5 years, 9 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 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 <stdint.h>
6
7 #include <limits>
8
9 #include "codec_int.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "../../../testing/fx_string_testhelpers.h"
12
13 static const OPJ_OFF_T kSkipError = static_cast<OPJ_OFF_T>(-1);
14 static const OPJ_SIZE_T kReadError = static_cast<OPJ_SIZE_T>(-1);
15 static const OPJ_SIZE_T kWriteError = static_cast<OPJ_SIZE_T>(-1);
16
17 static unsigned char stream_data[] = {
18 0x00, 0x01, 0x02, 0x03,
19 0x84, 0x85, 0x86, 0x87, // Include some hi-bytes, too.
20 };
21
22 TEST(fxcodec, DecodeDataNullDecodeData) {
23 unsigned char buffer[16];
24 DecodeData* ptr = nullptr;
25
26 // Error codes, not segvs, should callers pass us a NULL pointer.
27 EXPECT_EQ(kReadError, opj_read_from_memory(buffer, sizeof(buffer), ptr));
28 EXPECT_EQ(kWriteError, opj_write_from_memory(buffer, sizeof(buffer), ptr));
29 EXPECT_EQ(kSkipError, opj_skip_from_memory(1, ptr));
30 EXPECT_FALSE(opj_seek_from_memory(1, ptr));
31 }
32
33 TEST(fxcodec, DecodeDataNullStream) {
34 DecodeData dd(nullptr, 0);
35 unsigned char buffer[16];
36
37 // Reads of size 0 do nothing but return an error code.
38 memset(buffer, 0xbd, sizeof(buffer));
39 EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 0, &dd));
40 EXPECT_EQ(0xbd, buffer[0]);
41
42 // Reads of nonzero size do nothing but return an error code.
43 memset(buffer, 0xbd, sizeof(buffer));
44 EXPECT_EQ(kReadError, opj_read_from_memory(buffer, sizeof(buffer), &dd));
45 EXPECT_EQ(0xbd, buffer[0]);
46
47 // writes of size 0 do nothing but return an error code.
48 EXPECT_EQ(kReadError, opj_write_from_memory(buffer, 0, &dd));
49
50 // writes of nonzero size do nothing but return an error code.
51 EXPECT_EQ(kReadError, opj_write_from_memory(buffer, sizeof(buffer), &dd));
52
53 // Skips of size 0 always return an error code.
54 EXPECT_EQ(kReadError, opj_skip_from_memory(0, &dd));
55
56 // Skips of nonzero size 0 always return an error code.
57 EXPECT_EQ(kReadError, opj_skip_from_memory(1, &dd));
58
59 // Seeks to 0 offset return in error.
60 EXPECT_FALSE(opj_seek_from_memory(0, &dd));
61
62 // Seeks to non-zero offsets return in error.
63 EXPECT_FALSE(opj_seek_from_memory(1, &dd));
64 }
65
66 TEST(fxcodec, DecodeDataReadInBounds) {
67 unsigned char buffer[16];
68 {
69 DecodeData dd(stream_data, sizeof(stream_data));
70
71 // Exact sized read in a single call.
72 memset(buffer, 0xbd, sizeof(buffer));
73 EXPECT_EQ(8u, opj_read_from_memory(buffer, sizeof(buffer), &dd));
74 EXPECT_EQ(0x00, buffer[0]);
75 EXPECT_EQ(0x01, buffer[1]);
76 EXPECT_EQ(0x02, buffer[2]);
77 EXPECT_EQ(0x03, buffer[3]);
78 EXPECT_EQ(0x84, buffer[4]);
79 EXPECT_EQ(0x85, buffer[5]);
80 EXPECT_EQ(0x86, buffer[6]);
81 EXPECT_EQ(0x87, buffer[7]);
82 EXPECT_EQ(0xbd, buffer[8]);
83 }
84 {
85 DecodeData dd(stream_data, sizeof(stream_data));
86
87 // Simple read.
88 memset(buffer, 0xbd, sizeof(buffer));
89 EXPECT_EQ(2u, opj_read_from_memory(buffer, 2, &dd));
90 EXPECT_EQ(0x00, buffer[0]);
91 EXPECT_EQ(0x01, buffer[1]);
92 EXPECT_EQ(0xbd, buffer[2]);
93
94 // Read of size 0 doesn't affect things.
95 memset(buffer, 0xbd, sizeof(buffer));
96 EXPECT_EQ(0u, opj_read_from_memory(buffer, 0, &dd));
97 EXPECT_EQ(0xbd, buffer[0]);
98
99 // Read exactly up to end of data.
100 memset(buffer, 0xbd, sizeof(buffer));
101 EXPECT_EQ(6u, opj_read_from_memory(buffer, 6, &dd));
102 EXPECT_EQ(0x02, buffer[0]);
103 EXPECT_EQ(0x03, buffer[1]);
104 EXPECT_EQ(0x84, buffer[2]);
105 EXPECT_EQ(0x85, buffer[3]);
106 EXPECT_EQ(0x86, buffer[4]);
107 EXPECT_EQ(0x87, buffer[5]);
108 EXPECT_EQ(0xbd, buffer[6]);
109
110 // Read of size 0 at EOF is still an error.
111 memset(buffer, 0xbd, sizeof(buffer));
112 EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 0, &dd));
113 EXPECT_EQ(0xbd, buffer[0]);
114 }
115 }
116
117 TEST(fxcodec, DecodeDataReadBeyondBounds) {
118 unsigned char buffer[16];
119 {
120 DecodeData dd(stream_data, sizeof(stream_data));
121
122 // Read beyond bounds in a single step.
123 memset(buffer, 0xbd, sizeof(buffer));
124 EXPECT_EQ(8u, opj_read_from_memory(buffer, sizeof(buffer) + 1, &dd));
125 EXPECT_EQ(0x00, buffer[0]);
126 EXPECT_EQ(0x01, buffer[1]);
127 EXPECT_EQ(0x02, buffer[2]);
128 EXPECT_EQ(0x03, buffer[3]);
129 EXPECT_EQ(0x84, buffer[4]);
130 EXPECT_EQ(0x85, buffer[5]);
131 EXPECT_EQ(0x86, buffer[6]);
132 EXPECT_EQ(0x87, buffer[7]);
133 EXPECT_EQ(0xbd, buffer[8]);
134 }
135 {
136 DecodeData dd(stream_data, sizeof(stream_data));
137
138 // Read well beyond bounds in a single step.
139 memset(buffer, 0xbd, sizeof(buffer));
140 EXPECT_EQ(8u, opj_read_from_memory(
141 buffer, std::numeric_limits<OPJ_SIZE_T>::max(), &dd));
142 EXPECT_EQ(0x00, buffer[0]);
143 EXPECT_EQ(0x01, buffer[1]);
144 EXPECT_EQ(0x02, buffer[2]);
145 EXPECT_EQ(0x03, buffer[3]);
146 EXPECT_EQ(0x84, buffer[4]);
147 EXPECT_EQ(0x85, buffer[5]);
148 EXPECT_EQ(0x86, buffer[6]);
149 EXPECT_EQ(0x87, buffer[7]);
150 EXPECT_EQ(0xbd, buffer[8]);
151 }
152 {
153 DecodeData dd(stream_data, sizeof(stream_data));
154
155 // Read of size 6 gets first 6 bytes.
156 // rest of buffer intact.
157 memset(buffer, 0xbd, sizeof(buffer));
158 EXPECT_EQ(6u, opj_read_from_memory(buffer, 6, &dd));
159 EXPECT_EQ(0x00, buffer[0]);
160 EXPECT_EQ(0x01, buffer[1]);
161 EXPECT_EQ(0x02, buffer[2]);
162 EXPECT_EQ(0x03, buffer[3]);
163 EXPECT_EQ(0x84, buffer[4]);
164 EXPECT_EQ(0x85, buffer[5]);
165 EXPECT_EQ(0xbd, buffer[6]);
166
167 // Read of size 6 gets remaining two bytes.
168 memset(buffer, 0xbd, sizeof(buffer));
169 EXPECT_EQ(2u, opj_read_from_memory(buffer, 6, &dd));
170 EXPECT_EQ(0x86, buffer[0]);
171 EXPECT_EQ(0x87, buffer[1]);
172 EXPECT_EQ(0xbd, buffer[2]);
173
174 // Read of 6 more gets nothing and leaves rest of buffer intact.
175 memset(buffer, 0xbd, sizeof(buffer));
176 EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 6, &dd));
177 EXPECT_EQ(0xbd, buffer[0]);
178 }
179 }
180
181 TEST(fxcodec, DecodeDataWriteInBounds) {
182 unsigned char stream[16];
183 static unsigned char buffer_data[] = {
184 0x00, 0x01, 0x02, 0x03, 0x80,
185 0x80, 0x81, 0x82, 0x83, 0x84,
186 };
187 {
188 // Pretend the stream can only hold 4 bytes.
189 DecodeData dd(stream, 4);
190
191 memset(stream, 0xbd, sizeof(stream));
192 EXPECT_EQ(4u, opj_write_from_memory(buffer_data, 4, &dd));
193 EXPECT_EQ(0x00, stream[0]);
194 EXPECT_EQ(0x01, stream[1]);
195 EXPECT_EQ(0x02, stream[2]);
196 EXPECT_EQ(0x03, stream[3]);
197 EXPECT_EQ(0xbd, stream[4]);
198 }
199 {
200 // Pretend the stream can only hold 4 bytes.
201 DecodeData dd(stream, 4);
202
203 memset(stream, 0xbd, sizeof(stream));
204 EXPECT_EQ(2u, opj_write_from_memory(buffer_data, 2, &dd));
205 EXPECT_EQ(2u, opj_write_from_memory(buffer_data, 2, &dd));
206 EXPECT_EQ(0x00, stream[0]);
207 EXPECT_EQ(0x01, stream[1]);
208 EXPECT_EQ(0x00, stream[2]);
209 EXPECT_EQ(0x01, stream[3]);
210 EXPECT_EQ(0xbd, stream[4]);
211 }
212 }
213
214 TEST(fxcodec, DecodeDataWriteBeyondBounds) {
215 unsigned char stream[16];
216 static unsigned char buffer_data[] = {
217 0x10, 0x11, 0x12, 0x13,
218 0x94, 0x95, 0x96, 0x97,
219 };
220 {
221 // Pretend the stream can only hold 4 bytes.
222 DecodeData dd(stream, 4);
223
224 // Write ending past EOF transfers up til EOF.
225 memset(stream, 0xbd, sizeof(stream));
226 EXPECT_EQ(4u, opj_write_from_memory(buffer_data, 5, &dd));
227 EXPECT_EQ(0x10, stream[0]);
228 EXPECT_EQ(0x11, stream[1]);
229 EXPECT_EQ(0x12, stream[2]);
230 EXPECT_EQ(0x13, stream[3]);
231 EXPECT_EQ(0xbd, stream[4]);
232
233 // Subsequent writes fail.
234 memset(stream, 0xbd, sizeof(stream));
235 EXPECT_EQ(kWriteError, opj_write_from_memory(buffer_data, 5, &dd));
236 EXPECT_EQ(0xbd, stream[0]);
237 }
238 {
239 // Pretend the stream can only hold 4 bytes.
240 DecodeData dd(stream, 4);
241
242 // Write ending past EOF (two steps) transfers up til EOF.
243 memset(stream, 0xbd, sizeof(stream));
244 EXPECT_EQ(2u, opj_write_from_memory(buffer_data, 2, &dd));
245 EXPECT_EQ(2u, opj_write_from_memory(buffer_data, 4, &dd));
246 EXPECT_EQ(0x10, stream[0]);
247 EXPECT_EQ(0x11, stream[1]);
248 EXPECT_EQ(0x10, stream[2]);
249 EXPECT_EQ(0x11, stream[3]);
250 EXPECT_EQ(0xbd, stream[4]);
251
252 // Subsequent writes fail.
253 memset(stream, 0xbd, sizeof(stream));
254 EXPECT_EQ(kWriteError, opj_write_from_memory(buffer_data, 5, &dd));
255 EXPECT_EQ(0xbd, stream[0]);
256 }
257 }
258
259 // Note: Some care needs to be taken here because the skip/seek functions
260 // take OPJ_OFF_T's as arguments, which are typically a signed type.
261 TEST(fxcodec, DecodeDataSkip) {
262 unsigned char buffer[16];
263 {
264 DecodeData dd(stream_data, sizeof(stream_data));
265
266 // Skiping within buffer is allowed.
267 memset(buffer, 0xbd, sizeof(buffer));
268 EXPECT_EQ(1, opj_skip_from_memory(1, &dd));
269 EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd));
270 EXPECT_EQ(0x01, buffer[0]);
271 EXPECT_EQ(0xbd, buffer[1]);
272
273 // Skiping 0 bytes changes nothing.
274 memset(buffer, 0xbd, sizeof(buffer));
275 EXPECT_EQ(0, opj_skip_from_memory(0, &dd));
276 EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd));
277 EXPECT_EQ(0x02, buffer[0]);
278 EXPECT_EQ(0xbd, buffer[1]);
279
280 // Skiping to EOS-1 is possible.
281 memset(buffer, 0xbd, sizeof(buffer));
282 EXPECT_EQ(4, opj_skip_from_memory(4, &dd));
283 EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd));
284 EXPECT_EQ(0x87, buffer[0]);
285 EXPECT_EQ(0xbd, buffer[1]);
286
287 // Next read fails.
288 memset(buffer, 0xbd, sizeof(buffer));
289 EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 1, &dd));
290 EXPECT_EQ(0xbd, buffer[0]);
291 }
292 {
293 DecodeData dd(stream_data, sizeof(stream_data));
294
295 // Skiping directly to EOS is allowed.
296 memset(buffer, 0xbd, sizeof(buffer));
297 EXPECT_EQ(8, opj_skip_from_memory(8, &dd));
298
299 // Next read fails.
300 EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 1, &dd));
301 EXPECT_EQ(0xbd, buffer[0]);
302 }
303 {
304 DecodeData dd(stream_data, sizeof(stream_data));
305
306 // Skipping beyond end of stream is allowed and returns full distance.
307 memset(buffer, 0xbd, sizeof(buffer));
308 EXPECT_EQ(9, opj_skip_from_memory(9, &dd));
309
310 // Next read fails.
311 EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 1, &dd));
312 EXPECT_EQ(0xbd, buffer[0]);
313 }
314 {
315 DecodeData dd(stream_data, sizeof(stream_data));
316
317 // Skipping way beyond EOS is allowd, doesn't wrap, and returns
318 // full distance.
319 memset(buffer, 0xbd, sizeof(buffer));
320 EXPECT_EQ(4, opj_skip_from_memory(4, &dd));
321 EXPECT_EQ(std::numeric_limits<OPJ_OFF_T>::max(), opj_skip_from_memory(
322 std::numeric_limits<OPJ_OFF_T>::max(), &dd));
323
324 // Next read fails. If it succeeds, it may mean we wrapped.
325 EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 1, &dd));
326 EXPECT_EQ(0xbd, buffer[0]);
327 }
328 {
329 DecodeData dd(stream_data, sizeof(stream_data));
330
331 // Negative skip within buffer not is allowed, position unchanged.
332 memset(buffer, 0xbd, sizeof(buffer));
333 EXPECT_EQ(4, opj_skip_from_memory(4, &dd));
334 EXPECT_EQ(kSkipError, opj_skip_from_memory(-2, &dd));
335
336 // Next read succeeds as if nothing has happenned.
337 EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd));
338 EXPECT_EQ(0x84, buffer[0]);
339 EXPECT_EQ(0xbd, buffer[1]);
340
341 // Negative skip before buffer is not allowed, position unchanged.
342 memset(buffer, 0xbd, sizeof(buffer));
343 EXPECT_EQ(kSkipError, opj_skip_from_memory(-4, &dd));
344
345 // Next read succeeds as if nothing has happenned.
346 EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd));
347 EXPECT_EQ(0x85, buffer[0]);
348 EXPECT_EQ(0xbd, buffer[1]);
349 }
350 {
351 DecodeData dd(stream_data, sizeof(stream_data));
352
353 // Negative skip way before buffer is not allowed, doesn't wrap
354 memset(buffer, 0xbd, sizeof(buffer));
355 EXPECT_EQ(4, opj_skip_from_memory(4, &dd));
356 EXPECT_EQ(kSkipError, opj_skip_from_memory(
357 std::numeric_limits<OPJ_OFF_T>::min(), &dd));
358
359 // Next read succeeds. If it fails, it may mean we wrapped.
360 EXPECT_EQ(1, opj_read_from_memory(buffer, 1, &dd));
361 EXPECT_EQ(0x84, buffer[0]);
362 EXPECT_EQ(0xbd, buffer[1]);
363 }
364 {
365 DecodeData dd(stream_data, sizeof(stream_data));
366
367 // Negative skip after EOS isn't alowed, still EOS.
368 memset(buffer, 0xbd, sizeof(buffer));
369 EXPECT_EQ(8, opj_skip_from_memory(8, &dd));
370 EXPECT_EQ(kSkipError, opj_skip_from_memory(-4, &dd));
371
372 // Next read fails.
373 EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 1, &dd));
374 EXPECT_EQ(0xbd, buffer[0]);
375 }
376
377 }
378
379 TEST(fxcodec, DecodeDataSeek) {
380 unsigned char buffer[16];
381 DecodeData dd(stream_data, sizeof(stream_data));
382
383 // Seeking within buffer is allowed and read succeeds
384 memset(buffer, 0xbd, sizeof(buffer));
385 EXPECT_TRUE(opj_seek_from_memory(1, &dd));
386 EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd));
387 EXPECT_EQ(0x01, buffer[0]);
388 EXPECT_EQ(0xbd, buffer[1]);
389
390 // Seeking before start returns error leaving position unchanged.
391 memset(buffer, 0xbd, sizeof(buffer));
392 EXPECT_FALSE(opj_seek_from_memory(-1, &dd));
393 EXPECT_EQ(1, opj_read_from_memory(buffer, 1, &dd));
394 EXPECT_EQ(0x02, buffer[0]);
395 EXPECT_EQ(0xbd, buffer[1]);
396
397 // Seeking way before start returns error leaving position unchanged.
398 memset(buffer, 0xbd, sizeof(buffer));
399 EXPECT_FALSE(opj_seek_from_memory(
400 std::numeric_limits<OPJ_OFF_T>::min(), &dd));
401 EXPECT_EQ(1, opj_read_from_memory(buffer, 1, &dd));
402 EXPECT_EQ(0x03, buffer[0]);
403 EXPECT_EQ(0xbd, buffer[1]);
404
405 // Seeking exactly to EOS is allowed but read fails.
406 memset(buffer, 0xbd, sizeof(buffer));
407 EXPECT_TRUE(opj_seek_from_memory(8, &dd));
408 EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 1, &dd));
409 EXPECT_EQ(0xbd, buffer[0]);
410
411 // Seeking back to zero offset is allowed and read succeeds.
412 memset(buffer, 0xbd, sizeof(buffer));
413 EXPECT_TRUE(opj_seek_from_memory(0, &dd));
414 EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd));
415 EXPECT_EQ(0x00, buffer[0]);
416 EXPECT_EQ(0xbd, buffer[1]);
417
418 // Seeking beyond end of stream is allowed but read fails.
419 memset(buffer, 0xbd, sizeof(buffer));
420 EXPECT_TRUE(opj_seek_from_memory(16, &dd));
421 EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 1, &dd));
422 EXPECT_EQ(0xbd, buffer[0]);
423
424 // Seeking within buffer after seek past EOF restores good state.
425 memset(buffer, 0xbd, sizeof(buffer));
426 EXPECT_TRUE(opj_seek_from_memory(4, &dd));
427 EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd));
428 EXPECT_EQ(0x84, buffer[0]);
429 EXPECT_EQ(0xbd, buffer[1]);
430
431 // Seeking way beyond EOS is allowed, doesn't wrap, and read fails.
432 memset(buffer, 0xbd, sizeof(buffer));
433 EXPECT_TRUE(opj_seek_from_memory(
434 std::numeric_limits<OPJ_OFF_T>::max(), &dd));
435 EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 1, &dd));
436 EXPECT_EQ(0xbd, buffer[0]);
437 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698