From 2bd036232c246693f7cbd47d1a43d8e91a9bed79 Mon Sep 17 00:00:00 2001
From: an7s <an7s@git.zephyr-software.com>
Date: Tue, 2 May 2017 01:09:02 +0000
Subject: [PATCH] cleanup debug

---
 configure_for_datashadow          |  4 +-
 datashadow/datashadow_callbacks.c | 90 +++++++++++++------------------
 2 files changed, 40 insertions(+), 54 deletions(-)

diff --git a/configure_for_datashadow b/configure_for_datashadow
index 7d3d1ab..6bc959f 100755
--- a/configure_for_datashadow
+++ b/configure_for_datashadow
@@ -1,3 +1,5 @@
 #!/bin/bash
 
-./configure --enable-debugging --enable-datashadow --enable-libc --prefix=$ZIPR_INSTALL $*
+#./configure --enable-debugging --enable-datashadow --enable-libc --prefix=$ZIPR_INSTALL $*
+./configure --enable-datashadow --enable-libc --prefix=$ZIPR_INSTALL $*
+
diff --git a/datashadow/datashadow_callbacks.c b/datashadow/datashadow_callbacks.c
index 4636c74..d745c73 100644
--- a/datashadow/datashadow_callbacks.c
+++ b/datashadow/datashadow_callbacks.c
@@ -2,40 +2,13 @@
  * Function pointer/data shadowing
  */
 
-#include <stdlib.h>
-
-//
-// When writing a callback handler/detector
-//
-// argument #1   :  return address
-// argument #2   :  register data structure
-// argument #3..#6:  optional set of args specific to the callback handler 
-//
+// #include <stdlib.h>
 
 #define MAX_DIAGNOSTIC_SIZE 1024
 
-/*  the registers are saved onto the stack in this order */
-typedef struct reg_values reg_values_t;
-struct reg_values
-{
-    size_t flags;
-    size_t r15;
-    size_t r14;
-    size_t r13;
-    size_t r12;
-    size_t r11;
-    size_t r10;
-    size_t r9;
-    size_t r8;
-    size_t rax;
-    size_t rbx;
-    size_t rcx;
-    size_t rdx;
-    size_t rsi;
-    size_t rdi;
-    size_t rbp;
-    size_t rsp;
-};
+// Has to match client side (fptr_shadow)
+#define SHADOW_TERMINATE 1
+#define SHADOW_CONTINUE 2
 
 static void my_strcpy(char *dest, char *src)
 {
@@ -43,27 +16,12 @@ static void my_strcpy(char *dest, char *src)
 	while(*dest++ = *src++); 
 }
 
-
-// void signedness_detector_signed(void *p_retAddress, reg_values_t *p_rv, void* p_addressTruncated, volatile long int p_policy)
-// shadowMap[p_shadowIndex] = p_shadowValue
-// add to multi-valued table
-//void fptr_shadow_define_64(void *p_retAddress, reg_values_t *p_rv, void *p_instrumented, int p_shadowIndex, void *p_shadowValue) 
 void fptr_shadow_define_64(int p_shadowIndex, void *p_shadowValue) 
 {
+#ifdef DEBUG
 	char msg[MAX_DIAGNOSTIC_SIZE];
 
-	add_shadow_entry(p_shadowIndex, p_shadowValue);		
-
-	// @todo: print first and last element of p_rv and see what we get
-	// verify against pushed values in the transform
-#ifdef DEBUG
 	my_strcpy(msg, "FPTRSHADOW:DEFINE "); 
-/*
-	my_strcpy(&msg[strlen(msg)], " retaddress: ");
-	itox(p_retAddress, &msg[strlen(msg)]);
-	my_strcpy(&msg[strlen(msg)], " instrumented: ");
-	itox(p_instrumented, &msg[strlen(msg)]);
-*/
 	my_strcpy(&msg[strlen(msg)], "  shadowid: ");
 	itox(p_shadowIndex, &msg[strlen(msg)]);
 	my_strcpy(&msg[strlen(msg)], "  value: ");
@@ -72,42 +30,68 @@ void fptr_shadow_define_64(int p_shadowIndex, void *p_shadowValue)
 	write(2, msg, strlen(msg));
 #endif
 
+	add_shadow_entry(p_shadowIndex, p_shadowValue);		
 }
 
 // check to make sure values match
 void fptr_shadow_check_64(int p_shadowIndex, int p_policy, void **p_shadow)
 {
-	char msg[MAX_DIAGNOSTIC_SIZE];
 	void *restored;
 	int count = 0;
 
+#ifdef DEBUG
+	char msg[MAX_DIAGNOSTIC_SIZE];
 	my_strcpy(msg, "FPTRSHADOW:CHECK: ");
 	my_strcpy(&msg[strlen(msg)], "  shadowid: ");
 	itox(p_shadowIndex, &msg[strlen(msg)]);
+	my_strcpy(&msg[strlen(msg)], "  policy: ");
+	itox(p_policy, &msg[strlen(msg)]);
+	write(2, msg, strlen(msg));
+
+	my_strcpy(msg, "  shadowValue(loc): ");
+	itox(p_shadow, &msg[strlen(msg)]);
 	write(2, msg, strlen(msg));
 
 	my_strcpy(msg, "  shadowValue: ");
 	itox(*p_shadow, &msg[strlen(msg)]);
 	my_strcpy(&msg[strlen(msg)], " \n");
 	write(2, msg, strlen(msg));
+#endif
 
 	int success = check_shadow_value(p_shadowIndex, *p_shadow, &restored, &count);
 	if (!success) {
 		// oh oh, need to restore
 		*p_shadow = restored; 
+
+		switch (p_policy) {
+			case SHADOW_CONTINUE:
+#ifdef DEBUG
 		my_strcpy(msg, "Warning: overwrite of function pointer detected -- restoring saved value: 0x");
 		itox(*p_shadow, &msg[strlen(msg)]);
 		my_strcpy(&msg[strlen(msg)], " \n");
 		write(2, msg, strlen(msg));
+#endif
+				break;
+			case SHADOW_TERMINATE:
+			default:
+				{
+				char msg[MAX_DIAGNOSTIC_SIZE];
+				my_strcpy(msg, "Warning: overwrite of function pointer detected -- induce segfault\n");
+				write(2, msg, strlen(msg));
+				my_strcpy(0,""); // induce crash
+				}
+				
+				break;
+		}
 	}
 	else
 	{
 #ifdef DEBUG
-	my_strcpy(msg, "FPTRSHADOW: OK: ");
-	my_strcpy(&msg[strlen(msg)], " shadowValue: ");
-	itox(*p_shadow, &msg[strlen(msg)]);
-	my_strcpy(&msg[strlen(msg)], " \n");
-	write(2, msg, strlen(msg));
+		my_strcpy(msg, "FPTRSHADOW: OK: ");
+		my_strcpy(&msg[strlen(msg)], " shadowValue: ");
+		itox(*p_shadow, &msg[strlen(msg)]);
+		my_strcpy(&msg[strlen(msg)], " \n");
+		write(2, msg, strlen(msg));
 #endif
 	}
 }
-- 
GitLab