diff options
author | nagendra modadugu <ngm@google.com> | 2018-10-10 17:44:34 -0700 |
---|---|---|
committer | nagendra modadugu <ngm@google.com> | 2018-10-10 17:44:54 -0700 |
commit | 877a6e05bb08353a4f806ad4d3c9cf6f1c3fb097 (patch) | |
tree | 7bc4f07c500745d83fa204ff8158a264a0c1a294 | |
parent | 6c7eb3eb68de6bc7b3b826b1aaadb8fc35efed3f (diff) | |
parent | e30373edfc3c893547bd5b59c9c72e4f1652e353 (diff) | |
download | android-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.cpp | 19 |
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(); } |