From e8b663fec3acfefbef6396a23c6f48d66e1f19fc Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Thu, 26 May 2016 22:43:19 -0700 Subject: [PATCH] Kill load_file. Change-Id: I6c332f7d8e94d513605295b3d4d32c4e1cf878dc --- adb/adb_auth.cpp | 18 ++++++++----- adb/adb_auth.h | 6 ++--- adb/adb_auth_host.cpp | 31 +++++------------------ adb/adb_utils.h | 1 + adb/commandline.cpp | 59 ++++++++++++++++++------------------------- adb/sysdeps.h | 4 --- adb/sysdeps_win32.cpp | 56 ---------------------------------------- 7 files changed, 46 insertions(+), 129 deletions(-) diff --git a/adb/adb_auth.cpp b/adb/adb_auth.cpp index 1ffab0940..215bbe654 100644 --- a/adb/adb_auth.cpp +++ b/adb/adb_auth.cpp @@ -72,19 +72,23 @@ void send_auth_response(uint8_t *token, size_t token_size, atransport *t) void send_auth_publickey(atransport *t) { D("Calling send_auth_publickey"); - apacket *p = get_apacket(); - int ret; - - ret = adb_auth_get_userkey(p->data, MAX_PAYLOAD_V1); - if (!ret) { + std::string key = adb_auth_get_userkey(); + if (key.empty()) { D("Failed to get user public key"); - put_apacket(p); return; } + if (key.size() >= MAX_PAYLOAD_V1) { + D("User public key too large (%zu B)", key.size()); + return; + } + + apacket* p = get_apacket(); + memcpy(p->data, key.c_str(), key.size() + 1); + p->msg.command = A_AUTH; p->msg.arg0 = ADB_AUTH_RSAPUBLICKEY; - p->msg.data_length = ret; + p->msg.data_length = key.size(); send_packet(p, t); } diff --git a/adb/adb_auth.h b/adb/adb_auth.h index 1ab5e1ae4..6363bb4c8 100644 --- a/adb/adb_auth.h +++ b/adb/adb_auth.h @@ -41,7 +41,7 @@ void adb_auth_init(void); int adb_auth_sign(void *key, const unsigned char* token, size_t token_size, unsigned char* sig); void *adb_auth_nextkey(void *current); -int adb_auth_get_userkey(unsigned char *data, size_t len); +std::string adb_auth_get_userkey(); static inline int adb_auth_generate_token(void *token, size_t token_size) { return 0; @@ -60,9 +60,7 @@ static inline int adb_auth_sign(void* key, const unsigned char* token, return 0; } static inline void *adb_auth_nextkey(void *current) { return NULL; } -static inline int adb_auth_get_userkey(unsigned char *data, size_t len) { - return 0; -} +static inline std::string adb_auth_get_userkey() { return ""; } void adbd_auth_init(void); void adbd_cloexec_auth_socket(); diff --git a/adb/adb_auth_host.cpp b/adb/adb_auth_host.cpp index 07356947d..03cebe97b 100644 --- a/adb/adb_auth_host.cpp +++ b/adb/adb_auth_host.cpp @@ -27,6 +27,7 @@ #include "adb.h" #include +#include #include #include #include @@ -334,39 +335,21 @@ void *adb_auth_nextkey(void *current) return NULL; } -int adb_auth_get_userkey(unsigned char *data, size_t len) -{ +std::string adb_auth_get_userkey() { char path[PATH_MAX]; int ret = get_user_keyfilepath(path, sizeof(path) - 4); if (ret < 0 || ret >= (signed)(sizeof(path) - 4)) { D("Error getting user key filename"); - return 0; + return ""; } strcat(path, ".pub"); - // TODO(danalbert): ReadFileToString - // Note that on Windows, load_file() does not do CR/LF translation, but - // ReadFileToString() uses the C Runtime which uses CR/LF translation by - // default (by is overridable with _setmode()). - unsigned size; - char* file_data = reinterpret_cast(load_file(path, &size)); - if (file_data == nullptr) { + std::string content; + if (!android::base::ReadFileToString(path, &content)) { D("Can't load '%s'", path); - return 0; + return ""; } - - if (len < (size_t)(size + 1)) { - D("%s: Content too large ret=%d", path, size); - free(file_data); - return 0; - } - - memcpy(data, file_data, size); - free(file_data); - file_data = nullptr; - data[size] = '\0'; - - return size + 1; + return content; } int adb_auth_keygen(const char* filename) { diff --git a/adb/adb_utils.h b/adb/adb_utils.h index 3daef52de..06ede076d 100644 --- a/adb/adb_utils.h +++ b/adb/adb_utils.h @@ -66,6 +66,7 @@ struct AdbCloser { using unique_fd = android::base::unique_fd_impl; +// TODO: switch remaining users over to unique_fd... class ScopedFd { public: ScopedFd() { diff --git a/adb/commandline.cpp b/adb/commandline.cpp index 868470cc1..82fa19a17 100644 --- a/adb/commandline.cpp +++ b/adb/commandline.cpp @@ -35,6 +35,7 @@ #include #include +#include #include #include #include @@ -871,47 +872,47 @@ static int adb_download_buffer(const char *service, const char *fn, const void* * we hang up. */ static int adb_sideload_host(const char* fn) { - unsigned sz; - size_t xfer = 0; - int status; - int last_percent = -1; - int opt = SIDELOAD_HOST_BLOCK_SIZE; - printf("loading: '%s'", fn); fflush(stdout); - uint8_t* data = reinterpret_cast(load_file(fn, &sz)); - if (data == 0) { + + std::string content; + if (!android::base::ReadFileToString(fn, &content)) { printf("\n"); fprintf(stderr, "* cannot read '%s' *\n", fn); return -1; } + const uint8_t* data = reinterpret_cast(content.data()); + unsigned sz = content.size(); + std::string service = android::base::StringPrintf("sideload-host:%d:%d", sz, SIDELOAD_HOST_BLOCK_SIZE); std::string error; - int fd = adb_connect(service, &error); - if (fd < 0) { + unique_fd fd(adb_connect(service, &error)); + if (fd >= 0) { // Try falling back to the older sideload method. Maybe this // is an older device that doesn't support sideload-host. printf("\n"); - status = adb_download_buffer("sideload", fn, data, sz, true); - goto done; + return adb_download_buffer("sideload", fn, data, sz, true); } - opt = adb_setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (const void *) &opt, sizeof(opt)); + int opt = SIDELOAD_HOST_BLOCK_SIZE; + adb_setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(opt)); + size_t xfer = 0; + int last_percent = -1; while (true) { char buf[9]; if (!ReadFdExactly(fd, buf, 8)) { fprintf(stderr, "* failed to read command: %s\n", strerror(errno)); - status = -1; - goto done; + return -1; } buf[8] = '\0'; if (strcmp("DONEDONE", buf) == 0) { - status = 0; - break; + printf("\rTotal xfer: %.2fx%*s\n", + (double)xfer / (sz ? sz : 1), (int)strlen(fn)+10, ""); + return 0; } int block = strtol(buf, NULL, 10); @@ -919,21 +920,19 @@ static int adb_sideload_host(const char* fn) { size_t offset = block * SIDELOAD_HOST_BLOCK_SIZE; if (offset >= sz) { fprintf(stderr, "* attempt to read block %d past end\n", block); - status = -1; - goto done; + return -1; } - uint8_t* start = data + offset; + const uint8_t* start = data + offset; size_t offset_end = offset + SIDELOAD_HOST_BLOCK_SIZE; size_t to_write = SIDELOAD_HOST_BLOCK_SIZE; if (offset_end > sz) { to_write = sz - offset; } - if(!WriteFdExactly(fd, start, to_write)) { + if (!WriteFdExactly(fd, start, to_write)) { adb_status(fd, &error); fprintf(stderr,"* failed to write data '%s' *\n", error.c_str()); - status = -1; - goto done; + return -1; } xfer += to_write; @@ -950,13 +949,6 @@ static int adb_sideload_host(const char* fn) { last_percent = percent; } } - - printf("\rTotal xfer: %.2fx%*s\n", (double)xfer / (sz ? sz : 1), (int)strlen(fn)+10, ""); - - done: - if (fd >= 0) adb_close(fd); - free(data); - return status; } /** @@ -1067,10 +1059,9 @@ static bool wait_for_device(const char* service, TransportType t, const char* se static bool adb_root(const char* command) { std::string error; - ScopedFd fd; - fd.Reset(adb_connect(android::base::StringPrintf("%s:", command), &error)); - if (!fd.valid()) { + unique_fd fd(adb_connect(android::base::StringPrintf("%s:", command), &error)); + if (fd < 0) { fprintf(stderr, "adb: unable to connect for %s: %s\n", command, error.c_str()); return false; } @@ -1080,7 +1071,7 @@ static bool adb_root(const char* command) { char* cur = buf; ssize_t bytes_left = sizeof(buf); while (bytes_left > 0) { - ssize_t bytes_read = adb_read(fd.fd(), cur, bytes_left); + ssize_t bytes_read = adb_read(fd, cur, bytes_left); if (bytes_read == 0) { break; } else if (bytes_read < 0) { diff --git a/adb/sysdeps.h b/adb/sysdeps.h index 639f8eb22..212c1c365 100644 --- a/adb/sysdeps.h +++ b/adb/sysdeps.h @@ -269,9 +269,6 @@ extern int unix_open(const char* path, int options, ...); int unix_isatty(int fd); #define isatty ___xxx_isatty -/* normally provided by */ -extern void* load_file(const char* pathname, unsigned* psize); - static __inline__ void adb_sleep_ms( int mseconds ) { Sleep( mseconds ); @@ -458,7 +455,6 @@ size_t ParseCompleteUTF8(const char* first, const char* last, std::vector* #else /* !_WIN32 a.k.a. Unix */ -#include #include #include #include diff --git a/adb/sysdeps_win32.cpp b/adb/sysdeps_win32.cpp index faf7f3e13..f94d6fcbc 100644 --- a/adb/sysdeps_win32.cpp +++ b/adb/sysdeps_win32.cpp @@ -107,62 +107,6 @@ void handle_deleter::operator()(HANDLE h) { } } -/**************************************************************************/ -/**************************************************************************/ -/***** *****/ -/***** replaces libs/cutils/load_file.c *****/ -/***** *****/ -/**************************************************************************/ -/**************************************************************************/ - -void *load_file(const char *fn, unsigned *_sz) -{ - HANDLE file; - char *data; - DWORD file_size; - - std::wstring fn_wide; - if (!android::base::UTF8ToWide(fn, &fn_wide)) - return NULL; - - file = CreateFileW( fn_wide.c_str(), - GENERIC_READ, - FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - 0, - NULL ); - - if (file == INVALID_HANDLE_VALUE) - return NULL; - - file_size = GetFileSize( file, NULL ); - data = NULL; - - if (file_size > 0) { - data = (char*) malloc( file_size + 1 ); - if (data == NULL) { - D("load_file: could not allocate %ld bytes", file_size ); - file_size = 0; - } else { - DWORD out_bytes; - - if ( !ReadFile( file, data, file_size, &out_bytes, NULL ) || - out_bytes != file_size ) - { - D("load_file: could not read %ld bytes from '%s'", file_size, fn); - free(data); - data = NULL; - file_size = 0; - } - } - } - CloseHandle( file ); - - *_sz = (unsigned) file_size; - return data; -} - /**************************************************************************/ /**************************************************************************/ /***** *****/