summaryrefslogtreecommitdiff
path: root/regress/lib/libc/malloc
diff options
context:
space:
mode:
Diffstat (limited to 'regress/lib/libc/malloc')
-rw-r--r--regress/lib/libc/malloc/Makefile14
-rw-r--r--regress/lib/libc/malloc/malloc0test.c98
2 files changed, 112 insertions, 0 deletions
diff --git a/regress/lib/libc/malloc/Makefile b/regress/lib/libc/malloc/Makefile
new file mode 100644
index 00000000000..ca8fb323439
--- /dev/null
+++ b/regress/lib/libc/malloc/Makefile
@@ -0,0 +1,14 @@
+# $OpenBSD: Makefile,v 1.1 2001/12/05 09:52:01 deraadt Exp $
+# $NetBSD: Makefile,v 1.2 1995/04/20 22:40:13 cgd Exp $
+
+PROG= malloc0test
+NOMAN= noman, no way, man
+
+.PATH: ${.CURDIR}/../malloc
+
+install:
+
+regress: ${PROG}
+ ./${PROG}
+
+.include <bsd.prog.mk>
diff --git a/regress/lib/libc/malloc/malloc0test.c b/regress/lib/libc/malloc/malloc0test.c
new file mode 100644
index 00000000000..5ca698aa50b
--- /dev/null
+++ b/regress/lib/libc/malloc/malloc0test.c
@@ -0,0 +1,98 @@
+#include <sys/types.h>
+#include <sys/signal.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <setjmp.h>
+
+volatile sig_atomic_t got;
+jmp_buf jmp;
+
+void
+catch(int signo)
+{
+ got++;
+ longjmp(jmp, 0);
+}
+
+int
+test(caddr_t p, int size)
+{
+ signal(SIGSEGV, catch);
+ got = 0;
+ if (setjmp(jmp) == 0)
+ *p = 0;
+ if (setjmp(jmp) == 0)
+ *(p+size-1) = 0;
+ return (got);
+}
+
+char *prot_table[] = {
+ "unprotected",
+ "fuckup",
+ "protected"
+};
+
+#define SIZE 10
+
+/*
+ * Do random memory allocations.
+ *
+ * For each one, ensure that it is at least 16 bytes in size (that
+ * being what our current malloc returns for the minsize of an
+ * object, alignment wise);
+ *
+ * For zero-byte allocations, check that they are still aligned.
+ *
+ * For each object, ensure that they are correctly protected or not
+ * protected.
+ *
+ * Does not regress test malloc + free combinations ... it should.
+ */
+int
+main(int argc, char *argv[])
+{
+ caddr_t rblob = malloc(1);
+ caddr_t zblob = malloc(0);
+ caddr_t *blobp, blob;
+ int size, rsize, tsize;
+ int count = 0, prot;
+ int rval = 0, fuckup = 0;
+
+ while (1) {
+ size = arc4random() % SIZE;
+ blob = malloc(size);
+ if (blob == NULL) {
+ fprintf(stderr, "success: out of memory\n");
+ exit(rval);
+ }
+
+ if (size == 0) {
+ blobp = &zblob;
+ tsize = 16;
+ } else {
+ blobp = &rblob;
+ tsize = size;
+ }
+
+ rsize = blob - *blobp;
+ fuckup = SIZE < 16 && size >= rsize;
+ prot = test(blob, tsize);
+
+ if (size == 0 && rsize < 16)
+ fuckup = 1;
+ if (size == 0 && prot < 2)
+ fuckup = 1;
+
+ if (fuckup) {
+ printf("%8p %6d %6d %20s %10s\n", blob, size, rsize,
+ prot_table[prot], fuckup ? "fuckup" : "");
+ rval = 1;
+ }
+ *blobp = blob;
+
+
+ if (++count % 100000 == 0)
+ fprintf(stderr, "count = %d\n", count);
+ }
+} \ No newline at end of file