[Libreoffice-commits] online.git: common/Seccomp.cpp kit/Kit.cpp loolwsd.xml.in wsd/Admin.cpp wsd/AdminModel.hpp wsd/LOOLWSD.cpp

Marco Cecchetti marco.cecchetti at collabora.com
Tue Sep 26 15:40:50 UTC 2017


 common/Seccomp.cpp |   19 ++++++++++++++++++-
 kit/Kit.cpp        |    7 ++++++-
 loolwsd.xml.in     |    1 +
 wsd/Admin.cpp      |    8 ++++++--
 wsd/AdminModel.hpp |    1 +
 wsd/LOOLWSD.cpp    |    3 +++
 6 files changed, 35 insertions(+), 4 deletions(-)

New commits:
commit ee6e64528d0707c2e4612aa233cbf1fa3415fec8
Author: Marco Cecchetti <marco.cecchetti at collabora.com>
Date:   Tue Sep 26 13:15:11 2017 +0200

    wsd: support for FSIZE and NOFILE system limits
    
    The routine for handling the configuration for the max file size
    limit, was wrongly using NOFILE. Now we handle both limits correctly.
    
    Change-Id: Ie8b63617286f66af6d4eb1b35b9e4f4b28f3c2a6
    Reviewed-on: https://gerrit.libreoffice.org/42803
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>
    Tested-by: Jan Holesovsky <kendy at collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/42811
    Reviewed-by: Marco Cecchetti <mrcekets at gmail.com>
    Tested-by: Marco Cecchetti <mrcekets at gmail.com>

diff --git a/common/Seccomp.cpp b/common/Seccomp.cpp
index cf3793e7..169f2959 100644
--- a/common/Seccomp.cpp
+++ b/common/Seccomp.cpp
@@ -273,11 +273,28 @@ bool handleSetrlimitCommand(const std::vector<std::string>& tokens)
                 lim = RLIM_INFINITY;
 
             rlimit rlim = { lim, lim };
