diff options
author | Ryan Prichard <rprichard@google.com> | 2018-10-08 20:29:00 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2018-10-08 20:29:00 +0000 |
commit | cb8ed207d2bb6113a80fc7f27cd0beb8897f5192 (patch) | |
tree | 00018fd10f34bd8ad4ba7d9f3e4ace9c48b218bb | |
parent | 773c697f815d43182adf1eb430f4899255088d6b (diff) | |
parent | 5de9a31c058dca200c8e11b17d7a78ee0b27699b (diff) | |
download | bionic-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.cpp | 11 | ||||
-rw-r--r-- | libc/async_safe/include/async_safe/log.h | 1 | ||||
-rw-r--r-- | linker/linker.cpp | 3 | ||||
-rw-r--r-- | linker/linker_utils.cpp | 4 | ||||
-rw-r--r-- | linker/tests/linker_utils_test.cpp | 3 |
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); |