Re: Extend the scope of socket lock in soo_stat()

2017-07-18 Thread Claudio Jeker
On Tue, Jul 18, 2017 at 08:42:51AM +0200, Martin Pieuchot wrote:
> `so_state' and `so_rcv' need to be checked atomically, so extend the
> scope of the lock.
> 
> ok?

OK claudio@
 
> Index: kern/sys_socket.c
> ===
> RCS file: /cvs/src/sys/kern/sys_socket.c,v
> retrieving revision 1.30
> diff -u -p -r1.30 sys_socket.c
> --- kern/sys_socket.c 22 Feb 2017 10:20:21 -  1.30
> +++ kern/sys_socket.c 18 Jul 2017 06:41:10 -
> @@ -180,14 +180,13 @@ soo_stat(struct file *fp, struct stat *u
>  
>   memset(ub, 0, sizeof (*ub));
>   ub->st_mode = S_IFSOCK;
> - if ((so->so_state & SS_CANTRCVMORE) == 0 ||
> - so->so_rcv.sb_cc != 0)
> + s = solock(so);
> + if ((so->so_state & SS_CANTRCVMORE) == 0 || so->so_rcv.sb_cc != 0)
>   ub->st_mode |= S_IRUSR | S_IRGRP | S_IROTH;
>   if ((so->so_state & SS_CANTSENDMORE) == 0)
>   ub->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH;
>   ub->st_uid = so->so_euid;
>   ub->st_gid = so->so_egid;
> - s = solock(so);
>   (void) ((*so->so_proto->pr_usrreq)(so, PRU_SENSE,
>   (struct mbuf *)ub, NULL, NULL, p));
>   sounlock(s);
> 

-- 
:wq Claudio



Re: Extend the scope of socket lock in soo_stat()

2017-07-18 Thread Alexander Bluhm
On Tue, Jul 18, 2017 at 08:42:51AM +0200, Martin Pieuchot wrote:
> `so_state' and `so_rcv' need to be checked atomically, so extend the
> scope of the lock.
> 
> ok?

OK bluhm@

> 
> Index: kern/sys_socket.c
> ===
> RCS file: /cvs/src/sys/kern/sys_socket.c,v
> retrieving revision 1.30
> diff -u -p -r1.30 sys_socket.c
> --- kern/sys_socket.c 22 Feb 2017 10:20:21 -  1.30
> +++ kern/sys_socket.c 18 Jul 2017 06:41:10 -
> @@ -180,14 +180,13 @@ soo_stat(struct file *fp, struct stat *u
>  
>   memset(ub, 0, sizeof (*ub));
>   ub->st_mode = S_IFSOCK;
> - if ((so->so_state & SS_CANTRCVMORE) == 0 ||
> - so->so_rcv.sb_cc != 0)
> + s = solock(so);
> + if ((so->so_state & SS_CANTRCVMORE) == 0 || so->so_rcv.sb_cc != 0)
>   ub->st_mode |= S_IRUSR | S_IRGRP | S_IROTH;
>   if ((so->so_state & SS_CANTSENDMORE) == 0)
>   ub->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH;
>   ub->st_uid = so->so_euid;
>   ub->st_gid = so->so_egid;
> - s = solock(so);
>   (void) ((*so->so_proto->pr_usrreq)(so, PRU_SENSE,
>   (struct mbuf *)ub, NULL, NULL, p));
>   sounlock(s);