summaryrefslogtreecommitdiff
path: root/adb/daemon/file_sync_service.cpp
diff options
context:
space:
mode:
authorJosh Gao <jmgao@google.com>2018-06-28 18:43:19 -0700
committerJosh Gao <jmgao@google.com>2018-07-09 14:25:51 -0700
commit4c0078d67a552c63b439b2398e17e9cdaf6b7067 (patch)
tree666f04f8338c75c66a095113db7a15d9d70a1b78 /adb/daemon/file_sync_service.cpp
parent78ea17a6415c5d231606c7099eed7febc7801052 (diff)
adbd: fix spurious failure to create dirs when pushing.
When pushing to a path, we first try to ensure the directory path exists and has the permissions expected by fs_config. Due to a change that changed the fs_config check from a blacklist to a whitelist, we started doing this for /data (which doesn't begin with /data/), and the UID/GID for that path was accidentally being reused for following path segments that didn't exist, leading to a failed attempt to chown /data/local/tmp/foo to be owned by system. Bug: http://b/110953234 Test: python test_device.py Change-Id: Ie798eec48bcf54aea40f6d90cc03bb2170280ee8
Diffstat (limited to 'adb/daemon/file_sync_service.cpp')
-rw-r--r--adb/daemon/file_sync_service.cpp18
1 files changed, 12 insertions, 6 deletions
diff --git a/adb/daemon/file_sync_service.cpp b/adb/daemon/file_sync_service.cpp
index 11289934e..f7be8f94b 100644
--- a/adb/daemon/file_sync_service.cpp
+++ b/adb/daemon/file_sync_service.cpp
@@ -69,17 +69,23 @@ static bool update_capabilities(const char* path, uint64_t capabilities) {
}
static bool secure_mkdirs(const std::string& path) {
- uid_t uid = -1;
- gid_t gid = -1;
- unsigned int mode = 0775;
- uint64_t capabilities = 0;
-
if (path[0] != '/') return false;
std::vector<std::string> path_components = android::base::Split(path, "/");
std::string partial_path;
for (const auto& path_component : path_components) {
- if (partial_path.back() != OS_PATH_SEPARATOR) partial_path += OS_PATH_SEPARATOR;
+ uid_t uid = -1;
+ gid_t gid = -1;
+ unsigned int mode = 0775;
+ uint64_t capabilities = 0;
+
+ if (path_component.empty()) {
+ continue;
+ }
+
+ if (partial_path.empty() || partial_path.back() != OS_PATH_SEPARATOR) {
+ partial_path += OS_PATH_SEPARATOR;
+ }
partial_path += path_component;
if (should_use_fs_config(partial_path)) {