OSDN Git Service

Add a test for snprintf on a PTHREAD_STACK_MIN-sized stack.
authorElliott Hughes <enh@google.com>
Fri, 5 Feb 2016 19:18:41 +0000 (11:18 -0800)
committerElliott Hughes <enh@google.com>
Fri, 5 Feb 2016 19:18:41 +0000 (11:18 -0800)
This is a common thing for people to want to do, snprintf requires
a lot of stack for itself, and PTHREAD_STACK_MIN should be usable
for realistic code.

Change-Id: Ib09cfb4e0beec1c69ee0944c3ea4c5d03a94c491

tests/stdio_test.cpp
tests/time_test.cpp

index 2912be4..79a86ad 100644 (file)
@@ -534,6 +534,25 @@ TEST(STDIO_TEST, snprintf_utf8_15439554) {
   freelocale(cloc);
 }
 
+static void* snprintf_small_stack_fn(void*) {
+  // Make life (realistically) hard for ourselves by allocating our own buffer for the result.
+  char buf[PATH_MAX];
+  snprintf(buf, sizeof(buf), "/proc/%d", getpid());
+  return nullptr;
+}
+
+TEST(STDIO_TEST, snprintf_small_stack) {
+  // Is it safe to call snprintf on a thread with a small stack?
+  // (The snprintf implementation puts some pretty large buffers on the stack.)
+  pthread_attr_t a;
+  ASSERT_EQ(0, pthread_attr_init(&a));
+  ASSERT_EQ(0, pthread_attr_setstacksize(&a, PTHREAD_STACK_MIN));
+
+  pthread_t t;
+  ASSERT_EQ(0, pthread_create(&t, &a, snprintf_small_stack_fn, nullptr));
+  ASSERT_EQ(0, pthread_join(t, nullptr));
+}
+
 TEST(STDIO_TEST, fprintf_failures_7229520) {
   // http://b/7229520
   FILE* fp;
index ec1b549..6cdabd2 100644 (file)
@@ -59,19 +59,13 @@ TEST(time, gmtime_no_stack_overflow_14313703) {
   // Is it safe to call tzload on a thread with a small stack?
   // http://b/14313703
   // https://code.google.com/p/android/issues/detail?id=61130
-  pthread_attr_t attributes;
-  ASSERT_EQ(0, pthread_attr_init(&attributes));
-#if defined(__BIONIC__)
-  ASSERT_EQ(0, pthread_attr_setstacksize(&attributes, PTHREAD_STACK_MIN));
-#else
-  // PTHREAD_STACK_MIN not currently in the host GCC sysroot.
-  ASSERT_EQ(0, pthread_attr_setstacksize(&attributes, 4 * getpagesize()));
-#endif
+  pthread_attr_t a;
+  ASSERT_EQ(0, pthread_attr_init(&a));
+  ASSERT_EQ(0, pthread_attr_setstacksize(&a, PTHREAD_STACK_MIN));
 
   pthread_t t;
-  ASSERT_EQ(0, pthread_create(&t, &attributes, gmtime_no_stack_overflow_14313703_fn, NULL));
-  void* result;
-  ASSERT_EQ(0, pthread_join(t, &result));
+  ASSERT_EQ(0, pthread_create(&t, &a, gmtime_no_stack_overflow_14313703_fn, NULL));
+  ASSERT_EQ(0, pthread_join(t, nullptr));
 }
 
 TEST(time, mktime_empty_TZ) {