Loading...
tests/printf.c /dev/null Libc-1506.40.4
--- /dev/null
+++ Libc/Libc-1506.40.4/tests/printf.c
@@ -0,0 +1,66 @@
+#include <sys/types.h>
+#include <sys/resource.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <time.h>
+#include <stdlib.h>
+#include <os/assumes.h>
+
+#include "darwintest.h"
+#include "darwintest_utils.h"
+
+static void crash_callback(const char *str) {
+	T_PASS("Crashed with \"%s\"", str);
+	T_END;
+}
+
+T_DECL(sprintf_percent_n, "Test of %n")
+{
+	char str[1024];
+	int len, ret;
+
+	char *fmt = "%010d%n";
+
+	T_EXPECT_POSIX_SUCCESS((ret = snprintf(str, sizeof(str), fmt, 0, &len)), NULL);
+	T_EXPECT_EQ(len, ret, NULL);
+
+	char fmt_buf[32];
+	strlcpy(fmt_buf, fmt, sizeof(fmt_buf));
+
+	os_set_crash_callback(crash_callback);
+	snprintf(str, sizeof(str), fmt_buf, 0, &len);
+	T_ASSERT_FAIL("Should have crashed on dynamic %%n");
+}
+
+#if !TARGET_OS_IPHONE
+#define STRSIZE (1024 * 1024 * 256)
+
+T_DECL(printf_PR_30663523, "Test for PR-30663523",
+		T_META_CHECK_LEAKS(NO))
+{
+	char *temp_path;
+	asprintf(&temp_path, "%s/%s", dt_tmpdir(), "big_file");
+
+	{
+		char *x = calloc(1, 0x80000001);
+		memset(x, 0x41, 0x80000001);
+
+		FILE *f = fopen(temp_path, "w");
+		int len = fprintf(f, "%s", x);
+		T_EXPECT_EQ(len, EOF, "fprintf should return EOF when string is longer than INT_MAX");
+		fclose(f);
+	}
+
+	{
+		char *x = calloc(1, STRSIZE);
+		memset(x, 0x41, STRSIZE - 1);
+
+		FILE *f = fopen(temp_path, "w");
+		int len = fprintf(f, "%s%s%s%s%s%s%s%s%s%s", x,x,x,x,x,x,x,x,x,x);
+		T_EXPECT_EQ(len, EOF, "fprintf should return EOF when output string is longer than INT_MAX");
+		fclose(f);
+	}
+}
+#endif // !TARGET_OS_IPHONE