#include "efence.h"
#include <setjmp.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/*
 * Electric Fence confidence tests.
 * Make sure all of the various functions of Electric Fence work correctly.
 */

#ifndef PAGE_PROTECTION_VIOLATED_SIGNAL
#define PAGE_PROTECTION_VIOLATED_SIGNAL SIGSEGV
#endif

struct diagnostic {
	int (*test)(void);
	int expectedStatus;
	const char *explanation;
};

extern int EF_PROTECT_BELOW;
extern int EF_ALIGNMENT;

static sigjmp_buf env;

/*
 * There is still too little standardization of the arguments and return
 * type of signal handler functions.
 */
static void segmentationFaultHandler(int signalNumber
#if (defined(_AIX))
                                     ,
                                     ...
#endif
                                     )
{
	signal(PAGE_PROTECTION_VIOLATED_SIGNAL, SIG_DFL);
	siglongjmp(env, 1);
}

static int gotSegmentationFault(int (*test)(void))
{
	if (sigsetjmp(env, 1) == 0) {
		int status;

		signal(PAGE_PROTECTION_VIOLATED_SIGNAL,
		       segmentationFaultHandler); status = (*test)();
		signal(PAGE_PROTECTION_VIOLATED_SIGNAL, SIG_DFL);
		return status;
	} else
		return 1;
}

static char *allocation;
/* c is global so that assignments to it won't be optimized out. */
char c;

static int testSizes(void)
{
	/*
	 * If ef_number can't hold all of the bits of a void *, have the user
	 * add -DUSE_ LONG_LONG to the compiler flags so that ef_number will be
	 * declared as "unsigned long long" instead of "unsigned long".
	 */
	return (sizeof(ef_number) < sizeof(void *));
}

static int allocateMemory(void)
{
	allocation = (char *)malloc(1);

	if (allocation != 0)
		return 0;
	else
		return 1;
}

static int freeMemory(void)
{
	free(allocation);
	return 0;
}

static int protectBelow(void)
{
	EF_PROTECT_BELOW = 1;
	return 0;
}

static int read0(void)
{
	c = *allocation;

	return 0;
}

static int write0(void)
{
	*allocation = 1;

	return 0;
}

static int read1(void)
{
	c = allocation[1];

	return 0;
}

static int readMinus1(void)
{
	c = allocation[-1];
	return 0;
}

static struct diagnostic diagnostics[] = {
    {testSizes, 0,
     "Please add -DLONG_LONG to the compiler flags and recompile."},
    {allocateMemory, 0,
     "Allocation 1: This test allocates a single byte of memory."},
    {read0, 0, "Read valid memory 1: This test reads the allocated memory."},
    {write0, 0, "Write valid memory 1: This test writes the allocated memory."},
    {read1, 1, "Read overrun: This test reads beyond the end of the buffer."},
    {freeMemory, 0, "Free memory: This test frees the allocated memory."},
    {protectBelow, 0,
     "Protect below: This sets Electric Fence to protect\n"
     "the lower boundary of a malloc buffer, rather than the\n"
     "upper boundary."},
    {allocateMemory, 0,
     "Allocation 2: This allocates memory with the lower boundary"
     " protected."},
    {read0, 0, "Read valid memory 2: This test reads the allocated memory."},
    {write0, 0, "Write valid memory 2: This test writes the allocated memory."},
    {readMinus1, 1,
     "Read underrun: This test reads before the beginning of the"
     " buffer."},
    {0, 0, 0}};

static const char failedTest[] = "Electric Fence confidence test failed.\n";

static const char newline = '\n';

int main(int argc, char **argv)
{
	static const struct diagnostic *diag = diagnostics;

	EF_PROTECT_BELOW = 0;
	EF_ALIGNMENT = 0;

	while (diag->explanation != 0) {
		int status = gotSegmentationFault(diag->test);

		if (status != diag->expectedStatus) {
			/*
			 * Don't use stdio to print here, because stdio
			 * uses malloc() and we've just proven that malloc()
			 * is broken. Also, use _exit() instead of exit(),
			 * because _exit() doesn't flush stdio.
			 */
			write(2, failedTest, sizeof(failedTest) - 1);
			write(2, diag->explanation, strlen(diag->explanation));
			write(2, &newline, 1);
			_exit(-1);
		}
		diag++;
	}
	return 0;
}
