aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Prichard <rprichard@google.com>2018-10-08 20:29:00 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2018-10-08 20:29:00 +0000
commitcb8ed207d2bb6113a80fc7f27cd0beb8897f5192 (patch)
tree00018fd10f34bd8ad4ba7d9f3e4ace9c48b218bb
parent773c697f815d43182adf1eb430f4899255088d6b (diff)
parent5de9a31c058dca200c8e11b17d7a78ee0b27699b (diff)
downloadbionic-cb8ed207d2bb6113a80fc7f27cd0beb8897f5192.tar.gz
Merge changes I8c6b2d1d,I06e0f759,I95d79809
* changes: Add async_safe_format_fd_va_list Fix normalize_path's handling of "/.." linker: fix invalid zip file handling
-rw-r--r--libc/async_safe/async_safe_log.cpp11
-rw-r--r--libc/async_safe/include/async_safe/log.h1
-rw-r--r--linker/linker.cpp3
-rw-r--r--linker/linker_utils.cpp4
-rw-r--r--linker/tests/linker_utils_test.cpp3
5 files changed, 15 insertions, 7 deletions
diff --git a/libc/async_safe/async_safe_log.cpp b/libc/async_safe/async_safe_log.cpp
index 5f22c7495..207035a15 100644
--- a/libc/async_safe/async_safe_log.cpp
+++ b/libc/async_safe/async_safe_log.cpp
@@ -424,13 +424,18 @@ int async_safe_format_buffer(char* buffer, size_t buffer_size, const char* forma
return buffer_len;
}
-int async_safe_format_fd(int fd, const char* format, ...) {
+int async_safe_format_fd_va_list(int fd, const char* format, va_list args) {
FdOutputStream os(fd);
+ out_vformat(os, format, args);
+ return os.total;
+}
+
+int async_safe_format_fd(int fd, const char* format, ...) {
va_list args;
va_start(args, format);
- out_vformat(os, format, args);
+ int result = async_safe_format_fd_va_list(fd, format, args);
va_end(args);
- return os.total;
+ return result;
}
static int write_stderr(const char* tag, const char* msg) {
diff --git a/libc/async_safe/include/async_safe/log.h b/libc/async_safe/include/async_safe/log.h
index 415b48ed2..df68062f5 100644
--- a/libc/async_safe/include/async_safe/log.h
+++ b/libc/async_safe/include/async_safe/log.h
@@ -90,6 +90,7 @@ int async_safe_format_buffer(char* buf, size_t size, const char* fmt, ...) __pri
int async_safe_format_buffer_va_list(char* buffer, size_t buffer_size, const char* format, va_list args);
int async_safe_format_fd(int fd, const char* format , ...) __printflike(2, 3);
+int async_safe_format_fd_va_list(int fd, const char* format, va_list args);
int async_safe_format_log(int pri, const char* tag, const char* fmt, ...) __printflike(3, 4);
int async_safe_format_log_va_list(int pri, const char* tag, const char* fmt, va_list ap);
int async_safe_write_log(int pri, const char* tag, const char* msg);
diff --git a/linker/linker.cpp b/linker/linker.cpp
index e1fe50f60..277b82382 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -918,8 +918,7 @@ bool ZipArchiveCache::get_or_open(const char* zip_path, ZipArchiveHandle* handle
if (OpenArchiveFd(fd, "", handle) != 0) {
// invalid zip-file (?)
- CloseArchive(handle);
- close(fd);
+ CloseArchive(*handle);
return false;
}
diff --git a/linker/linker_utils.cpp b/linker/linker_utils.cpp
index 789d5c1b8..6b9aec9fa 100644
--- a/linker/linker_utils.cpp
+++ b/linker/linker_utils.cpp
@@ -98,8 +98,8 @@ bool normalize_path(const char* path, std::string* normalized_path) {
while (out_ptr > buf && *--out_ptr != '/') {
}
if (in_ptr[0] == 0) {
- // retain '/'
- out_ptr++;
+ // retain '/' (or write the initial '/' for "/..")
+ *out_ptr++ = '/';
}
continue;
}
diff --git a/linker/tests/linker_utils_test.cpp b/linker/tests/linker_utils_test.cpp
index dce223a10..e406af5f6 100644
--- a/linker/tests/linker_utils_test.cpp
+++ b/linker/tests/linker_utils_test.cpp
@@ -58,6 +58,9 @@ TEST(linker_utils, normalize_path_smoke) {
ASSERT_TRUE(normalize_path("/a/../../b", &output));
ASSERT_EQ("/b", output);
+ ASSERT_TRUE(normalize_path("/..", &output));
+ ASSERT_EQ("/", output);
+
output = "unchanged";
ASSERT_FALSE(normalize_path("root///dir/.///dir2/somedir/../zipfile!/dir/dir9//..///afile", &output));
ASSERT_EQ("unchanged", output);