svn commit: r320652 - head/sys/kern

Hans Petter Selasky hselasky at FreeBSD.org
Tue Jul 4 18:23:19 UTC 2017


Author: hselasky
Date: Tue Jul  4 18:23:17 2017
New Revision: 320652
URL: https://svnweb.freebsd.org/changeset/base/320652

Log:
  After r319722 two fields were left uninitialized when transforming a
  socket structure into a listening socket. This resulted in an invalid
  instruction fault for all 32-bit platforms.
  
  When INVARIANTS is set the union where the two uninitialized fields
  reside gets properly zeroed. This patch ensures the two uninitialized
  fields are zeroed when INVARIANTS is undefined.
  
  For 64-bit platforms this issue was not visible because so->sol_upcall
  which is uninitialized overlaps with so->so_rcv.sb_state which is
  already zero during soalloc();
  
  For 32-bit platforms this issue was visible and resulted in an invalid
  instruction fault, because so->sol_upcall overlaps with
  so->so_rcv.sb_sel which is always initialized to a valid data pointer
  during soalloc().
  
  Verifying the offset locations mentioned above are identical is left
  as an exercise to the reader.
  
  PR: 220452
  PR: 220358
  Reviewed by:	ae (network), gallatin
  Differential Revision:	https://reviews.freebsd.org/D11475
  Sponsored by:	Mellanox Technologies

Modified:
  head/sys/kern/uipc_socket.c

Modified: head/sys/kern/uipc_socket.c
==============================================================================
--- head/sys/kern/uipc_socket.c	Tue Jul  4 18:07:09 2017	(r320651)
+++ head/sys/kern/uipc_socket.c	Tue Jul  4 18:23:17 2017	(r320652)
@@ -858,6 +858,9 @@ solisten_proto(struct socket *so, int backlog)
 	so->sol_accept_filter_arg = NULL;
 	so->sol_accept_filter_str = NULL;
 
+	so->sol_upcall = NULL;
+	so->sol_upcallarg = NULL;
+
 	so->so_options |= SO_ACCEPTCONN;
 
 listening:


More information about the svn-src-head mailing list