adb: let `adb push` follow symlinks. am: 94dc19ff57 am: 30ecda227c am: 3e64efbced
am: 264b3465dd
Change-Id: I9cce821bc247edc50d48ea48e13640dcf6159e09
diff --git a/adb/file_sync_client.cpp b/adb/file_sync_client.cpp
index 56ff68c..f1e4179 100644
--- a/adb/file_sync_client.cpp
+++ b/adb/file_sync_client.cpp
@@ -606,7 +606,7 @@
}
if (st.st_size < SYNC_DATA_MAX) {
std::string data;
- if (!android::base::ReadFileToString(lpath, &data)) {
+ if (!android::base::ReadFileToString(lpath, &data, true)) {
sc.Error("failed to read all of '%s': %s", lpath, strerror(errno));
return false;
}
diff --git a/adb/test_device.py b/adb/test_device.py
index 2efac9d..b12bf88 100644
--- a/adb/test_device.py
+++ b/adb/test_device.py
@@ -787,6 +787,36 @@
if host_dir is not None:
shutil.rmtree(host_dir)
+ @unittest.skipIf(sys.platform == "win32", "symlinks require elevated privileges on windows")
+ def test_push_symlink(self):
+ """Push a symlink.
+
+ Bug: http://b/31491920
+ """
+ try:
+ host_dir = tempfile.mkdtemp()
+
+ # Make sure the temp directory isn't setuid, or else adb will
+ # complain.
+ os.chmod(host_dir, 0o700)
+
+ with open(os.path.join(host_dir, 'foo'), 'w') as f:
+ f.write('foo')
+
+ symlink_path = os.path.join(host_dir, 'symlink')
+ os.symlink('foo', symlink_path)
+
+ self.device.shell(['rm', '-rf', self.DEVICE_TEMP_DIR])
+ self.device.shell(['mkdir', self.DEVICE_TEMP_DIR])
+ self.device.push(symlink_path, self.DEVICE_TEMP_DIR)
+ rc, out, _ = self.device.shell_nocheck(
+ ['cat', posixpath.join(self.DEVICE_TEMP_DIR, 'symlink')])
+ self.assertEqual(0, rc)
+ self.assertEqual(out.strip(), 'foo')
+ finally:
+ if host_dir is not None:
+ shutil.rmtree(host_dir)
+
def test_multiple_push(self):
"""Push multiple files to the device in one adb push command.