IQA-463: Make LLProcess call apr_procattr_inherit_set() extension.
On Windows, Bad Things happen when apr_proc_create() is allowed to pass TRUE to CreateProcess(bInheritHandles). For instance, the open handle for a new installer executable file being downloaded by the background updater gets inadvertently passed to a couple slplugin.exe instances. When the viewer finishes downloading, closes the file and tries to remove it, Windows balks because the file is still open by another process. Require an apr_suite package that includes the new Linden apr_procattr_inherit_set() extension, and call it to turn off CreateProcess(bInheritHandles).master
parent
54228ddf50
commit
38e23bb0eb
|
|
@ -90,9 +90,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>02eb2d32f4013e23eb0bc2cd1b7f9b82</string>
|
||||
<string>1ac038723ed702a5ad0db924dfe0fe1b</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-apr/rev/251231/arch/Darwin/installer/apr_suite-1.4.5-darwin-20120314.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-apr/rev/254105/arch/Darwin/installer/apr_suite-1.4.5-darwin-20120418.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin</string>
|
||||
|
|
@ -102,9 +102,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>4ade1434e263cbb85a424e7dd35b8025</string>
|
||||
<string>c60ace3d6c593d95247bd58496d7c557</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-apr/rev/251231/arch/Linux/installer/apr_suite-1.4.5-linux-20120314.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-apr/rev/254105/arch/Linux/installer/apr_suite-1.4.5-linux-20120418.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux</string>
|
||||
|
|
@ -114,9 +114,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>6a2f05e8ddf01036aada46377295887f</string>
|
||||
<string>d353e31abcefb554379abdec0ac41ff3</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-apr/rev/251231/arch/CYGWIN/installer/apr_suite-1.4.5-windows-20120314.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-apr/rev/254105/arch/CYGWIN/installer/apr_suite-1.4.5-windows-20120418.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
|
|||
|
|
@ -535,6 +535,24 @@ LLProcess::LLProcess(const LLSDOrParams& params):
|
|||
apr_procattr_t *procattr = NULL;
|
||||
chkapr(apr_procattr_create(&procattr, gAPRPoolp));
|
||||
|
||||
#if ! defined(APR_HAS_PROCATTR_INHERIT_SET)
|
||||
// Our special preprocessor symbol isn't even defined -- wrong APR
|
||||
LL_WARNS("LLProcess") << "This version of APR lacks Linden apr_procattr_inherit_set() extension" << LL_ENDL;
|
||||
#elif ! APR_HAS_PROCATTR_INHERIT_SET
|
||||
// Symbol is defined, but to 0: expect apr_procattr_inherit_set() to
|
||||
// return APR_ENOTIMPL.
|
||||
LL_DEBUGS("LLProcess") << "apr_procattr_inherit_set() not supported on this platform" << LL_ENDL;
|
||||
#else // APR_HAS_PROCATTR_INHERIT_SET nonzero
|
||||
// As of 2012-04-17, the original Windows implementation of
|
||||
// apr_proc_create() unconditionally passes TRUE for bInheritHandles. That
|
||||
// seems to assume that all files are opened by APR so you can
|
||||
// individually control whether each is inherited by a child process. But
|
||||
// we've been burned by having surprising open file handles inherited by
|
||||
// our child processes. Turn that OFF for us!
|
||||
LL_DEBUGS("LLProcess") << "Setting apr_procattr_inherit_set(0)" << LL_ENDL;
|
||||
ll_apr_warn_status(apr_procattr_inherit_set(procattr, 0));
|
||||
#endif
|
||||
|
||||
// For which of stdin, stdout, stderr should we create a pipe to the
|
||||
// child? In the viewer, there are only a couple viable
|
||||
// apr_procattr_io_set() alternatives: inherit the viewer's own stdxxx
|
||||
|
|
@ -607,17 +625,14 @@ LLProcess::LLProcess(const LLSDOrParams& params):
|
|||
|
||||
if (params.autokill)
|
||||
{
|
||||
#if defined(APR_HAS_PROCATTR_AUTOKILL_SET)
|
||||
apr_status_t ok = apr_procattr_autokill_set(procattr, 1);
|
||||
# if LL_WINDOWS
|
||||
// As of 2012-02-02, we only expect this to be implemented on Windows.
|
||||
// Avoid spamming the log with warnings we fully expect.
|
||||
ll_apr_warn_status(ok);
|
||||
#else // ! LL_WINDOWS
|
||||
(void)ok; // suppress 'unused' warning
|
||||
# endif // ! LL_WINDOWS
|
||||
#else
|
||||
#if ! defined(APR_HAS_PROCATTR_AUTOKILL_SET)
|
||||
// Our special preprocessor symbol isn't even defined -- wrong APR
|
||||
LL_WARNS("LLProcess") << "This version of APR lacks Linden apr_procattr_autokill_set() extension" << LL_ENDL;
|
||||
#elif ! APR_HAS_PROCATTR_AUTOKILL_SET
|
||||
// Symbol is defined, but to 0: expect apr_procattr_autokill_set() to
|
||||
// return APR_ENOTIMPL.
|
||||
#else // APR_HAS_PROCATTR_AUTOKILL_SET nonzero
|
||||
ll_apr_warn_status(apr_procattr_autokill_set(procattr, 1));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue