diff options
author | green <green@FreeBSD.org> | 1999-10-09 20:42:17 +0000 |
---|---|---|
committer | green <green@FreeBSD.org> | 1999-10-09 20:42:17 +0000 |
commit | f980526bf65a754175b095da7e9c65301bc51ef6 (patch) | |
tree | 3e1f62b2ad258cfb15a9dc0ab325b98c954bd344 /sys/kern/uipc_socket.c | |
parent | 6c88ce2eeea2b938c210bd64566a7712843f017f (diff) | |
download | FreeBSD-src-f980526bf65a754175b095da7e9c65301bc51ef6.zip FreeBSD-src-f980526bf65a754175b095da7e9c65301bc51ef6.tar.gz |
Implement RLIMIT_SBSIZE in the kernel. This is a per-uid sockbuf total
usage limit.
Diffstat (limited to 'sys/kern/uipc_socket.c')
-rw-r--r-- | sys/kern/uipc_socket.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 9719b79..3d15c27 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -158,6 +158,12 @@ sodealloc(so) { so->so_gencnt = ++so_gencnt; + if (so->so_rcv.sb_hiwat) + (void)chgsbsize(so->so_cred->cr_uid, + -(rlim_t)so->so_rcv.sb_hiwat); + if (so->so_snd.sb_hiwat) + (void)chgsbsize(so->so_cred->cr_uid, + -(rlim_t)so->so_snd.sb_hiwat); crfree(so->so_cred); zfreei(so->so_zone, so); } @@ -212,7 +218,7 @@ sofree(so) so->so_state &= ~SS_INCOMP; so->so_head = NULL; } - sbrelease(&so->so_snd); + sbrelease(&so->so_snd, so); sorflush(so); sodealloc(so); } @@ -922,7 +928,7 @@ sorflush(so) splx(s); if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose) (*pr->pr_domain->dom_dispose)(asb.sb_mb); - sbrelease(&asb); + sbrelease(&asb, so); } /* @@ -1030,8 +1036,8 @@ sosetopt(so, sopt) case SO_SNDBUF: case SO_RCVBUF: if (sbreserve(sopt->sopt_name == SO_SNDBUF ? - &so->so_snd : &so->so_rcv, - (u_long) optval) == 0) { + &so->so_snd : &so->so_rcv, (u_long)optval, + so, curproc) == 0) { error = ENOBUFS; goto bad; } |