unlink the extra tmp file generated
[c11tester.git] / snapshot.cc
index dab1a480d5910d84ed97ec2782e6fa73d7e50a85..d287319a5f0bda5f18438b2e8354e60ab755e4da 100644 (file)
@@ -14,6 +14,9 @@
 #include "context.h"
 #include "model.h"
 
+
+#if USE_MPROTECT_SNAPSHOT
+
 /** PageAlignedAdressUpdate return a page aligned address for the
  * address being added as a side effect the numBytes are also changed.
  */
@@ -22,8 +25,6 @@ static void * PageAlignAddressUpward(void *addr)
        return (void *)((((uintptr_t)addr) + PAGESIZE - 1) & ~(PAGESIZE - 1));
 }
 
-#if USE_MPROTECT_SNAPSHOT
-
 /* Each SnapShotRecord lists the firstbackingpage that must be written to
  * revert to that snapshot */
 struct SnapShotRecord {
@@ -277,20 +278,14 @@ struct fork_snapshotter {
         */
        volatile snapshot_id mIDToRollback;
 
-       /**
-        * @brief The context for the shared (non-snapshot) stack
-        *
-        * This context is passed between the various processes which represent
-        * various snapshot states. It should be used primarily for the
-        * "client-side" code, not the main snapshot loop.
-        */
-       ucontext_t shared_ctxt;
+
 
        /** @brief Inter-process tracking of the next snapshot ID */
        snapshot_id currSnapShotID;
 };
 
 static struct fork_snapshotter *fork_snap = NULL;
+ucontext_t shared_ctxt;
 
 /** @statics
  *   These variables are necessary because the stack is shared region and
@@ -381,7 +376,7 @@ static void fork_loop() {
        /* switch back here when takesnapshot is called */
        snapshotid = fork_snap->currSnapShotID;
        if (model->params.nofork) {
-               setcontext(&fork_snap->shared_ctxt);
+               setcontext(&shared_ctxt);
                _Exit(EXIT_SUCCESS);
        }
 
@@ -394,7 +389,7 @@ static void fork_loop() {
                modellock = 0;
 
                if (0 == forkedID) {
-                       setcontext(&fork_snap->shared_ctxt);
+                       setcontext(&shared_ctxt);
                } else {
                        DEBUG("parent PID: %d, child PID: %d, snapshot ID: %d\n",
                                                getpid(), forkedID, snapshotid);
@@ -407,16 +402,21 @@ static void fork_loop() {
                                }
                        }
 
-                       if (fork_snap->mIDToRollback != snapshotid)
+                       if (fork_snap->mIDToRollback != snapshotid) {
+                               char filename[256];
+                               snprintf_(filename, sizeof(filename), "C11FuzzerTmp%d", forkedID);
+                               unlink(filename);
+
                                _Exit(EXIT_SUCCESS);
+                       }
                }
        }
 }
 
 static void fork_startExecution(ucontext_t *context, VoidFuncPtr entryPoint) {
        /* setup an "exiting" context */
-       char stack[128];
-       create_context(&exit_ctxt, stack, sizeof(stack), fork_exit);
+       int exit_stack_size = 256;
+       create_context(&exit_ctxt, snapshot_calloc(exit_stack_size, 1), exit_stack_size, fork_exit);
 
        /* setup the system context */
        create_context(context, fork_snap->mStackBase, STACK_SIZE_DEFAULT, entryPoint);
@@ -425,7 +425,7 @@ static void fork_startExecution(ucontext_t *context, VoidFuncPtr entryPoint) {
 }
 
 static snapshot_id fork_take_snapshot() {
-       model_swapcontext(&fork_snap->shared_ctxt, &private_ctxt);
+       model_swapcontext(&shared_ctxt, &private_ctxt);
        DEBUG("TAKESNAPSHOT RETURN\n");
        return snapshotid;
 }
@@ -434,7 +434,7 @@ static void fork_roll_back(snapshot_id theID)
 {
        DEBUG("Rollback\n");
        fork_snap->mIDToRollback = theID;
-       model_swapcontext(&fork_snap->shared_ctxt, &exit_ctxt);
+       model_swapcontext(model->get_system_context(), &exit_ctxt);
        fork_snap->mIDToRollback = -1;
 }