+            if (setrlimit(RLIMIT_FSIZE, &rlim) != 0)
+                LOG_SYS("Failed to set RLIMIT_NOFILE to " << lim << " bytes.");
+
+            if (getrlimit(RLIMIT_FSIZE, &rlim) == 0)
+                LOG_INF("RLIMIT_FSIZE is " << rlim.rlim_max << " bytes after setting it to " << lim << " bytes.");
+            else
+                LOG_SYS("Failed to get RLIMIT_FSIZE.");
+
+            return true;
+        }
+        else if (tokens[1] == "limit_num_open_files")
+        {
+            rlim_t lim = std::stoi(tokens[2]);
+            if (lim <= 0)
+                lim = RLIM_INFINITY;
+
+            rlimit rlim = { lim, lim };
             if (setrlimit(RLIMIT_NOFILE, &rlim) != 0)
                 LOG_SYS("Failed to set RLIMIT_NOFILE to " << lim << " bytes.");
 
             if (getrlimit(RLIMIT_NOFILE, &rlim) == 0)
-                LOG_INF("RLIMIT_NOFILE is " << rlim.rlim_max << " bytes after setting it to " << lim << " bytes.");
+                LOG_INF("RLIMIT_NOFILE is " << rlim.rlim_max << " files after setting it to " << lim << " files.");
             else
                 LOG_SYS("Failed to get RLIMIT_NOFILE.");
 
diff --git a/kit/Kit.cpp b/kit/Kit.cpp
index 1d1e700d..f1b2860b 100644
--- a/kit/Kit.cpp
+++ b/kit/Kit.cpp
@@ -2027,8 +2027,13 @@ void lokit_main(const std::string& childRoot,
         else
             LOG_SYS("Failed to get RLIMIT_STACK.");
 
+        if (getrlimit(RLIMIT_FSIZE, &rlim) == 0)
+            LOG_INF("RLIMIT_FSIZE is " << rlim.rlim_max << " bytes.");
+        else
+            LOG_SYS("Failed to get RLIMIT_FSIZE.");
+
         if (getrlimit(RLIMIT_NOFILE, &rlim) == 0)
-            LOG_INF("RLIMIT_NOFILE is " << rlim.rlim_max << " bytes.");
+            LOG_INF("RLIMIT_NOFILE is " << rlim.rlim_max << " files.");
         else
             LOG_SYS("Failed to get RLIMIT_NOFILE.");
 
diff --git a/loolwsd.xml.in b/loolwsd.xml.in
index 5097d9ac..940c8567 100644
--- a/loolwsd.xml.in
+++ b/loolwsd.xml.in
@@ -23,6 +23,7 @@
         <limit_data_mem_kb desc="The maximum memory data segment allowed to each document process. 0 for unlimited." type="uint">0</limit_data_mem_kb>
         <limit_stack_mem_kb desc="The maximum stack size allowed to each document process. 0 for unlimited." type="uint">8000</limit_stack_mem_kb>
         <limit_file_size_mb desc="The maximum file size allowed to each documen process to write. 0 for unlimited." type="uint">50</limit_file_size_mb>
+        <limit_num_open_files desc="The maximum number of files allowed to each documen process to open. 0 for unlimited." type="uint">1024</limit_num_open_files>
     </per_document>
 
     <per_view desc="View-specific settings.">
diff --git a/wsd/Admin.cpp b/wsd/Admin.cpp
index 206062cb..6b520684 100644
--- a/wsd/Admin.cpp
+++ b/wsd/Admin.cpp
@@ -182,7 +182,8 @@ void AdminSocketHandler::handleMessage(bool /* fin */, WSOpCode /* code */,
         const DocProcSettings& docProcSettings = _admin->getDefDocProcSettings();
         oss << "limit_virt_mem_mb=" << docProcSettings.LimitVirtMemMb << ' '
             << "limit_stack_mem_kb=" << docProcSettings.LimitStackMemKb << ' '
-            << "limit_file_size_mb=" << docProcSettings.LimitFileSizeMb << ' ';
+            << "limit_file_size_mb=" << docProcSettings.LimitFileSizeMb << ' '
+            << "limit_num_open_files=" << docProcSettings.LimitNumberOpenFiles << ' ';
 
         sendTextFrame(oss.str());
     }
@@ -252,6 +253,8 @@ void AdminSocketHandler::handleMessage(bool /* fin */, WSOpCode /* code */,
                     docProcSettings.LimitStackMemKb = settingVal;
                 else if (settingName == "limit_file_size_mb")
                     docProcSettings.LimitFileSizeMb = settingVal;
+                else if (settingName == "limit_num_open_files")
+                    docProcSettings.LimitNumberOpenFiles = settingVal;
                 else
                     LOG_ERR("Unknown limit: " << settingName);
 
@@ -538,7 +541,8 @@ void Admin::notifyForkit()
     std::ostringstream oss;
     oss << "setconfig limit_virt_mem_mb " << _defDocProcSettings.LimitVirtMemMb << '\n'
         << "setconfig limit_stack_mem_kb " << _defDocProcSettings.LimitStackMemKb << '\n'
-        << "setconfig limit_file_size_mb " << _defDocProcSettings.LimitFileSizeMb << '\n';
+        << "setconfig limit_file_size_mb " << _defDocProcSettings.LimitFileSizeMb << '\n'
+        << "setconfig limit_num_open_files " << _defDocProcSettings.LimitNumberOpenFiles << '\n';
 
     if (_forKitWritePipe != -1)
         IoUtil::writeToPipe(_forKitWritePipe, oss.str());
diff --git a/wsd/AdminModel.hpp b/wsd/AdminModel.hpp
index d56bdb70..4799ec4a 100644
--- a/wsd/AdminModel.hpp
+++ b/wsd/AdminModel.hpp
@@ -52,6 +52,7 @@ struct DocProcSettings
     size_t LimitDataMemKb;
     size_t LimitStackMemKb;
     size_t LimitFileSizeMb;
+    size_t LimitNumberOpenFiles;
 };
 
 /// Containing basic information about document
diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index 1c4088b8..377e890f 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -638,6 +638,7 @@ void LOOLWSD::initialize(Application& self)
             { "per_document.limit_virt_mem_mb", "0" },
             { "per_document.limit_stack_mem_kb", "8000" },
             { "per_document.limit_file_size_mb", "50" },
+            { "per_document.limit_num_open_files", "1024" },
             { "per_view.out_of_focus_timeout_secs", "60" },
             { "per_view.idle_timeout_secs", "900" },
             { "loleaflet_html", "loleaflet.html" },
@@ -821,6 +822,7 @@ void LOOLWSD::initialize(Application& self)
     docProcSettings.LimitVirtMemMb = getConfigValue<int>("per_document.limit_virt_mem_mb", 0);
     docProcSettings.LimitStackMemKb = getConfigValue<int>("per_document.limit_stack_mem_kb", 0);
     docProcSettings.LimitFileSizeMb = getConfigValue<int>("per_document.limit_file_size_mb", 0);
+    docProcSettings.LimitNumberOpenFiles = getConfigValue<int>("per_document.limit_num_open_files", 0);
     Admin::instance().setDefDocProcSettings(docProcSettings, false);
 
 #if ENABLE_DEBUG
@@ -1212,6 +1214,7 @@ bool LOOLWSD::createForKit()
     ossRLimits << "limit_virt_mem_mb:" << docProcSettings.LimitVirtMemMb;
     ossRLimits << ";limit_stack_mem_kb:" << docProcSettings.LimitStackMemKb;
     ossRLimits << ";limit_file_size_mb:" << docProcSettings.LimitFileSizeMb;
+    ossRLimits << ";limit_num_open_files:" << docProcSettings.LimitNumberOpenFiles;
     args.push_back("--rlimits=" + ossRLimits.str());
 
     if (UnitWSD::get().hasKitHooks())


More information about the Libreoffice-commits mailing list