Reduce stack usage of tmpfile(3).
Also ensure that none of our home-grown code uses more than 2KiB per frame.
Change-Id: I8987a17d72f4b7f082bb7fa25e137c8433664c14
diff --git a/libc/Android.mk b/libc/Android.mk
index 2ec1281..b5a8088 100644
--- a/libc/Android.mk
+++ b/libc/Android.mk
@@ -727,7 +727,10 @@
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(libc_bionic_src_files)
-LOCAL_CFLAGS := $(libc_common_cflags) -Werror
+LOCAL_CFLAGS := $(libc_common_cflags) \
+ -Werror \
+ -Wframe-larger-than=2048 \
+
LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
LOCAL_CPPFLAGS := $(libc_common_cppflags)
LOCAL_C_INCLUDES := $(libc_common_c_includes)
diff --git a/libc/bionic/tmpfile.cpp b/libc/bionic/tmpfile.cpp
index 8419ff5..602d407 100644
--- a/libc/bionic/tmpfile.cpp
+++ b/libc/bionic/tmpfile.cpp
@@ -57,22 +57,23 @@
};
static FILE* __tmpfile_dir(const char* tmp_dir) {
- char buf[PATH_MAX];
- int path_length = snprintf(buf, sizeof(buf), "%s/tmp.XXXXXXXXXX", tmp_dir);
- if (path_length >= static_cast<int>(sizeof(buf))) {
+ char* path = NULL;
+ if (asprintf(&path, "%s/tmp.XXXXXXXXXX", tmp_dir) == -1) {
return NULL;
}
int fd;
{
ScopedSignalBlocker ssb;
- fd = mkstemp(buf);
+ fd = mkstemp(path);
if (fd == -1) {
+ free(path);
return NULL;
}
// Unlink the file now so that it's removed when closed.
- unlink(buf);
+ unlink(path);
+ free(path);
// Can we still use the file now it's unlinked?
// File systems without hard link support won't have the usual Unix semantics.