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'. --- winsup/cygwin/fhandler_socket_local.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/fhandler_socket_local.cc b/winsup/cygwin/fhandler_socket_local.cc index c94bf828f..421b8bbdb 100644 --- a/winsup/cygwin/fhandler_socket_local.cc +++ b/winsup/cygwin/fhandler_socket_local.cc @@ -1430,7 +1430,8 @@ 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) + /* Temporary: Allow only '(int) 0' to be specified. */ + if (optlen < (socklen_t) sizeof (int) || 0 != *(int *) optval) set_errno (EINVAL); else ret = af_local_set_no_getpeereid (); -- 2.29.2 |
Hi Mark,
On Dec 6 22:28, 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'. > > --- > winsup/cygwin/fhandler_socket_local.cc | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/winsup/cygwin/fhandler_socket_local.cc b/winsup/cygwin/fhandler_socket_local.cc > index c94bf828f..421b8bbdb 100644 > --- a/winsup/cygwin/fhandler_socket_local.cc > +++ b/winsup/cygwin/fhandler_socket_local.cc > @@ -1430,7 +1430,8 @@ 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) > + /* Temporary: Allow only '(int) 0' to be specified. */ > + if (optlen < (socklen_t) sizeof (int) || 0 != *(int *) optval) > set_errno (EINVAL); That breaks existing callers calling setsockopt like this: setsockopt (fd, SOL_SOCKET, SO_PEERCRED, NULL, 0); This should stay backward-compatible. It should allow the above as well as your int usage, otherwise postfix will stop working. Also, please write either *(int *) optval != 0 or just !!*(int *) optval Thanks, Corinna |
Free forum by Nabble | Edit this page |