You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by ta...@apache.org on 2019/08/11 02:18:03 UTC
[impala] 02/03: IMPALA-8850: is_percent not initialized in
TmpFileMgr parser
This is an automated email from the ASF dual-hosted git repository.
tarmstrong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/impala.git
commit f34a243a956dacd52f8afe79a122410ccf45ae26
Author: Tim Armstrong <ta...@cloudera.com>
AuthorDate: Thu Aug 8 17:34:03 2019 -0700
IMPALA-8850: is_percent not initialized in TmpFileMgr parser
This bug was only detected on ASAN. The is_percent variable
was not initialised and is not set in ParseMemSpec() when it
does an early exit for an empty string. This caused
TmpFileMgr to consider the empty memory spec after the colon
to be invalid.
Testing:
This reliably reproduced in TmpFileMgrTest under ASAN.
Initialising is_percent fixed the issue.
Added more detailed tests for ParseMemSpec() that initialise
is_percent to avoid similar bugs.
Change-Id: I4465944c7043c1fc6b33db9693ec290c24e3ed19
Reviewed-on: http://gerrit.cloudera.org:8080/14040
Reviewed-by: Impala Public Jenkins <im...@cloudera.com>
Tested-by: Impala Public Jenkins <im...@cloudera.com>
---
be/src/util/parse-util-test.cc | 23 +++++++++++++++++++++++
be/src/util/parse-util.cc | 2 +-
2 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/be/src/util/parse-util-test.cc b/be/src/util/parse-util-test.cc
index c8fb4a0..4d2a5ac 100644
--- a/be/src/util/parse-util-test.cc
+++ b/be/src/util/parse-util-test.cc
@@ -37,54 +37,69 @@ TEST(ParseMemSpecs, Basic) {
int64_t gigabytes = 1024 * megabytes;
int64_t terabytes = 1024 * gigabytes;
+ // Initialize 'is_percent' to the opposite of the expected value, to confirm that
+ // ParseMemSpec() is actually setting the output parameter.
+ is_percent = true;
bytes = ParseUtil::ParseMemSpec("1", &is_percent, MemInfo::physical_mem());
ASSERT_EQ(1, bytes);
ASSERT_FALSE(is_percent);
+ is_percent = true;
bytes = ParseUtil::ParseMemSpec("100b", &is_percent, MemInfo::physical_mem());
ASSERT_EQ(100, bytes);
ASSERT_FALSE(is_percent);
+ is_percent = true;
bytes = ParseUtil::ParseMemSpec("100kb", &is_percent, MemInfo::physical_mem());
ASSERT_EQ(100 * 1024, bytes);
ASSERT_FALSE(is_percent);
+ is_percent = true;
bytes = ParseUtil::ParseMemSpec("5KB", &is_percent, MemInfo::physical_mem());
ASSERT_EQ(5 * 1024, bytes);
ASSERT_FALSE(is_percent);
+ is_percent = true;
bytes = ParseUtil::ParseMemSpec("4MB", &is_percent, MemInfo::physical_mem());
ASSERT_EQ(4 * megabytes, bytes);
ASSERT_FALSE(is_percent);
+ is_percent = true;
bytes = ParseUtil::ParseMemSpec("4m", &is_percent, MemInfo::physical_mem());
ASSERT_EQ(4 * megabytes, bytes);
ASSERT_FALSE(is_percent);
+ is_percent = true;
bytes = ParseUtil::ParseMemSpec("8gb", &is_percent, MemInfo::physical_mem());
ASSERT_EQ(8 * gigabytes, bytes);
ASSERT_FALSE(is_percent);
+ is_percent = true;
bytes = ParseUtil::ParseMemSpec("8G", &is_percent, MemInfo::physical_mem());
ASSERT_EQ(8 * gigabytes, bytes);
ASSERT_FALSE(is_percent);
+ is_percent = true;
bytes = ParseUtil::ParseMemSpec("12Gb", &is_percent, MemInfo::physical_mem());
ASSERT_EQ(12 * gigabytes, bytes);
ASSERT_FALSE(is_percent);
+ is_percent = true;
bytes = ParseUtil::ParseMemSpec("8T", &is_percent, MemInfo::physical_mem());
ASSERT_EQ(8 * terabytes, bytes);
ASSERT_FALSE(is_percent);
+ is_percent = true;
bytes = ParseUtil::ParseMemSpec("12tb", &is_percent, MemInfo::physical_mem());
ASSERT_EQ(12 * terabytes, bytes);
ASSERT_FALSE(is_percent);
+ is_percent = false;
bytes = ParseUtil::ParseMemSpec("13%", &is_percent, MemInfo::physical_mem());
ASSERT_GT(bytes, 0);
ASSERT_TRUE(is_percent);
+ is_percent = false;
ASSERT_GT(ParseUtil::ParseMemSpec("17%", &is_percent, MemInfo::physical_mem()), bytes);
ASSERT_EQ(ParseUtil::ParseMemSpec("17%", &is_percent, 100), 17);
ASSERT_TRUE(is_percent);
@@ -111,17 +126,25 @@ TEST(ParseMemSpecs, Basic) {
ASSERT_EQ(-1, bytes);
}
+ is_percent = true;
bytes = ParseUtil::ParseMemSpec("", &is_percent, MemInfo::physical_mem());
ASSERT_EQ(0, bytes);
+ ASSERT_FALSE(is_percent);
+ is_percent = true;
bytes = ParseUtil::ParseMemSpec("-1", &is_percent, MemInfo::physical_mem());
ASSERT_EQ(0, bytes);
+ ASSERT_FALSE(is_percent);
+ is_percent = true;
bytes = ParseUtil::ParseMemSpec("-2", &is_percent, MemInfo::physical_mem());
ASSERT_LT(bytes, 0);
+ ASSERT_FALSE(is_percent);
+ is_percent = true;
bytes = ParseUtil::ParseMemSpec("-2%", &is_percent, MemInfo::physical_mem());
ASSERT_LT(bytes, 0);
+ ASSERT_TRUE(is_percent);
}
}
diff --git a/be/src/util/parse-util.cc b/be/src/util/parse-util.cc
index 75253d7..a70db99 100644
--- a/be/src/util/parse-util.cc
+++ b/be/src/util/parse-util.cc
@@ -25,9 +25,9 @@ namespace impala {
int64_t ParseUtil::ParseMemSpec(const string& mem_spec_str, bool* is_percent,
int64_t relative_reference) {
+ *is_percent = false;
if (mem_spec_str.empty()) return 0;
- *is_percent = false;
int64_t multiplier = -1;
int32_t number_str_len = mem_spec_str.size();