When parsing sockaddr_un structures returned by accept(), etc., only examine bytes up to supplied addrlen and do not require null termination. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -963,18 +963,23 @@ makesockaddr(int sockfd, struct sockaddr #if defined(AF_UNIX) case AF_UNIX: { + Py_ssize_t len, splen; struct sockaddr_un *a = (struct sockaddr_un *) addr; + splen = addrlen - offsetof(struct sockaddr_un, sun_path); #ifdef linux - if (a->sun_path[0] == 0) { /* Linux abstract namespace */ - addrlen -= offsetof(struct sockaddr_un, sun_path); - return PyBytes_FromStringAndSize(a->sun_path, addrlen); + if (splen > 0 && a->sun_path[0] == 0) { + /* Linux abstract namespace */ + return PyBytes_FromStringAndSize(a->sun_path, splen); } else #endif /* linux */ { - /* regular NULL-terminated string */ - return PyUnicode_FromString(a->sun_path); + /* String, up to null terminator if present */ + for (len = 0; len < splen && a->sun_path[len] != 0; + len++) + ; } + return PyUnicode_FromStringAndSize(a->sun_path, len); } #endif /* AF_UNIX */