datashadow_callbacks.c 2.54 KiB
/*
* Function pointer/data shadowing
*/
// #include <stdlib.h>
#define MAX_DIAGNOSTIC_SIZE 1024
// Has to match client side (fptr_shadow)
#define SHADOW_TERMINATE 1
#define SHADOW_CONTINUE 2
static void my_strcpy(char *dest, char *src)
{
if (!src) return;
while(*dest++ = *src++);
}
void fptr_shadow_define_64(int p_shadowIndex, void *p_shadowValue)
{
#ifdef DEBUG
char msg[MAX_DIAGNOSTIC_SIZE];
my_strcpy(msg, "DATASHADOW:DEFINE ");
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(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)
{
void *restored;
int count = 0;
#ifdef DEBUG
char msg[MAX_DIAGNOSTIC_SIZE];
my_strcpy(msg, "DATASHADOW: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, " check-shadowValue(loc): ");
itox(p_shadow, &msg[strlen(msg)]);
write(2, msg, strlen(msg));
my_strcpy(msg, " check-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: shadow: 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, "shadow value: 0x");
itox(*p_shadow, &msg[strlen(msg)]);
my_strcpy(&msg[strlen(msg)], " shadow idx: 0x");
itox(p_shadowIndex, &msg[strlen(msg)]);
my_strcpy(&msg[strlen(msg)], " : Warning: overwrite of function pointer or critical detected -- induce segfault\n");
write(2, msg, strlen(msg));
my_strcpy(0,""); // induce crash
}
break;
}
}
else
{
#ifdef DEBUG
my_strcpy(msg, "DATASHADOW: 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
}
}