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.cecche...@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 <ke...@collabora.com> Tested-by: Jan Holesovsky <ke...@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/42811 Reviewed-by: Marco Cecchetti <mrcek...@gmail.com> Tested-by: Marco Cecchetti <mrcek...@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()) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits