[llvm] r187208 - Extend the lifetime of the strings passed to posix_spawn_file_actions_addopen.
Hal Finkel
hfinkel at anl.gov
Fri Jul 26 13:31:45 PDT 2013
----- Original Message -----
> Author: rafael
> Date: Fri Jul 26 11:21:31 2013
> New Revision: 187208
>
> URL: http://llvm.org/viewvc/llvm-project?rev=187208&view=rev
> Log:
> Extend the lifetime of the strings passed to
> posix_spawn_file_actions_addopen.
>
> Thanks to Hal Finkel for finding the bug and for the initial patch.
>
> Modified:
> llvm/trunk/lib/Support/Unix/Program.inc
>
> Modified: llvm/trunk/lib/Support/Unix/Program.inc
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Program.inc?rev=187208&r1=187207&r2=187208&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Support/Unix/Program.inc (original)
> +++ llvm/trunk/lib/Support/Unix/Program.inc Fri Jul 26 11:21:31 2013
> @@ -122,19 +122,19 @@ static bool RedirectIO(const StringRef *
> }
>
> #ifdef HAVE_POSIX_SPAWN
> -static bool RedirectIO_PS(const StringRef *Path, int FD, std::string
> *ErrMsg,
> +static bool RedirectIO_PS(const std::string *Path, int FD,
> std::string *ErrMsg,
> posix_spawn_file_actions_t *FileActions) {
> if (Path == 0) // Noop
> return false;
> - std::string File;
> + const char *File;
> if (Path->empty())
> // Redirect empty paths to /dev/null
> File = "/dev/null";
> else
> - File = *Path;
> + File = Path->c_str();
>
> if (int Err = posix_spawn_file_actions_addopen(
> - FileActions, FD, File.c_str(),
> + FileActions, FD, File,
> FD == 0 ? O_RDONLY : O_WRONLY | O_CREAT, 0666))
> return MakeErrMsg(ErrMsg, "Cannot dup2", Err);
> return false;
> @@ -185,18 +185,32 @@ static bool Execute(void **Data, StringR
> posix_spawn_file_actions_t FileActionsStore;
> posix_spawn_file_actions_t *FileActions = 0;
>
> + // If we call posix_spawn_file_actions_addopen we have to make
> sure the
> + // c strings we pass to it stay alive until the call to
> posix_spaw,
Typo: posix_spaw (missing 'n').
Thanks again,
Hal
> + // so we copy any StringRefs into this variable.
> + std::string RedirectsStorage[3];
> +
> if (redirects) {
> + std::string *RedirectsStr[3] = {0, 0, 0};
> + for (int I = 0; I < 3; ++I) {
> + if (redirects[I]) {
> + RedirectsStorage[I] = *redirects[I];
> + RedirectsStr[I] = &RedirectsStorage[I];
> + }
> + }
> +
> FileActions = &FileActionsStore;
> posix_spawn_file_actions_init(FileActions);
>
> // Redirect stdin/stdout.
> - if (RedirectIO_PS(redirects[0], 0, ErrMsg, FileActions) ||
> - RedirectIO_PS(redirects[1], 1, ErrMsg, FileActions))
> + if (RedirectIO_PS(RedirectsStr[0], 0, ErrMsg, FileActions) ||
> + RedirectIO_PS(RedirectsStr[1], 1, ErrMsg, FileActions))
> return false;
> if (redirects[1] == 0 || redirects[2] == 0 ||
> *redirects[1] != *redirects[2]) {
> // Just redirect stderr
> - if (RedirectIO_PS(redirects[2], 2, ErrMsg, FileActions))
> return false;
> + if (RedirectIO_PS(RedirectsStr[2], 2, ErrMsg, FileActions))
> + return false;
> } else {
> // If stdout and stderr should go to the same place,
> redirect stderr
> // to the FD already open for stdout.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-commits
mailing list