On 11/12/17(Mon) 08:55, Martin Pieuchot wrote:
> Diff below shuffle the socket buffer definition to "properly" memset()
> all required fields in sorflush().  It also gets rid of the sbrelease()
> abstraction since zeroing out `sb_hiwat' and `sb_mbmax' is required in
> only one place.

Simpler diff that just do the zeroing, anyone?

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