Merge pull request #2895 from lantw44:wip/lantw/Avoid-using-environ-on-FreeBSD
PiperOrigin-RevId: 327799934
This commit is contained in:
		@@ -1225,21 +1225,9 @@ struct ExecDeathTestArgs {
 | 
				
			|||||||
  int close_fd;       // File descriptor to close; the read end of a pipe
 | 
					  int close_fd;       // File descriptor to close; the read end of a pipe
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#  if GTEST_OS_MAC
 | 
					#  if GTEST_OS_QNX
 | 
				
			||||||
inline char** GetEnviron() {
 | 
					 | 
				
			||||||
  // When Google Test is built as a framework on MacOS X, the environ variable
 | 
					 | 
				
			||||||
  // is unavailable. Apple's documentation (man environ) recommends using
 | 
					 | 
				
			||||||
  // _NSGetEnviron() instead.
 | 
					 | 
				
			||||||
  return *_NSGetEnviron();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#  else
 | 
					 | 
				
			||||||
// Some POSIX platforms expect you to declare environ. extern "C" makes
 | 
					 | 
				
			||||||
// it reside in the global namespace.
 | 
					 | 
				
			||||||
extern "C" char** environ;
 | 
					extern "C" char** environ;
 | 
				
			||||||
inline char** GetEnviron() { return environ; }
 | 
					#  else  // GTEST_OS_QNX
 | 
				
			||||||
#  endif  // GTEST_OS_MAC
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#  if !GTEST_OS_QNX
 | 
					 | 
				
			||||||
// The main function for a threadsafe-style death test child process.
 | 
					// The main function for a threadsafe-style death test child process.
 | 
				
			||||||
// This function is called in a clone()-ed process and thus must avoid
 | 
					// This function is called in a clone()-ed process and thus must avoid
 | 
				
			||||||
// any potentially unsafe operations like malloc or libc functions.
 | 
					// any potentially unsafe operations like malloc or libc functions.
 | 
				
			||||||
@@ -1259,18 +1247,18 @@ static int ExecDeathTestChildMain(void* child_arg) {
 | 
				
			|||||||
    return EXIT_FAILURE;
 | 
					    return EXIT_FAILURE;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // We can safely call execve() as it's a direct system call.  We
 | 
					  // We can safely call execv() as it's almost a direct system call. We
 | 
				
			||||||
  // cannot use execvp() as it's a libc function and thus potentially
 | 
					  // cannot use execvp() as it's a libc function and thus potentially
 | 
				
			||||||
  // unsafe.  Since execve() doesn't search the PATH, the user must
 | 
					  // unsafe.  Since execv() doesn't search the PATH, the user must
 | 
				
			||||||
  // invoke the test program via a valid path that contains at least
 | 
					  // invoke the test program via a valid path that contains at least
 | 
				
			||||||
  // one path separator.
 | 
					  // one path separator.
 | 
				
			||||||
  execve(args->argv[0], args->argv, GetEnviron());
 | 
					  execv(args->argv[0], args->argv);
 | 
				
			||||||
  DeathTestAbort(std::string("execve(") + args->argv[0] + ", ...) in " +
 | 
					  DeathTestAbort(std::string("execv(") + args->argv[0] + ", ...) in " +
 | 
				
			||||||
                 original_dir + " failed: " +
 | 
					                 original_dir + " failed: " +
 | 
				
			||||||
                 GetLastErrnoDescription());
 | 
					                 GetLastErrnoDescription());
 | 
				
			||||||
  return EXIT_FAILURE;
 | 
					  return EXIT_FAILURE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#  endif  // !GTEST_OS_QNX
 | 
					#  endif  // GTEST_OS_QNX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#  if GTEST_HAS_CLONE
 | 
					#  if GTEST_HAS_CLONE
 | 
				
			||||||
// Two utility routines that together determine the direction the stack
 | 
					// Two utility routines that together determine the direction the stack
 | 
				
			||||||
@@ -1344,8 +1332,7 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
 | 
				
			|||||||
                                        fd_flags | FD_CLOEXEC));
 | 
					                                        fd_flags | FD_CLOEXEC));
 | 
				
			||||||
  struct inheritance inherit = {0};
 | 
					  struct inheritance inherit = {0};
 | 
				
			||||||
  // spawn is a system call.
 | 
					  // spawn is a system call.
 | 
				
			||||||
  child_pid =
 | 
					  child_pid = spawn(args.argv[0], 0, nullptr, &inherit, args.argv, environ);
 | 
				
			||||||
      spawn(args.argv[0], 0, nullptr, &inherit, args.argv, GetEnviron());
 | 
					 | 
				
			||||||
  // Restores the current working directory.
 | 
					  // Restores the current working directory.
 | 
				
			||||||
  GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
 | 
					  GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
 | 
				
			||||||
  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
 | 
					  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user