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 */