summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2012-06-18 13:00:08 +0200
committerStephan Bergmann <sbergman@redhat.com>2012-06-18 13:11:11 +0200
commit942d0591be15d3886efd3c68bb2a5eefb2ed82ef (patch)
tree2521529929dab9720ff559de2cb8888431eebc41
parenta756aff8c6f7964784d5c09e70f192013be7ca7b (diff)
fdo#50603: Close fds across a restart of soffice on Mac OS X
...where the restart is directly from the old soffice instance, via exec, so the restarted soffice would inherit all open fds from the old one. The easiest approach appears to close fds upon startup. Change-Id: I89bb1c78f3adf2da1cd3cbd58c22df276133a883 (cherry picked from commit d5e9c2e3e85a2bcdd6a0b2088253fc133e52e831)
-rw-r--r--sal/osl/unx/salinit.cxx32
1 files changed, 32 insertions, 0 deletions
diff --git a/sal/osl/unx/salinit.cxx b/sal/osl/unx/salinit.cxx
index bc9fc221f7e9..2396388aafff 100644
--- a/sal/osl/unx/salinit.cxx
+++ b/sal/osl/unx/salinit.cxx
@@ -28,12 +28,44 @@
#include "sal/config.h"
+#if defined MACOSX
+#include <cassert>
+#include <limits>
+#include <unistd.h>
+#endif
+
#include "osl/process.h"
#include "sal/types.h"
extern "C" {
SAL_DLLPUBLIC void SAL_CALL sal_detail_initialize(int argc, char ** argv) {
+#if defined MACOSX
+ // On Mac OS X, soffice can restart itself via exec (see restartOnMac in
+ // desktop/source/app/app.cxx), which leaves all file descriptors open,
+ // which in turn can have unwanted effects (see
+ // <https://bugs.freedesktop.org/show_bug.cgi?id=50603> "Unable to update
+ // LibreOffice without resetting user profile"). But closing fds in
+ // restartOnMac before calling exec does not work, as additional threads
+ // might still be running then, wich can still use those fds and cause
+ // crashes. Therefore, the simples solution is to close fds at process
+ // start (as early as possible, so that no other threads have been created
+ // yet that might already have opened some fds); this is done for all kinds
+ // of processes here, not just soffice, but hopefully none of our processes
+ // rely on being spawned with certain fds already open. Unfortunately, Mac
+ // OS X appears to have no better interface to close all fds (like
+ // closefrom):
+ long openMax = sysconf(_SC_OPEN_MAX);
+ if (openMax == -1) {
+ // Some random value, but hopefully sysconf never returns -1 anyway:
+ openMax = 1024;
+ }
+ assert(openMax >= 0 && openMax <= std::numeric_limits< int >::max());
+ for (int fd = 3; fd < openMax; ++fd) {
+ close(fd);
+ }
+#endif
+
osl_setCommandArgs(argc, argv);
}