From f8bfdf662fc3e7647d3129c24300f92f0c6ac24f Mon Sep 17 00:00:00 2001
From: an7s <an7s@git.zephyr-software.com>
Date: Sun, 28 Feb 2016 17:16:32 +0000
Subject: [PATCH] Print out debug info

---
 datashadow/datashadow_callbacks.c | 77 +++++++++++++++++++++++++------
 1 file changed, 63 insertions(+), 14 deletions(-)

diff --git a/datashadow/datashadow_callbacks.c b/datashadow/datashadow_callbacks.c
index dd5c1b7..a744b5b 100644
--- a/datashadow/datashadow_callbacks.c
+++ b/datashadow/datashadow_callbacks.c
@@ -1,8 +1,9 @@
 /*
- * Function pointer shadowing
+ * Function pointer/data shadowing
  */
 
 #include <stdlib.h>
+
 #ifdef STRATA
 #include "all.h"
 #include "../insn.h"
@@ -15,7 +16,6 @@ static char strata_detector_policy_str[128]; // "exit" or "continue"
 // specifies policy when detector triggers
 static int strata_detector_policy = P_CONTROLLED_EXIT; 
 
-
 __attribute__ ((externally_visible)) __attribute((used)) void fptr_shadow_define_64(void *p_retAddress, reg_values_t *p_rv, void *p_instrumented, int p_shadowIndex, void *p_shadowValue);
 __attribute__ ((externally_visible)) __attribute((used)) void fptr_shadow_check_64(void *p_retAddress, reg_values_t *p_rv, void *p_instrumented, int p_shadowIndex, void **p_shadowValue); 
 
@@ -84,54 +84,103 @@ static void getDiagnostics(char *p_diagnostic, int p_shadowIndex, void* p_shadow
 }
 #endif
 
+static void my_strcpy(char *dest, char *src)
+{
+	if (!src) return;
+	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(void *p_retAddress, reg_values_t *p_rv, void *p_instrumented, int p_shadowIndex, void *p_shadowValue) 
+void fptr_shadow_define_64(void *p_retAddress, void *p_instrumented, int p_shadowIndex, void *p_shadowValue) 
 {
-#ifdef STRATA
 	char msg[MAX_DIAGNOSTIC_SIZE];
-#endif
 
 	add_shadow_entry(p_shadowIndex, p_shadowValue);		
 
 #ifdef STRATA
-	strata_sprintf(msg,"FPTRSHADOW:DEFINE shadowid[%d] shadowvalue[0x%p]", p_shadowIndex, p_shadowValue);
+	strata_sprintf(msg,"FPTRSHADOW:DEFINE shadowid[%d] shadowvalue[0x%p]\n", p_shadowIndex, p_shadowValue);
 
 	detected_error(CWE_NONE, CWE_NONE, E_FPTR_OVERWRITE, msg, D_BUFFER, P_CONTINUE_EXECUTION);
+#else
+	// @todo: print first and last element of p_rv and see what we get
+	// verify against pushed values in the transform
+	my_strcpy(msg, "FPTRSHADOW:DEFINE "); 
+	my_strcpy(&msg[strlen(msg)], " retaddress: ");
+	itox(p_retAddress, &msg[strlen(msg)]);
+/*
+	my_strcpy(&msg[strlen(msg)], " reg_values: ");
+	itox(p_rv, &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: ");
+	itox(p_shadowValue, &msg[strlen(msg)]);
+	my_strcpy(&msg[strlen(msg)], " \n");
+	write(1, msg, strlen(msg));
 #endif
 }
 
 // check to make sure values match
-void fptr_shadow_check_64(void *p_retAddress, reg_values_t *p_rv, void *p_instrumented, int p_shadowIndex, void **p_shadow)
+//void fptr_shadow_check_64(void *p_retAddress, reg_values_t *p_rv, void *p_instrumented, int p_shadowIndex, void **p_shadow)
+void fptr_shadow_check_64(void *p_retAddress, void *p_instrumented, int p_shadowIndex, void **p_shadow)
 {
-#ifdef STRATA
 	char msg[MAX_DIAGNOSTIC_SIZE];
-#endif
 	void *restored;
 	int count = 0;
 
-/*
-	sprintf(msg, "FPTRCHECK:ENTER shadowid[%d] value[0x%p]", p_shadowIndex, *p_shadow);
+#ifdef STRATA
+	strata_sprintf(msg, "FPTRSHADOW:CHECK shadowid[%d] value[0x%p]\n", p_shadowIndex, *p_shadow);
 	detected_error(CWE_NONE, CWE_NONE, E_FPTR_OVERWRITE, msg, D_BUFFER, P_CONTINUE_EXECUTION);
-*/
+#else
+	my_strcpy(msg, "FPTRSHADOW:CHECK: ");
+	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)], "  shadowValue: ");
+	itox(*p_shadow, &msg[strlen(msg)]);
+	my_strcpy(&msg[strlen(msg)], " \n");
+	write(1, msg, strlen(msg));
+#endif
 
 	int success = check_shadow_value(p_shadowIndex, *p_shadow, &restored, &count);
 	if (!success) {
 		// oh oh, need to restore
 #ifdef STRATA
-		strata_sprintf(msg,"FPTRCHECK:RESTORE shadowid[%d] value[0x%p] restored[0x%p] #[%d]", p_shadowIndex, *p_shadow, restored, count);
+		strata_sprintf(msg,"FPTRSHADOW:CHECK shadowid[%d] value[0x%p] restored[0x%p] #[%d]", p_shadowIndex, *p_shadow, restored, count);
 #endif
 		*p_shadow = restored; 
 #ifdef STRATA
 		detected_error(CWE_NONE, CWE_NONE, E_FPTR_OVERWRITE, msg, D_BUFFER, P_CONTINUE_EXECUTION);
+#else
+		my_strcpy(msg, "FPTRSHADOW:CHECK failed: ");
+		my_strcpy(&msg[strlen(msg)], " value saved: ");
+		itox(restored, &msg[strlen(msg)]);
+		my_strcpy(&msg[strlen(msg)], " restoredValue(copy out): ");
+		itox(*p_shadow, &msg[strlen(msg)]);
+		my_strcpy(&msg[strlen(msg)], " \n");
+		write(1, msg, strlen(msg));
 #endif
 	}
 	else
 	{
 #ifdef STRATA
-		strata_sprintf(msg,"FPTRCHECK:OK shadowid[%d] value[0x%p] shadow[0x%p] #[%d]", p_shadowIndex, *p_shadow, restored, count);
+		strata_sprintf(msg,"FPTRSHADOW:OK shadowid[%d] value[0x%p] shadow[0x%p] #[%d]", p_shadowIndex, *p_shadow, restored, count);
 		detected_error(CWE_NONE, CWE_NONE, E_FPTR_OVERWRITE, msg, D_BUFFER, P_CONTINUE_EXECUTION);
+#else
+	my_strcpy(msg, "FPTRSHADOW: OK: ");
+	my_strcpy(&msg[strlen(msg)], " shadowValue: ");
+	itox(*p_shadow, &msg[strlen(msg)]);
+	my_strcpy(&msg[strlen(msg)], " \n");
+	write(1, msg, strlen(msg));
 #endif
 	}
 }
-- 
GitLab