diff options
author | dsinclair <dsinclair@chromium.org> | 2016-07-27 21:44:23 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-07-27 21:44:23 -0700 |
commit | 6f1025492801aaa93fca2c0ed7c40a3389ad8cd1 (patch) | |
tree | f4a700dfae9f05be766fa54f769fbdd8a3da6755 /core/fxcrt/fx_basic_util_unittest.cpp | |
parent | f73893a6110f2d4960b372fb4fe38e4fd629ce8f (diff) | |
download | pdfium-6f1025492801aaa93fca2c0ed7c40a3389ad8cd1.tar.xz |
Fixup integer conversion logic.chromium/2813chromium/2812chromium/2811
In bc8a64029f898286c3dcad3a6cecdc98ef30b139 we updated the FX_atonum logic
to correctly handle integer overflow. This causes issues when parsing the
Permissions flag of encrypted documents as that flag isn't encoded like other
numbers.
The Permissions flag is a unsigned value, and has to be treated as such since
the sign bit is always set. The current logic will detect an overflow of the
int value and return 0. The old logic would have detected the overflow and
returned the negative result regardless.
This CL updates the logic to do the string to int conversion as a uint32_t
and then verifies the uint32_t value, if a sign was provided, fits within
the int range, otherwise it converts it to an int and lets it be positive or
negative as needed.
BUG=pdfium:539
Review-Url: https://codereview.chromium.org/2168173002
Diffstat (limited to 'core/fxcrt/fx_basic_util_unittest.cpp')
-rw-r--r-- | core/fxcrt/fx_basic_util_unittest.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/core/fxcrt/fx_basic_util_unittest.cpp b/core/fxcrt/fx_basic_util_unittest.cpp index 3272eab70c..6eae6696ad 100644 --- a/core/fxcrt/fx_basic_util_unittest.cpp +++ b/core/fxcrt/fx_basic_util_unittest.cpp @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <limits> + #include "core/fxcrt/include/fx_basic.h" #include "testing/fx_string_testhelpers.h" #include "testing/gtest/include/gtest/gtest.h" @@ -28,3 +30,48 @@ TEST(fxge, GetBits32) { } } } + +TEST(fxcrt, FX_atonum) { + int i; + EXPECT_TRUE(FX_atonum("10", &i)); + EXPECT_EQ(10, i); + + EXPECT_TRUE(FX_atonum("-10", &i)); + EXPECT_EQ(-10, i); + + EXPECT_TRUE(FX_atonum("+10", &i)); + EXPECT_EQ(10, i); + + EXPECT_TRUE(FX_atonum("-2147483648", &i)); + EXPECT_EQ(std::numeric_limits<int>::min(), i); + + EXPECT_TRUE(FX_atonum("2147483647", &i)); + EXPECT_EQ(2147483647, i); + + // Value overflows. + EXPECT_TRUE(FX_atonum("-2147483649", &i)); + EXPECT_EQ(0, i); + + // Value overflows. + EXPECT_TRUE(FX_atonum("+2147483648", &i)); + EXPECT_EQ(0, i); + + // Value overflows. + EXPECT_TRUE(FX_atonum("4223423494965252", &i)); + EXPECT_EQ(0, i); + + // No explicit sign will allow the number to go negative. This is for things + // like the encryption Permissions flag (Table 3.20 PDF 1.7 spec) + EXPECT_TRUE(FX_atonum("4294965252", &i)); + EXPECT_EQ(-2044, i); + + EXPECT_TRUE(FX_atonum("-4294965252", &i)); + EXPECT_EQ(0, i); + + EXPECT_TRUE(FX_atonum("+4294965252", &i)); + EXPECT_EQ(0, i); + + float f; + EXPECT_FALSE(FX_atonum("3.24", &f)); + EXPECT_FLOAT_EQ(3.24f, f); +} |