On Dec 7 02:29, Mark Geisert wrote: > The existing code errors as EINVAL any attempt to set a value for > SO_PEERCRED via setsockopt() on an AF_UNIX/AF_LOCAL socket. But to > enable the workaround set_no_getpeereid behavior for Python one has > to be able to set SO_PEERCRED to zero. Ergo, this patch. Python has > no way to specify a NULL pointer for 'optval'. > > This v2 of patch allows the original working (i.e., allow NULL,0 for > optval,optlen to mean turn off SO_PEERCRED) in addition to the new > working described above. The sense of the 'if' stmt is reversed for > readability. > > --- > winsup/cygwin/fhandler_socket_local.cc | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/winsup/cygwin/fhandler_socket_local.cc > b/winsup/cygwin/fhandler_socket_local.cc > index c94bf828f..964f3e819 100644 > --- a/winsup/cygwin/fhandler_socket_local.cc > +++ b/winsup/cygwin/fhandler_socket_local.cc > @@ -1430,10 +1430,14 @@ fhandler_socket_local::setsockopt (int level, int > optname, const void *optval, > FIXME: In the long run we should find a more generic solution > which doesn't require a blocking handshake in accept/connect > to exchange SO_PEERCRED credentials. */ > - if (optval || optlen) > - set_errno (EINVAL); > - else > + /* Temporary: Allow SO_PEERCRED to only be zeroed. Two ways to > + accomplish this: pass NULL,0 for optval,optlen; or pass the > + address,length of an '(int) 0' set up by the caller. */ > + if ((!optval && !optlen) || > + (optlen == (socklen_t) sizeof (int) && !*(int *) optval)) > ret = af_local_set_no_getpeereid (); > + else > + set_errno (EINVAL); > return ret; > > case SO_REUSEADDR: > -- > 2.29.2
Pushed Thanks, Corinna