restrict-process-size.c revision c0bb6a113c3e5f6af18fbd1b53caa134d20481b8
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen/*
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen Copyright (c) 2002 Timo Sirainen
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen Permission is hereby granted, free of charge, to any person obtaining
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen a copy of this software and associated documentation files (the
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen "Software"), to deal in the Software without restriction, including
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen without limitation the rights to use, copy, modify, merge, publish,
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen distribute, sublicense, and/or sell copies of the Software, and to
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen permit persons to whom the Software is furnished to do so, subject to
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen the following conditions:
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen The above copyright notice and this permission notice shall be
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen included in all copies or substantial portions of the Software.
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen*/
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen#include "lib.h"
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen#include "restrict-process-size.h"
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen#include <unistd.h>
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen#include <sys/time.h>
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen#ifdef HAVE_SYS_RESOURCE_H
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen# include <sys/resource.h>
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen#endif
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen
dc4127f13f2d5cf44577471123ae70b7772b2e8cTimo Sirainenvoid restrict_process_size(unsigned int size __attr_unused__,
dc4127f13f2d5cf44577471123ae70b7772b2e8cTimo Sirainen unsigned int max_processes __attr_unused__)
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen{
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen#ifdef HAVE_SETRLIMIT
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen struct rlimit rlim;
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen
dc4127f13f2d5cf44577471123ae70b7772b2e8cTimo Sirainen#ifdef HAVE_RLIMIT_NPROC
c0bb6a113c3e5f6af18fbd1b53caa134d20481b8Timo Sirainen if (max_processes < INT_MAX) {
c0bb6a113c3e5f6af18fbd1b53caa134d20481b8Timo Sirainen rlim.rlim_max = rlim.rlim_cur = max_processes;
c0bb6a113c3e5f6af18fbd1b53caa134d20481b8Timo Sirainen if (setrlimit(RLIMIT_NPROC, &rlim) < 0)
c0bb6a113c3e5f6af18fbd1b53caa134d20481b8Timo Sirainen i_fatal("setrlimit(RLIMIT_NPROC, %u): %m", size);
c0bb6a113c3e5f6af18fbd1b53caa134d20481b8Timo Sirainen }
dc4127f13f2d5cf44577471123ae70b7772b2e8cTimo Sirainen#endif
dc4127f13f2d5cf44577471123ae70b7772b2e8cTimo Sirainen
c0bb6a113c3e5f6af18fbd1b53caa134d20481b8Timo Sirainen if (size > 0 && size < INT_MAX/1024/1024) {
c0bb6a113c3e5f6af18fbd1b53caa134d20481b8Timo Sirainen rlim.rlim_max = rlim.rlim_cur = size*1024*1024;
e9d0f2284f3a82b9852e52787866cba6b9adbcb6Timo Sirainen
c0bb6a113c3e5f6af18fbd1b53caa134d20481b8Timo Sirainen if (setrlimit(RLIMIT_DATA, &rlim) < 0)
c0bb6a113c3e5f6af18fbd1b53caa134d20481b8Timo Sirainen i_fatal("setrlimit(RLIMIT_DATA, %u): %m", size);
e9d0f2284f3a82b9852e52787866cba6b9adbcb6Timo Sirainen
e9d0f2284f3a82b9852e52787866cba6b9adbcb6Timo Sirainen#ifdef HAVE_RLIMIT_AS
c0bb6a113c3e5f6af18fbd1b53caa134d20481b8Timo Sirainen if (setrlimit(RLIMIT_AS, &rlim) < 0)
c0bb6a113c3e5f6af18fbd1b53caa134d20481b8Timo Sirainen i_fatal("setrlimit(RLIMIT_AS, %u): %m", size);
e9d0f2284f3a82b9852e52787866cba6b9adbcb6Timo Sirainen#endif
c0bb6a113c3e5f6af18fbd1b53caa134d20481b8Timo Sirainen }
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen#else
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen if (size != 0) {
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen i_warning("Can't restrict process size: "
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen "setrlimit() not supported by system. "
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen "Set the limit to 0 to hide this warning.");
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen }
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen#endif
cfbab67e839000b57f32308dd26f9807b5dbe8e3Timo Sirainen}