From 93c7276e3adf8bbd67e62925abf4efdb24ebdb1b Mon Sep 17 00:00:00 2001 From: Janis Danisevskis Date: Sun, 17 Jun 2018 14:06:20 -0700 Subject: [PATCH] Fix strict weak ordering requirement of less than operation operator< on hidl_vec violates strict weak ordering in the case that one oparand is shorter that the other and the shorter is a prefix of the longer. if x and y are incomparable, i.e., neither x < y nor y < x and y and z are incomparable, i.e., neither y < z nor z < y, then x and z must be incomparable. As for the current implementation the first two statements are true but the third is not given the following example input: x:="aa", y:="a", z:="ab". This patch fixes the issue by defining a < b if a is a prefix of b. As this relation is used in a std::sort algorithm which demands strict weak ordering this bug leads to undefined behavior. Change-Id: I4961bb35e2fd4f5fcf561ec0c7c536f81830aab8 --- keymaster/4.0/support/keymaster_utils.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/keymaster/4.0/support/keymaster_utils.cpp b/keymaster/4.0/support/keymaster_utils.cpp index 729e1c1dbf..e35fdd36d5 100644 --- a/keymaster/4.0/support/keymaster_utils.cpp +++ b/keymaster/4.0/support/keymaster_utils.cpp @@ -21,7 +21,9 @@ namespace android { namespace hardware { inline static bool operator<(const hidl_vec& a, const hidl_vec& b) { - return memcmp(a.data(), b.data(), std::min(a.size(), b.size())) == -1; + auto result = memcmp(a.data(), b.data(), std::min(a.size(), b.size())); + if (!result) return a.size() < b.size(); + return result < 0; } template