From 09c5bbf0fb22eb4734bdb05365bba8a12a870939 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Wed, 4 Nov 2015 14:35:43 -0800 Subject: [PATCH 1/2] adb: remove use of mkdirs from `adb backup`. `adb backup -f nonexistent/directories/foo ` shouldn't create the directory structure if they don't already exist. Change-Id: Ifd8769ed7ee5e733a6635751ad09b714ab58ea4b --- adb/commandline.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/adb/commandline.cpp b/adb/commandline.cpp index 8f0a7cca8..3425df249 100644 --- a/adb/commandline.cpp +++ b/adb/commandline.cpp @@ -950,7 +950,6 @@ static int backup(int argc, const char** argv) { if (argc < 2) return usage(); adb_unlink(filename); - mkdirs(filename); int outFd = adb_creat(filename, 0640); if (outFd < 0) { fprintf(stderr, "adb: unable to open file %s\n", filename); From 45b6fc878ab5ba0f76b6bb1947fe04ac6667c2f5 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Wed, 4 Nov 2015 14:51:23 -0800 Subject: [PATCH 2/2] adb: make mkdirs/secure_mkdirs do what they say. Previously, mkdirs/secure_mkdirs wouldn't create a directory at the specified path, only the ones above it. Bug: http://b/25459942 Change-Id: I70c94c4b44d90723cb4a063657fc40e5bcb3b10e --- adb/adb_utils.cpp | 12 ++++++------ adb/file_sync_client.cpp | 7 ++++++- adb/file_sync_service.cpp | 7 +++---- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/adb/adb_utils.cpp b/adb/adb_utils.cpp index f7b2e4e29..c489f83a7 100644 --- a/adb/adb_utils.cpp +++ b/adb/adb_utils.cpp @@ -115,9 +115,7 @@ bool mkdirs(const std::string& path) { // - Recursive, so it uses stack space relative to number of directory // components. - const std::string parent(adb_dirname(path)); - - if (directory_exists(parent)) { + if (directory_exists(path)) { return true; } @@ -125,19 +123,21 @@ bool mkdirs(const std::string& path) { // This can happen on Windows when walking up the directory hierarchy and not // finding anything that already exists (unlike POSIX that will eventually // find . or /). + const std::string parent(adb_dirname(path)); + if (parent == path) { errno = ENOENT; return false; } - // Recursively make parent directories of 'parent'. + // Recursively make parent directories of 'path'. if (!mkdirs(parent)) { return false; } - // Now that the parent directory hierarchy of 'parent' has been ensured, + // Now that the parent directory hierarchy of 'path' has been ensured, // create parent itself. - if (adb_mkdir(parent, 0775) == -1) { + if (adb_mkdir(path, 0775) == -1) { // Can't just check for errno == EEXIST because it might be a file that // exists. const int saved_errno = errno; diff --git a/adb/file_sync_client.cpp b/adb/file_sync_client.cpp index 6087c06f2..d2bc3cdb5 100644 --- a/adb/file_sync_client.cpp +++ b/adb/file_sync_client.cpp @@ -392,7 +392,12 @@ static bool sync_recv(SyncConnection& sc, const char* rpath, const char* lpath) if (!sc.SendRequest(ID_RECV, rpath)) return false; adb_unlink(lpath); - mkdirs(lpath); + if (!mkdirs(adb_dirname(lpath))) { + sc.Error("failed to create parent directory '%s': %s", + adb_dirname(lpath).c_str(), strerror(errno)); + return false; + } + int lfd = adb_creat(lpath, 0644); if (lfd < 0) { sc.Error("cannot create '%s': %s", lpath, strerror(errno)); diff --git a/adb/file_sync_service.cpp b/adb/file_sync_service.cpp index 298ed82eb..7484a7cf3 100644 --- a/adb/file_sync_service.cpp +++ b/adb/file_sync_service.cpp @@ -32,6 +32,7 @@ #include "adb.h" #include "adb_io.h" +#include "adb_utils.h" #include "private/android_filesystem_config.h" #include @@ -53,8 +54,6 @@ static bool secure_mkdirs(const std::string& path) { if (path[0] != '/') return false; std::vector path_components = android::base::Split(path, "/"); - path_components.pop_back(); // For "/system/bin/sh", only create "/system/bin". - std::string partial_path; for (const auto& path_component : path_components) { if (partial_path.back() != OS_PATH_SEPARATOR) partial_path += OS_PATH_SEPARATOR; @@ -149,7 +148,7 @@ static bool handle_send_file(int s, const char* path, uid_t uid, int fd = adb_open_mode(path, O_WRONLY | O_CREAT | O_EXCL | O_CLOEXEC, mode); if (fd < 0 && errno == ENOENT) { - if (!secure_mkdirs(path)) { + if (!secure_mkdirs(adb_dirname(path))) { SendSyncFailErrno(s, "secure_mkdirs failed"); goto fail; } @@ -244,7 +243,7 @@ static bool handle_send_link(int s, const std::string& path, std::vector& ret = symlink(&buffer[0], path.c_str()); if (ret && errno == ENOENT) { - if (!secure_mkdirs(path)) { + if (!secure_mkdirs(adb_dirname(path))) { SendSyncFailErrno(s, "secure_mkdirs failed"); return false; }