bpo-32331: Fix socket.type when SOCK_NONBLOCK is available (#4877)

This commit is contained in:
Yury Selivanov 2017-12-18 20:02:54 -05:00 committed by GitHub
parent 6efcb6d3d5
commit 9818142b1b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 87 additions and 24 deletions

View file

@ -582,12 +582,6 @@ internal_setblocking(PySocketSockObject *s, int block)
&& !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
int delay_flag, new_delay_flag;
#endif
#ifdef SOCK_NONBLOCK
if (block)
s->sock_type &= (~SOCK_NONBLOCK);
else
s->sock_type |= SOCK_NONBLOCK;
#endif
Py_BEGIN_ALLOW_THREADS
#ifndef MS_WINDOWS
@ -876,7 +870,22 @@ init_sockobject(PySocketSockObject *s,
{
s->sock_fd = fd;
s->sock_family = family;
s->sock_type = type;
/* It's possible to pass SOCK_NONBLOCK and SOCK_CLOEXEC bit flags
on some OSes as part of socket.type. We want to reset them here,
to make socket.type be set to the same value on all platforms.
Otherwise, simple code like 'if sock.type == SOCK_STREAM' is
not portable.
*/
#ifdef SOCK_NONBLOCK
s->sock_type = s->sock_type & ~SOCK_NONBLOCK;
#endif
#ifdef SOCK_CLOEXEC
s->sock_type = s->sock_type & ~SOCK_CLOEXEC;
#endif
s->sock_proto = proto;
s->errorhandler = &set_error;