git: 99275445a424 - stable/13 - sockets: fix setsockopt(SO_RCVTIMEO) on a listening socket
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 03 Aug 2022 23:29:03 UTC
The branch stable/13 has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=99275445a424f6ed2724ffefa8770d9faca1e71b commit 99275445a424f6ed2724ffefa8770d9faca1e71b Author: Gleb Smirnoff <glebius@FreeBSD.org> AuthorDate: 2022-08-03 23:28:38 +0000 Commit: Gleb Smirnoff <glebius@FreeBSD.org> CommitDate: 2022-08-03 23:28:38 +0000 sockets: fix setsockopt(SO_RCVTIMEO) on a listening socket (cherry-picked from commit c261510ef5fce9eaf4c30685c317c1f8ec415eda) --- sys/kern/uipc_socket.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 8f2122c98ef5..ce7279357fab 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -2996,7 +2996,7 @@ sosetopt(struct socket *so, struct sockopt *sopt) int error, optval; struct linger l; struct timeval tv; - sbintime_t val; + sbintime_t val, *valp; uint32_t val32; #ifdef MAC struct mac extmac; @@ -3135,14 +3135,14 @@ sosetopt(struct socket *so, struct sockopt *sopt) val = SBT_MAX; else val = tvtosbt(tv); - switch (sopt->sopt_name) { - case SO_SNDTIMEO: - so->so_snd.sb_timeo = val; - break; - case SO_RCVTIMEO: - so->so_rcv.sb_timeo = val; - break; - } + SOCK_LOCK(so); + valp = sopt->sopt_name == SO_SNDTIMEO ? + (SOLISTENING(so) ? &so->sol_sbsnd_timeo : + &so->so_snd.sb_timeo) : + (SOLISTENING(so) ? &so->sol_sbrcv_timeo : + &so->so_rcv.sb_timeo); + *valp = val; + SOCK_UNLOCK(so); break; case SO_LABEL: @@ -3324,8 +3324,13 @@ integer: case SO_SNDTIMEO: case SO_RCVTIMEO: + SOCK_LOCK(so); tv = sbttotv(sopt->sopt_name == SO_SNDTIMEO ? - so->so_snd.sb_timeo : so->so_rcv.sb_timeo); + (SOLISTENING(so) ? so->sol_sbsnd_timeo : + so->so_snd.sb_timeo) : + (SOLISTENING(so) ? so->sol_sbrcv_timeo : + so->so_rcv.sb_timeo)); + SOCK_UNLOCK(so); #ifdef COMPAT_FREEBSD32 if (SV_CURPROC_FLAG(SV_ILP32)) { struct timeval32 tv32;