diff -r 6e66319e7ad8 Modules/socketmodule.c --- a/Modules/socketmodule.c Wed Sep 14 23:53:47 2016 -0700 +++ b/Modules/socketmodule.c Fri Sep 16 10:36:14 2016 +0200 @@ -4683,6 +4683,10 @@ else #endif { + struct sockaddr sa; + socklen_t slen; + int tmp; + fd = PyLong_AsSocket_t(fdobj); if (fd == (SOCKET_T)(-1) && PyErr_Occurred()) return -1; @@ -4691,6 +4695,25 @@ "can't use invalid socket value"); return -1; } + /* Get family, type and proto from fd. Ignores all errors and + * keeps the arguments that have been passed in by the user. + */ + slen = sizeof(sa); + if (getsockname(fd, &sa, &slen) == 0) { + family = sa.sa_family; + } +#ifdef SO_TYPE + slen = sizeof(tmp); + if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &tmp, &slen) == 0) { + type = tmp; + } +#endif +#ifdef SO_PROTOCOL + slen = sizeof(tmp); + if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL, &tmp, &slen) == 0) { + proto = tmp; + } +#endif } } else {