Skip to content
Snippets Groups Projects
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
	}
}