[automerger] Remove potential double free am: 9d4b635922 am: 85e5167178 am: 4dd7a24475 am: 0573a65f08 am: 93ba1512a8 am: aafa29b59c am: 564b0eae9f am: f68302d93b am: 10f9d7dbe3 Change-Id: Ie86350d857d4b51e5b4c77d56208459f09d0e73d
diff --git a/gatekeeper.cpp b/gatekeeper.cpp index fe427bd..9097491 100644 --- a/gatekeeper.cpp +++ b/gatekeeper.cpp
@@ -37,6 +37,10 @@ // Password handle does not match what is stored, generate new SecureID GetRandom(&user_id, sizeof(secure_id_t)); } else { + if (request.password_handle.length < sizeof(password_handle_t)) { + response->error = ERROR_INVALID; + return; + } password_handle_t *pw_handle = reinterpret_cast<password_handle_t *>(request.password_handle.buffer.get()); @@ -109,6 +113,11 @@ return; } + if (request.password_handle.length < sizeof(password_handle_t)) { + response->error = ERROR_INVALID; + return; + } + password_handle_t *password_handle = reinterpret_cast<password_handle_t *>( request.password_handle.buffer.get()); @@ -232,7 +241,7 @@ token->challenge = challenge; token->user_id = user_id; token->authenticator_id = authenticator_id; - token->authenticator_type = htonl(HW_AUTH_PASSWORD); + token->authenticator_type = htobe32(HW_AUTH_PASSWORD); token->timestamp = htobe64(timestamp); const uint8_t *auth_token_key = NULL; @@ -253,11 +262,11 @@ * Calculates the timeout in milliseconds as a function of the failure * counter 'x' as follows: * - * [0. 5) -> 0 + * [0, 4] -> 0 * 5 -> 30 - * [6, 10) -> 0 - * [11, 30) -> 30 - * [30, 140) -> 30 * (2^((x - 30)/10)) + * [6, 10] -> 0 + * [11, 29] -> 30 + * [30, 139] -> 30 * (2^((x - 30)/10)) * [140, inf) -> 1 day * */
diff --git a/gatekeeper_messages.cpp b/gatekeeper_messages.cpp index d6d028d..dfa9b18 100644 --- a/gatekeeper_messages.cpp +++ b/gatekeeper_messages.cpp
@@ -103,18 +103,21 @@ } gatekeeper_error_t GateKeeperMessage::Deserialize(const uint8_t *payload, const uint8_t *end) { - if (payload + sizeof(uint32_t) > end) return ERROR_INVALID; + if (payload + sizeof(serial_header_t) > end) return ERROR_INVALID; const serial_header_t *header = reinterpret_cast<const serial_header_t *>(payload); + payload += sizeof(serial_header_t); + user_id = header->user_id; if (header->error == ERROR_NONE) { - if (payload == end) return ERROR_INVALID; - user_id = header->user_id; - error = nonErrorDeserialize(payload + sizeof(*header), end); + error = nonErrorDeserialize(payload, end); } else { error = static_cast<gatekeeper_error_t>(header->error); - user_id = header->user_id; if (error == ERROR_RETRY) { - if (payload + sizeof(serial_header_t) < end) { - memcpy(&retry_timeout, payload + sizeof(serial_header_t), sizeof(retry_timeout)); + if (payload < end) { + if (payload + sizeof(retry_timeout) <= end) { + memcpy(&retry_timeout, payload, sizeof(retry_timeout)); + } else { + error = ERROR_INVALID; + } } else { retry_timeout = 0; } @@ -179,6 +182,9 @@ provided_password.buffer.reset(); } + if (payload + sizeof(challenge) > end) { + return ERROR_INVALID; + } memcpy(&challenge, payload, sizeof(challenge)); payload += sizeof(challenge); @@ -231,6 +237,10 @@ return err; } + if (payload + sizeof(request_reenroll) > end) { + return ERROR_INVALID; + } + memcpy(&request_reenroll, payload, sizeof(request_reenroll)); return ERROR_NONE; }
diff --git a/rules.mk b/rules.mk index 46f3df8..831c05a 100644 --- a/rules.mk +++ b/rules.mk
@@ -14,7 +14,6 @@ $(LOCAL_DIR)/../../hardware/libhardware/include MODULE_DEPS := \ - lib/libc \ - lib/libc-trusty \ + trusty/user/base/lib/libc-trusty \ include make/module.mk
diff --git a/tests/gatekeeper_device_test.cpp b/tests/gatekeeper_device_test.cpp index 0e7ace6..f166ca8 100644 --- a/tests/gatekeeper_device_test.cpp +++ b/tests/gatekeeper_device_test.cpp
@@ -98,7 +98,7 @@ hat = reinterpret_cast<hw_auth_token_t *>(auth_token); ASSERT_EQ(HW_AUTH_TOKEN_VERSION, hat->version); - ASSERT_EQ(htonl(HW_AUTH_PASSWORD), hat->authenticator_type); + ASSERT_EQ(htobe32(HW_AUTH_PASSWORD), hat->authenticator_type); } TEST_F(GateKeeperDeviceTest, EnrollAndVerifyTimeout) {