summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_socket.c
diff options
context:
space:
mode:
authorgreen <green@FreeBSD.org>1999-10-09 20:42:17 +0000
committergreen <green@FreeBSD.org>1999-10-09 20:42:17 +0000
commitf980526bf65a754175b095da7e9c65301bc51ef6 (patch)
tree3e1f62b2ad258cfb15a9dc0ab325b98c954bd344 /sys/kern/uipc_socket.c
parent6c88ce2eeea2b938c210bd64566a7712843f017f (diff)
downloadFreeBSD-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.c14
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;
}
OpenPOWER on IntegriCloud