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;