am abeafbd6: Merge "Wrap sprintf()/snprintf() macros to prevent expansion errors."

* commit 'abeafbd6d5e11044dd305e48134bc3d84319a3da':
  Wrap sprintf()/snprintf() macros to prevent expansion errors.
This commit is contained in:
Stephen Hines 2013-10-11 16:30:04 -07:00 committed by Android Git Automerger
commit 4691325d48
2 changed files with 22 additions and 2 deletions

View file

@ -469,7 +469,8 @@ int vsprintf(char *dest, const char *format, __va_list ap)
}
#if defined(__clang__)
#define snprintf(dest, size, ...) __builtin___snprintf_chk(dest, size, 0, __bos(dest), __VA_ARGS__)
#define __wrap_snprintf(dest, size, ...) __builtin___snprintf_chk(dest, size, 0, __bos(dest), __VA_ARGS__)
#define snprintf(...) __wrap_snprintf(__VA_ARGS__)
#else
__BIONIC_FORTIFY_INLINE
__printflike(3, 4)
@ -481,7 +482,8 @@ int snprintf(char *dest, size_t size, const char *format, ...)
#endif
#if defined(__clang__)
#define sprintf(dest, ...) __builtin___sprintf_chk(dest, 0, __bos(dest), __VA_ARGS__)
#define __wrap_sprintf(dest, ...) __builtin___sprintf_chk(dest, 0, __bos(dest), __VA_ARGS__)
#define sprintf(...) __wrap_sprintf(__VA_ARGS__)
#else
__BIONIC_FORTIFY_INLINE
__printflike(2, 3)

View file

@ -825,3 +825,21 @@ TEST(TEST_NAME, memcpy_chk_max_int_size) {
ASSERT_EQ('8', buf[8]);
ASSERT_EQ('\0', buf[9]);
}
// Verify that macro expansion is done properly for sprintf/snprintf (which
// are defined as macros in stdio.h under clang).
#define CONTENTS "macro expansion"
#define BUF_AND_SIZE(A) A, sizeof(A)
#define BUF_AND_CONTENTS(A) A, CONTENTS
#define BUF_AND_SIZE_AND_CONTENTS(A) A, sizeof(A), CONTENTS
TEST(TEST_NAME, s_n_printf_macro_expansion) {
char buf[BUFSIZ];
snprintf(BUF_AND_SIZE(buf), CONTENTS);
EXPECT_STREQ(CONTENTS, buf);
snprintf(BUF_AND_SIZE_AND_CONTENTS(buf));
EXPECT_STREQ(CONTENTS, buf);
sprintf(BUF_AND_CONTENTS(buf));
EXPECT_STREQ(CONTENTS, buf);
}