X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Flinux%2Fprlimit.c;h=3df9ffba7af848c0b4fc0b231cbf2ca477b75166;hb=6aeb9c6703670649ee09b3c8575fb428168bb75c;hp=b9dbb4462ee8f17ee289e65e360238ce482b8834;hpb=b9bb8f67bbac9bab5314fb00974ad469476e936e;p=musl diff --git a/src/linux/prlimit.c b/src/linux/prlimit.c index b9dbb446..3df9ffba 100644 --- a/src/linux/prlimit.c +++ b/src/linux/prlimit.c @@ -1,8 +1,26 @@ -#include +#define _GNU_SOURCE #include #include "syscall.h" +#define FIX(x) do{ if ((x)>=SYSCALL_RLIM_INFINITY) (x)=RLIM_INFINITY; }while(0) + int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit) { - return syscall(SYS_prlimit64, pid, resource, new_limit, old_limit); + struct rlimit tmp; + int r; + if (new_limit && SYSCALL_RLIM_INFINITY != RLIM_INFINITY) { + tmp = *new_limit; + FIX(tmp.rlim_cur); + FIX(tmp.rlim_max); + new_limit = &tmp; + } + r = syscall(SYS_prlimit64, pid, resource, new_limit, old_limit); + if (!r && old_limit && SYSCALL_RLIM_INFINITY != RLIM_INFINITY) { + FIX(old_limit->rlim_cur); + FIX(old_limit->rlim_max); + } + return r; } + +#undef prlimit64 +weak_alias(prlimit, prlimit64);