X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Flinux%2Fprlimit.c;h=3df9ffba7af848c0b4fc0b231cbf2ca477b75166;hb=4554f155dd23a65fcdfd39f1d5af8af55ba37694;hp=d1639ccaf1c0cbeb742e7d214ee9f6e256d48335;hpb=571744447c23f91feb6439948f3a619aca850dfb;p=musl diff --git a/src/linux/prlimit.c b/src/linux/prlimit.c index d1639cca..3df9ffba 100644 --- a/src/linux/prlimit.c +++ b/src/linux/prlimit.c @@ -1,12 +1,26 @@ #define _GNU_SOURCE #include #include "syscall.h" -#include "libc.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 -LFS64(prlimit); +weak_alias(prlimit, prlimit64);