summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Moreland <smoreland@google.com>2019-04-18 12:54:56 -0700
committerSteven Moreland <smoreland@google.com>2019-05-08 18:39:38 +0000
commit0cea857b15b40a0de345925da0287e9d1026180d (patch)
treebd5176a960c679851c3f67043845018f0d4031d9
parent3faf64b2dc9b02d14a342f69e069846aa8bb001d (diff)
downloadlibhidl-0cea857b15b40a0de345925da0287e9d1026180d.tar.gz
Zero-init HIDL core types (all)
hidl_pointer - already zero initialized hidl_string - now memset to 0 hidl_array - has no pad to initialize, default initialize since we now expect structs to be default initialized to sane values. hidl_vec - now memset to 0 hidl_memory - has three aligned(8) items which are always set hidl_version - unused, but has two uint16_t entries Zero-init HIDL core types (hidl_handle). Has 7 padded bits at the end. Since they are passed across processes. Bug: 131356202 Test: print out values Change-Id: I3979232879bb437d17d3a6f6013b53b2951a2138 Merged-In: I3979232879bb437d17d3a6f6013b53b2951a2138
-rw-r--r--base/HidlSupport.cpp20
-rw-r--r--base/include/hidl/HidlInternal.h1
-rw-r--r--base/include/hidl/HidlSupport.h23
3 files changed, 26 insertions, 18 deletions
diff --git a/base/HidlSupport.cpp b/base/HidlSupport.cpp
index 8223599..f9a23e8 100644
--- a/base/HidlSupport.cpp
+++ b/base/HidlSupport.cpp
@@ -36,27 +36,28 @@ bool debuggable() {
} // namespace details
hidl_handle::hidl_handle() {
- mHandle = nullptr;
- mOwnsHandle = false;
+ memset(this, 0, sizeof(*this));
+ // mHandle = nullptr;
+ // mOwnsHandle = false;
}
hidl_handle::~hidl_handle() {
freeHandle();
}
-hidl_handle::hidl_handle(const native_handle_t *handle) {
+hidl_handle::hidl_handle(const native_handle_t* handle) : hidl_handle() {
mHandle = handle;
mOwnsHandle = false;
}
// copy constructor.
-hidl_handle::hidl_handle(const hidl_handle &other) {
+hidl_handle::hidl_handle(const hidl_handle& other) : hidl_handle() {
mOwnsHandle = false;
*this = other;
}
// move constructor.
-hidl_handle::hidl_handle(hidl_handle &&other) {
+hidl_handle::hidl_handle(hidl_handle&& other) : hidl_handle() {
mOwnsHandle = false;
*this = std::move(other);
}
@@ -137,10 +138,11 @@ void hidl_handle::freeHandle() {
static const char *const kEmptyString = "";
-hidl_string::hidl_string()
- : mBuffer(kEmptyString),
- mSize(0),
- mOwnsBuffer(false) {
+hidl_string::hidl_string() {
+ memset(this, 0, sizeof(*this));
+ // mSize is zero
+ // mOwnsBuffer is false
+ mBuffer = kEmptyString;
}
hidl_string::~hidl_string() {
diff --git a/base/include/hidl/HidlInternal.h b/base/include/hidl/HidlInternal.h
index 6c0d8df..4b29276 100644
--- a/base/include/hidl/HidlInternal.h
+++ b/base/include/hidl/HidlInternal.h
@@ -43,6 +43,7 @@ template<typename T>
struct hidl_pointer {
hidl_pointer()
: _pad(0) {
+ static_assert(sizeof(*this) == 8, "wrong size");
}
hidl_pointer(T* ptr)
: mPointer(ptr) {
diff --git a/base/include/hidl/HidlSupport.h b/base/include/hidl/HidlSupport.h
index 6807860..ad1293f 100644
--- a/base/include/hidl/HidlSupport.h
+++ b/base/include/hidl/HidlSupport.h
@@ -282,29 +282,32 @@ private:
template<typename T>
struct hidl_vec {
- hidl_vec()
- : mBuffer(NULL),
- mSize(0),
- mOwnsBuffer(true) {
+ hidl_vec() {
static_assert(hidl_vec<T>::kOffsetOfBuffer == 0, "wrong offset");
+
+ memset(this, 0, sizeof(*this));
+ // mSize is 0
+ // mBuffer is nullptr
+
+ // this is for consistency with the original implementation
+ mOwnsBuffer = true;
}
hidl_vec(const hidl_vec<T> &other) : hidl_vec() {
*this = other;
}
- hidl_vec(hidl_vec<T> &&other) noexcept
- : mOwnsBuffer(false) {
+ hidl_vec(hidl_vec<T> &&other) noexcept : hidl_vec() {
*this = std::move(other);
}
- hidl_vec(const std::initializer_list<T> list)
- : mOwnsBuffer(true) {
+ hidl_vec(const std::initializer_list<T> list) : hidl_vec() {
if (list.size() > UINT32_MAX) {
details::logAlwaysFatal("hidl_vec can't hold more than 2^32 elements.");
}
mSize = static_cast<uint32_t>(list.size());
mBuffer = new T[mSize];
+ mOwnsBuffer = true;
size_t idx = 0;
for (auto it = list.begin(); it != list.end(); ++it) {
@@ -774,7 +777,9 @@ private:
// Version functions
struct hidl_version {
public:
- constexpr hidl_version(uint16_t major, uint16_t minor) : mMajor(major), mMinor(minor) {}
+ constexpr hidl_version(uint16_t major, uint16_t minor) : mMajor(major), mMinor(minor) {
+ static_assert(sizeof(*this) == 4, "wrong size");
+ }
bool operator==(const hidl_version& other) const {
return (mMajor == other.get_major() && mMinor == other.get_minor());