From a761231b96f0da85ff01a4a22fe3a04487c634d9 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Mon, 1 May 2017 13:45:30 -0700 Subject: [PATCH] Stop writing NUL bytes in adbkey.pub. In N we moved some code from C to C++ without realizing that EVP_EncodedLength includes space for a terminating NUL and EVP_EncodeBlock writes one. Because our key reading code copes with the NUL, we never noticed. Distinguish between the required space returned by EVP_EncodedLength and the actual number of bytes (not including NUL) used return by EVP_EncodeBlock. Bug: http://b/36187819 Test: hexdump of ~/.android/adbkey.pub (cherry picked from commit 0b771b33fd934db9a7962ad704cdd38f72895c1a) Change-Id: I6e16b8d48d097b4054417c1d1a225bf7ece985b9 --- adb/adb_auth_host.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/adb/adb_auth_host.cpp b/adb/adb_auth_host.cpp index c3f1fe07d..365bf77a9 100644 --- a/adb/adb_auth_host.cpp +++ b/adb/adb_auth_host.cpp @@ -82,16 +82,17 @@ static bool write_public_keyfile(RSA* private_key, const std::string& private_ke return false; } - size_t base64_key_length; - if (!EVP_EncodedLength(&base64_key_length, sizeof(binary_key_data))) { + size_t expected_length; + if (!EVP_EncodedLength(&expected_length, sizeof(binary_key_data))) { LOG(ERROR) << "Public key too large to base64 encode"; return false; } std::string content; - content.resize(base64_key_length); - base64_key_length = EVP_EncodeBlock(reinterpret_cast(&content[0]), binary_key_data, - sizeof(binary_key_data)); + content.resize(expected_length); + size_t actual_length = EVP_EncodeBlock(reinterpret_cast(&content[0]), binary_key_data, + sizeof(binary_key_data)); + content.resize(actual_length); content += get_user_info();