On Sun, Dec 11, 2022 at 07:55:44PM -0700, Theo de Raadt wrote: > The problem you have introduced is that so_state is copied from sockets > to a sysctl record, where it also shows up as so_state. > > At least fstat(8) looks at this field, and uses the old SS_CANTSENDMORE > bit you have deleted. The userland-visible name change is an API break. > Furthermore you moved it, but your new so_snd.sb_state value is not > exported in sysctl, and if we add this to sysctl it will be quite a big > ABI break. I suspect that is too expensive. > > So what you need to here is leave the SS_* bits with their existing names. > You cannot change their names. It is exported API. You cannot change their > bit values either, it is exported ABI in sysctl. > > What you can do is optionally use some bits in the socket, some bits in > so_snd, and some bits in so_rcv (I assume that is the future). And then > in kern_sysctl.c around line 1187 you can merge the bits, since they are > still unique: > > kf->so_state = so->so_state | so->so_snd.sb_state | so->so_rcv.sb_state > > This will mean fstat can see all the bits in the one sysctl sub-variable. > > It means you must go very quickly rename, or you should consider backing > your commit out and trying again fresh. >
`sb_state' will contain some new bits so I guess it's better to restote old SS_CANTSENDMORE and set it if SBS_CANTSENDMORE is set: Index: sys/kern/kern_sysctl.c =================================================================== RCS file: /cvs/src/sys/kern/kern_sysctl.c,v retrieving revision 1.408 diff -u -p -r1.408 kern_sysctl.c --- sys/kern/kern_sysctl.c 7 Nov 2022 14:25:44 -0000 1.408 +++ sys/kern/kern_sysctl.c 12 Dec 2022 07:31:26 -0000 @@ -1185,6 +1185,8 @@ fill_file(struct kinfo_file *kf, struct kf->so_type = so->so_type; kf->so_state = so->so_state; + if (so->so_rcv.sb_state & SBS_CANTSENDMORE) + kf->so_state |= SS_CANTSENDMORE; if (show_pointers) kf->so_pcb = PTRTOINT64(so->so_pcb); else Index: sys/sys/socketvar.h =================================================================== RCS file: /cvs/src/sys/sys/socketvar.h,v retrieving revision 1.113 diff -u -p -r1.113 socketvar.h --- sys/sys/socketvar.h 11 Dec 2022 21:19:08 -0000 1.113 +++ sys/sys/socketvar.h 12 Dec 2022 07:31:26 -0000 @@ -149,6 +149,7 @@ struct socket { #define SS_ISCONNECTED 0x002 /* socket connected to a peer */ #define SS_ISCONNECTING 0x004 /* in process of connecting to peer */ #define SS_ISDISCONNECTING 0x008 /* in process of disconnecting */ +#define SS_CANTSENDMORE 0x010 /* can't send more data to peer */ #define SS_CANTRCVMORE 0x020 /* can't receive more data from peer */ #define SS_RCVATMARK 0x040 /* at mark on input */ #define SS_ISDISCONNECTED 0x800 /* socket disconnected from peer */