author | Szabolcs Nagy <nsz@port70.net> | 2014年05月30日 08:47:35 +0200 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2014年05月30日 03:09:26 -0400 |
commit | 8258014fd1e34e942a549c88c7e022a00445c352 (patch) | |
tree | 4e02c1ef57223e02a42194c435f9b566347d0cb1 /src/misc/setrlimit.c | |
parent | 106e65d6f6ba4d027e1fde1b1d2fabb92714da94 (diff) | |
download | musl-8258014fd1e34e942a549c88c7e022a00445c352.tar.gz |
-rw-r--r-- | src/misc/setrlimit.c | 12 |
diff --git a/src/misc/setrlimit.c b/src/misc/setrlimit.c index ddc13e98..8a1b8cc6 100644 --- a/src/misc/setrlimit.c +++ b/src/misc/setrlimit.c @@ -4,14 +4,22 @@ #include "libc.h" #define MIN(a, b) ((a)<(b) ? (a) : (b)) +#define FIX(x) do{ if ((x)>=SYSCALL_RLIM_INFINITY) (x)=RLIM_INFINITY; }while(0) int __setrlimit(int resource, const struct rlimit *rlim) { unsigned long k_rlim[2]; + struct rlimit tmp; + if (SYSCALL_RLIM_INFINITY != RLIM_INFINITY) { + tmp = *rlim; + FIX(tmp.rlim_cur); + FIX(tmp.rlim_max); + rlim = &tmp; + } int ret = __syscall(SYS_prlimit64, 0, resource, rlim, 0); if (ret != -ENOSYS) return ret; - k_rlim[0] = MIN(rlim->rlim_cur, -1UL); - k_rlim[1] = MIN(rlim->rlim_max, -1UL); + k_rlim[0] = MIN(rlim->rlim_cur, MIN(-1UL, SYSCALL_RLIM_INFINITY)); + k_rlim[1] = MIN(rlim->rlim_max, MIN(-1UL, SYSCALL_RLIM_INFINITY)); return __syscall(SYS_setrlimit, resource, k_rlim); } |