From b6943186ce78105155ba67ab261a970859b190df Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Tue, 13 May 2014 10:14:22 -0700 Subject: [PATCH] Reduce stack usage of tmpfile(3). Also ensure that none of our home-grown code uses more than 2KiB per frame. Change-Id: I8987a17d72f4b7f082bb7fa25e137c8433664c14 --- libc/Android.mk | 5 ++++- libc/bionic/tmpfile.cpp | 11 ++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/libc/Android.mk b/libc/Android.mk index 2ec12811c..b5a808854 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -727,7 +727,10 @@ include $(BUILD_STATIC_LIBRARY) 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 8419ff529..602d40752 100644 --- a/libc/bionic/tmpfile.cpp +++ b/libc/bionic/tmpfile.cpp @@ -57,22 +57,23 @@ class ScopedSignalBlocker { }; 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(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.