aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagendra modadugu <ngm@google.com>2018-10-10 17:44:34 -0700
committernagendra modadugu <ngm@google.com>2018-10-10 17:44:54 -0700
commit877a6e05bb08353a4f806ad4d3c9cf6f1c3fb097 (patch)
tree7bc4f07c500745d83fa204ff8158a264a0c1a294
parent6c7eb3eb68de6bc7b3b826b1aaadb8fc35efed3f (diff)
parente30373edfc3c893547bd5b59c9c72e4f1652e353 (diff)
downloadandroid-877a6e05bb08353a4f806ad4d3c9cf6f1c3fb097.tar.gz
Merge remote-tracking branch 'goog/upstream-pixel18' into ota-rc8
* goog/upstream-pixel18: keymaster: abort operations on HAL errors Bug: 116055338 Bug: 113354499 Test: release tests pass Change-Id: I788fbbb1ddbbb498e22c387f688caf1c07b1bb42
-rw-r--r--hals/keymaster/KeymasterDevice.cpp19
1 files changed, 17 insertions, 2 deletions
diff --git a/hals/keymaster/KeymasterDevice.cpp b/hals/keymaster/KeymasterDevice.cpp
index 63d1447..3c569a0 100644
--- a/hals/keymaster/KeymasterDevice.cpp
+++ b/hals/keymaster/KeymasterDevice.cpp
@@ -117,6 +117,17 @@ uint32_t DateCodeToUint32(const std::string& code, bool include_day) {
return return_value;
}
+// Helper class to call a finalizer on stack unwind.
+class Finalize {
+ private:
+ std::function<void()> f_;
+
+ public:
+ Finalize(std::function<void()> f) : f_(f) {}
+ ~Finalize() { if (f_) f_(); }
+ void release() { f_ = {}; }
+};
+
} // namespace
// std
@@ -696,12 +707,15 @@ Return<void> KeymasterDevice::attestKey(
uint64_t operationHandle = startResponse.handle().handle();
ContinueAttestKeyRequest continueRequest;
ContinueAttestKeyResponse continueResponse;
+ // Prepare to abort the pending operation in event of an error.
+ Finalize finalize([&] () { abort(operationHandle); });
continueRequest.mutable_handle()->set_handle(operationHandle);
if (hidl_params_to_pb(
attestParams, continueRequest.mutable_params()) != ErrorCode::OK) {
- _hidl_cb(ErrorCode::INVALID_ARGUMENT, hidl_vec<hidl_vec<uint8_t> >{});
- return Void();
+ LOG(ERROR) << "Failed to parse attest params";
+ _hidl_cb(ErrorCode::INVALID_ARGUMENT, hidl_vec<hidl_vec<uint8_t> >{});
+ return Void();
}
KM_CALLV(ContinueAttestKey, continueRequest, continueResponse,
@@ -851,6 +865,7 @@ Return<void> KeymasterDevice::attestKey(
}
_hidl_cb(ErrorCode::OK, chain);
+ finalize.release();
return Void();
}