From cc3abe9bedf66fa45a442053be9f28bb6c3d713d Mon Sep 17 00:00:00 2001
From: an7s <an7s@git.zephyr-software.com>
Date: Mon, 1 May 2017 22:10:51 +0000
Subject: [PATCH] Simplified shadow callbacks

---
 datashadow/datashadow_callbacks.c | 89 +++----------------------------
 1 file changed, 7 insertions(+), 82 deletions(-)

diff --git a/datashadow/datashadow_callbacks.c b/datashadow/datashadow_callbacks.c
index 858d777..4636c74 100644
--- a/datashadow/datashadow_callbacks.c
+++ b/datashadow/datashadow_callbacks.c
@@ -4,23 +4,6 @@
 
 #include <stdlib.h>
 
-#ifdef STRATA
-#include "all.h"
-#include "../insn.h"
-
-// possible policies expressed as strings passed on the strata command line
-#define DETECTOR_POLICY_EXIT_STRING         "exit"
-#define DETECTOR_POLICY_CONTINUE_STRING     "continue"
-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); 
-
-#endif
-
 //
 // When writing a callback handler/detector
 //
@@ -31,21 +14,6 @@ __attribute__ ((externally_visible)) __attribute((used)) void fptr_shadow_check_
 
 #define MAX_DIAGNOSTIC_SIZE 1024
 
-/*
-typedef struct
-{
-        int edi;
-        int esi;
-        int ebp;
-        int esp_dummy;
-        int ebx;
-        int edx;
-        int ecx; 
-        int eax;
-        int flags;
-} reg_values_t;
-*/
-
 /*  the registers are saved onto the stack in this order */
 typedef struct reg_values reg_values_t;
 struct reg_values
@@ -69,21 +37,6 @@ struct reg_values
     size_t rsp;
 };
 
-#ifdef STRATA
-// leave this function so that the linker includes this file
-void data_shadow_init()
-{
-}
-
-static void getDiagnostics(char *p_diagnostic, int p_shadowIndex, void* p_shadow, char *p_msg) 
-{
-        strata_sprintf(p_msg, "diagnosis:%s shadowid:%d shadowval:0x%p",
-                p_diagnostic,
-                p_shadowIndex,
-                p_shadow);
-}
-#endif
-
 static void my_strcpy(char *dest, char *src)
 {
 	if (!src) return;
@@ -95,25 +48,22 @@ static void my_strcpy(char *dest, char *src)
 // 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, void *p_instrumented, int p_shadowIndex, void *p_shadowValue) 
+void fptr_shadow_define_64(int p_shadowIndex, void *p_shadowValue) 
 {
 	char msg[MAX_DIAGNOSTIC_SIZE];
 
 	add_shadow_entry(p_shadowIndex, p_shadowValue);		
 
-#ifdef STRATA
-	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
 #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: ");
@@ -122,67 +72,42 @@ void fptr_shadow_define_64(void *p_retAddress, void *p_instrumented, int p_shado
 	write(2, msg, strlen(msg));
 #endif
 
-#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, void *p_instrumented, int p_shadowIndex, void **p_shadow)
+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 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
-
-#ifdef DEBUG
 	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: ");
+	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
-
-#endif
 
 	int success = check_shadow_value(p_shadowIndex, *p_shadow, &restored, &count);
 	if (!success) {
 		// oh oh, need to restore
-#ifdef STRATA
-		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, "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
 	}
 	else
 	{
-#ifdef STRATA
-		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
 #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));
-#endif
 #endif
 	}
 }
-- 
GitLab