From cd83b5b613a0559bf9c83dc970a8446bf1164e95 Mon Sep 17 00:00:00 2001 From: JoYo Date: Wed, 13 Jan 2016 18:32:51 -0500 Subject: [PATCH] SIGSEGV recovery? and drand48 for RNG --- pic-linux.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/pic-linux.c b/pic-linux.c index 0e16098..ca46f5a 100644 --- a/pic-linux.c +++ b/pic-linux.c @@ -10,11 +10,15 @@ #include #include #include +#include +#include #pragma comment(lib, "openssl/sha.lib") #define SHA_SUM_LENGTH (SHA_DIGEST_LENGTH + SHA_DIGEST_LENGTH + 1) +jmp_buf jmpBuf; + void picProto(void *picAddr, size_t picSize, void *clonePtr, char *checksum) { void (*cloneFunc)(void *, size_t, char *) = clonePtr; cloneFunc(picAddr, picSize, checksum); @@ -24,10 +28,13 @@ void picProto(void *picAddr, size_t picSize, void *clonePtr, char *checksum) { void clone(void *picAddr, size_t picSize, char *checksum) { auto retVal = EX_SOFTWARE; - srand(time(NULL)); + struct drand48_data drand_data; + srand48_r(time(NULL), &drand_data); + long int randVal; + lrand48_r(&drand_data, &randVal); - unsigned int picOffset = (rand() % (picSize + 1)); - unsigned char picFlip = ((char *)picAddr)[picOffset] & (rand() % 2); + unsigned int picOffset = (randVal % (picSize + 1)); + unsigned char picFlip = ((char *)picAddr)[picOffset] & (randVal % 2); printf("%x\t%x\n", picOffset, picFlip); @@ -60,6 +67,16 @@ CLONE_CLEANUP: return; } +void magic_handler(int sig) { + + switch (sig) { + + case SIGSEGV: + longjmp(jmpBuf, 1); + break; + } +} + int main(int argc, const char **argv) { auto retVal = EX_SOFTWARE; char fileInPath[SHA_SUM_LENGTH]; @@ -105,7 +122,14 @@ int main(int argc, const char **argv) { void (*cloneFunc)(void *, size_t, char *) = clone; void (*picFunc)(void *, size_t, void *, char *) = picBuffer; - picFunc(picBuffer, picStat.st_size, cloneFunc, checksum); + signal(SIGSEGV, magic_handler); + + if (!setjmp(jmpBuf)) { + picFunc(picBuffer, picStat.st_size, cloneFunc, checksum); + } else { + retVal = errno; + goto MAIN_CLEANUP; + } strncpy(fileInPath, checksum, SHA_SUM_LENGTH);