Fix strict weak ordering requirement of less than operation
operator< on hidl_vec<uint8_t> 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
This commit is contained in:
parent
9c9fea329e
commit
93c7276e3a
1 changed files with 3 additions and 1 deletions
|
@ -21,7 +21,9 @@ namespace android {
|
|||
namespace hardware {
|
||||
|
||||
inline static bool operator<(const hidl_vec<uint8_t>& a, const hidl_vec<uint8_t>& 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 <size_t SIZE>
|
||||
|
|
Loading…
Reference in a new issue