extern "C" int execve (const char *filename, char *const argv[], char *const envp[]) { if (isPerformingCkptRestart()) { return _real_execve(filename, argv, envp); } JTRACE("execve() wrapper") (filename); /* Acquire the wrapperExeution lock to prevent checkpoint to happen while * processing this system call. */ WRAPPER_EXECUTION_GET_EXCL_LOCK(); dmtcp::vector<dmtcp::string> origUserEnv = copyUserEnv(envp); char *newFilename; char **newArgv; dmtcpPrepareForExec(filename, argv, &newFilename, &newArgv); dmtcp::vector<const char*> envVect = patchUserEnv(origUserEnv); int retVal = _real_execve (newFilename, newArgv, (char* const*)&envVect[0]); dmtcpProcessFailedExec(filename, newArgv); WRAPPER_EXECUTION_RELEASE_EXCL_LOCK(); return retVal; }
// Stop calls to outside executables. int execve(const char*filename, char *const argv[], char *const envp[]) { if (action==A_HALT) exit(0); if (has_run_access(filename)) { sb_log(4, "Allowing \"%s\" to be execve", filename); return _real_execve(filename, argv, envp); } sb_log(0, "Attempt to execve(%s).", filename); if (action==A_WARN) return 0; errno=EACCES; return -1; }