On Wed, Dec 27, 2017 at 04:58:07PM +0100, Martin Pieuchot wrote:
> Simpler diff that just do the zeroing, anyone?

OK bluhm@

> Index: kern/uipc_socket.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_socket.c,v
> retrieving revision 1.212
> diff -u -p -r1.212 uipc_socket.c
> --- kern/uipc_socket.c        19 Dec 2017 09:29:37 -0000      1.212
> +++ kern/uipc_socket.c        27 Dec 2017 15:08:58 -0000
> @@ -1052,12 +1052,8 @@ sorflush(struct socket *so)
>       sbunlock(so, sb);
>       aso.so_proto = pr;
>       aso.so_rcv = *sb;
> -     memset(sb, 0, sizeof (*sb));
> -     /* XXX - the memset stomps all over so_rcv */
> -     if (aso.so_rcv.sb_flagsintr & SB_KNOTE) {
> -             sb->sb_sel.si_note = aso.so_rcv.sb_sel.si_note;
> -             sb->sb_flagsintr = SB_KNOTE;
> -     }
> +     memset(&sb->sb_startzero, 0,
> +          (caddr_t)&sb->sb_endzero - (caddr_t)&sb->sb_startzero);
>       if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose)
>               (*pr->pr_domain->dom_dispose)(aso.so_rcv.sb_mb);
>       sbrelease(&aso, &aso.so_rcv);
> Index: sys/socketvar.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/socketvar.h,v
> retrieving revision 1.80
> diff -u -p -r1.80 socketvar.h
> --- sys/socketvar.h   18 Dec 2017 10:07:55 -0000      1.80
> +++ sys/socketvar.h   27 Dec 2017 15:07:10 -0000
> @@ -98,6 +98,8 @@ struct socket {
>   * Variables for socket buffering.
>   */
>       struct  sockbuf {
> +/* The following fields are all zeroed on flush. */
> +#define      sb_startzero    sb_cc
>               u_long  sb_cc;          /* actual chars in buffer */
>               u_long  sb_datacc;      /* data only chars in buffer */
>               u_long  sb_hiwat;       /* max actual char count */
> @@ -109,10 +111,12 @@ struct socket {
>               struct mbuf *sb_mbtail; /* the last mbuf in the chain */
>               struct mbuf *sb_lastrecord;/* first mbuf of last record in
>                                             socket buffer */
> -             struct  selinfo sb_sel; /* process selecting read/write */
> -             int     sb_flagsintr;   /* flags, changed during interrupt */
> -             short   sb_flags;       /* flags, see below */
>               u_short sb_timeo;       /* timeout for read/write */
> +             short   sb_flags;       /* flags, see below */
> +/* End area that is zeroed on flush. */
> +#define      sb_endzero      sb_flags
> +             int     sb_flagsintr;   /* flags, changed atomically */
> +             struct  selinfo sb_sel; /* process selecting read/write */
>       } so_rcv, so_snd;
>  #define      SB_MAX          (2*1024*1024)   /* default for max chars in 
> sockbuf */
>  #define      SB_LOCK         0x01            /* lock on data queue */

Reply via email to