summaryrefslogtreecommitdiff
path: root/libvtv/testsuite/libvtv.mempool.cc/mempool_negative.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libvtv/testsuite/libvtv.mempool.cc/mempool_negative.cc')
-rw-r--r--libvtv/testsuite/libvtv.mempool.cc/mempool_negative.cc193
1 files changed, 193 insertions, 0 deletions
diff --git a/libvtv/testsuite/libvtv.mempool.cc/mempool_negative.cc b/libvtv/testsuite/libvtv.mempool.cc/mempool_negative.cc
new file mode 100644
index 00000000000..2d5e1d0b531
--- /dev/null
+++ b/libvtv/testsuite/libvtv.mempool.cc/mempool_negative.cc
@@ -0,0 +1,193 @@
+#include <string.h>
+#include <assert.h>
+#include <signal.h>
+#include <stdio.h>
+#include <setjmp.h>
+
+#include "vtv_malloc.h"
+#include "../../../include/vtv-change-permission.h"
+
+volatile static int signal_count = 0;
+
+sigjmp_buf before_segv;
+
+unsigned int vtv_debug = 0;
+
+static void
+handler(int sig, siginfo_t *si, void *unused)
+{
+ signal_count++;
+ /* You are not supposed to longjmp out of a signal handler but it seems
+ to work for this test case and it simplifies it */
+ siglongjmp(before_segv, 1);
+}
+
+/* Try to modify the memory pointed by "s" but dont actually change the values.
+ Assumes and verifies the memory to be modified is mprotected */
+void mempoke(void * s, size_t n)
+{
+ volatile char * p = (char *)s;
+ int ret;
+
+ signal_count = 0;
+ ret = sigsetjmp(before_segv, 1);
+ if (ret == 0)
+ p[0] = p[0];
+
+ assert(ret == 1 && signal_count == 1);
+
+ ret = sigsetjmp(before_segv, 1);
+ if (ret == 0)
+ p[n - 1] = p[n - 1];
+
+ assert(ret == 1 && signal_count == 2);
+}
+
+int main()
+{
+ char * ptr;
+ int size;
+
+ /* Set up handler for SIGSEGV. */
+ struct sigaction sa;
+ sa.sa_flags = SA_SIGINFO;
+ sigemptyset(&sa.sa_mask);
+ sa.sa_sigaction = handler;
+ if (sigaction(SIGSEGV, &sa, NULL) == -1)
+ assert(0);
+
+ /* Make the 'bookkeeping' vars read-write. */
+ __VLTChangePermission (__VLTP_READ_WRITE);
+ __vtv_malloc_init();
+
+ size = 10;
+
+ /* Verify not writable after unprotect */
+ __vtv_malloc_unprotect();
+ ptr = (char *)__vtv_malloc(size);
+ memset(ptr, 'a', size);
+ __vtv_malloc_protect();
+ mempoke(ptr, size);
+ __vtv_free(ptr);
+
+ /* verify not-writable after protect, unprotect */
+ __vtv_malloc_unprotect();
+ ptr = (char *)__vtv_malloc(size);
+ memset(ptr, 'a', size);
+ __vtv_malloc_protect();
+ __vtv_malloc_unprotect();
+ memset(ptr, 'a', size);
+ assert(ptr[size - 1] == 'a');
+ __vtv_malloc_protect();
+ assert(ptr[size - 1] == 'a');
+ mempoke(ptr,size);
+ __vtv_free(ptr);
+
+ /* Allocate a bunch of small objects.
+ Make sure the alignment is correct.
+ Verify data has not been corrupted.
+ Make sure the data cannot modified */
+ {
+ int s;
+ for (s = 3; s < 28; s += 3)
+ {
+ size = s;
+ {
+ int i;
+ #define ITERS 1000
+ char * ptrs[ITERS];
+
+ __vtv_malloc_unprotect();
+ for (i = 0; i < ITERS; i++)
+ {
+ ptr = (char *)__vtv_malloc(size);
+ assert(((long)ptr & VTV_ALIGNMENT_MASK) == 0);
+ memset(ptr, (i & 127), size);
+ assert(ptr[size - 1] == (i & 127));
+ ptrs[i] = ptr;
+ }
+ __vtv_malloc_protect();
+
+ for (i = 0; i < ITERS; i++)
+ mempoke(ptrs[i], size);
+
+ __vtv_malloc_unprotect();
+ for (i = 0; i < ITERS; i++)
+ __vtv_free(ptrs[i]);
+ __vtv_malloc_protect();
+ }
+ }
+ }
+
+ /* Allocate a bunch of medium size objects.
+ Make sure the alignment is correct.
+ Verify data has not been corrupted.
+ Try to modify the data to verify everything gets unprotected */
+ {
+ int s;
+ for (s = 501; s < 2500; s += 91)
+ {
+ size = s;
+ {
+ int i;
+ #define ITERS2 100
+ char * ptrs[ITERS2];
+
+ __vtv_malloc_unprotect();
+ for (i = 0; i < ITERS2; i++)
+ {
+
+ ptr = (char *)__vtv_malloc(size);
+ assert(((long)ptr & VTV_ALIGNMENT_MASK) == 0);
+ memset(ptr, i & 127, size);
+ assert(ptr[size - 1] == i & 127);
+ ptrs[i] = ptr;
+ }
+ __vtv_malloc_protect();
+
+ for (i = 0; i < ITERS2; i++)
+ mempoke(ptrs[i], size);
+
+ __vtv_malloc_unprotect();
+ for (i = 0; i < ITERS2; i++)
+ __vtv_free(ptrs[i]);
+ __vtv_malloc_protect();
+ }
+ }
+ }
+
+ /* Allocate a bunch of medium size objects. Make sure the alignment is correct */
+ {
+ int s;
+ for (s = 3001; s < 15000; s += 307)
+ {
+ size = s;
+ {
+ int i;
+ #define ITERS3 50
+ char * ptrs[ITERS3];
+
+ __vtv_malloc_unprotect();
+ for (i = 0; i < ITERS3; i++)
+ {
+ ptr = (char *)__vtv_malloc(size);
+ assert(((long)ptr & VTV_ALIGNMENT_MASK) == 0);
+ memset(ptr, i & 127, size);
+ assert(ptr[size - 1] == i & 127);
+ ptrs[i] = ptr;
+ }
+ __vtv_malloc_protect();
+
+ for (i = 0; i < ITERS3; i++)
+ mempoke(ptrs[i], size);
+
+ __vtv_malloc_unprotect();
+ for (i = 0; i < ITERS3; i++)
+ __vtv_free(ptrs[i]);
+ __vtv_malloc_protect();
+ }
+ }
+ }
+
+ return 0;
+}