mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
bpo-36842: Implement PEP 578 (GH-12613)
Adds sys.audit, sys.addaudithook, io.open_code, and associated C APIs.
This commit is contained in:
parent
e788057a91
commit
b82e17e626
70 changed files with 3565 additions and 1816 deletions
|
@ -3053,6 +3053,11 @@ sock_bind(PySocketSockObject *s, PyObject *addro)
|
|||
if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "bind")) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (PySys_Audit("socket.bind", "OO", s, addro) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
|
||||
Py_END_ALLOW_THREADS
|
||||
|
@ -3219,6 +3224,10 @@ sock_connect(PySocketSockObject *s, PyObject *addro)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
|
||||
if (res < 0)
|
||||
return NULL;
|
||||
|
@ -3246,6 +3255,10 @@ sock_connect_ex(PySocketSockObject *s, PyObject *addro)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
|
||||
if (res < 0)
|
||||
return NULL;
|
||||
|
@ -4248,6 +4261,10 @@ sock_sendto(PySocketSockObject *s, PyObject *args)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (PySys_Audit("socket.sendto", "OO", s, addro) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ctx.buf = pbuf.buf;
|
||||
ctx.len = pbuf.len;
|
||||
ctx.flags = flags;
|
||||
|
@ -4379,8 +4396,15 @@ sock_sendmsg(PySocketSockObject *s, PyObject *args)
|
|||
{
|
||||
goto finally;
|
||||
}
|
||||
if (PySys_Audit("socket.sendmsg", "OO", s, addr_arg) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
msg.msg_name = &addrbuf;
|
||||
msg.msg_namelen = addrlen;
|
||||
} else {
|
||||
if (PySys_Audit("socket.sendmsg", "OO", s, Py_None) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Fill in an iovec for each message part, and save the Py_buffer
|
||||
|
@ -5030,6 +5054,17 @@ sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
|
|||
&family, &type, &proto, &fdobj))
|
||||
return -1;
|
||||
|
||||
#ifdef MS_WINDOWS
|
||||
/* In this case, we don't use the family, type and proto args */
|
||||
if (fdobj != NULL && fdobj != Py_None)
|
||||
#endif
|
||||
{
|
||||
if (PySys_Audit("socket.__new__", "Oiii",
|
||||
s, family, type, proto) < 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (fdobj != NULL && fdobj != Py_None) {
|
||||
#ifdef MS_WINDOWS
|
||||
/* recreate a socket that was duplicated */
|
||||
|
@ -5042,6 +5077,12 @@ sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
|
|||
return -1;
|
||||
}
|
||||
memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
|
||||
|
||||
if (PySys_Audit("socket()", "iii", info.iAddressFamily,
|
||||
info.iSocketType, info.iProtocol) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
|
||||
FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
|
||||
|
@ -5284,6 +5325,10 @@ static PyTypeObject sock_type = {
|
|||
static PyObject *
|
||||
socket_gethostname(PyObject *self, PyObject *unused)
|
||||
{
|
||||
if (PySys_Audit("socket.gethostname", NULL) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef MS_WINDOWS
|
||||
/* Don't use winsock's gethostname, as this returns the ANSI
|
||||
version of the hostname, whereas we need a Unicode string.
|
||||
|
@ -5362,6 +5407,11 @@ extern int sethostname(const char *, size_t);
|
|||
return NULL;
|
||||
flag = 1;
|
||||
}
|
||||
|
||||
if (PySys_Audit("socket.sethostname", "(O)", hnobj) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
|
||||
if (!res) {
|
||||
res = sethostname(buf.buf, buf.len);
|
||||
|
@ -5387,6 +5437,9 @@ socket_gethostbyname(PyObject *self, PyObject *args)
|
|||
|
||||
if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
|
||||
return NULL;
|
||||
if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
|
||||
goto finally;
|
||||
}
|
||||
if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
|
||||
goto finally;
|
||||
ret = make_ipv4_addr(&addrbuf);
|
||||
|
@ -5571,6 +5624,9 @@ socket_gethostbyname_ex(PyObject *self, PyObject *args)
|
|||
|
||||
if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
|
||||
return NULL;
|
||||
if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
|
||||
goto finally;
|
||||
}
|
||||
if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
|
||||
goto finally;
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
|
@ -5649,6 +5705,9 @@ socket_gethostbyaddr(PyObject *self, PyObject *args)
|
|||
|
||||
if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
|
||||
return NULL;
|
||||
if (PySys_Audit("socket.gethostbyaddr", "O", args) < 0) {
|
||||
goto finally;
|
||||
}
|
||||
af = AF_UNSPEC;
|
||||
if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
|
||||
goto finally;
|
||||
|
@ -5720,6 +5779,11 @@ socket_getservbyname(PyObject *self, PyObject *args)
|
|||
struct servent *sp;
|
||||
if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
|
||||
return NULL;
|
||||
|
||||
if (PySys_Audit("socket.getservbyname", "ss", name, proto) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
sp = getservbyname(name, proto);
|
||||
Py_END_ALLOW_THREADS
|
||||
|
@ -5757,6 +5821,11 @@ socket_getservbyport(PyObject *self, PyObject *args)
|
|||
"getservbyport: port must be 0-65535.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (PySys_Audit("socket.getservbyport", "is", port, proto) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
sp = getservbyport(htons((short)port), proto);
|
||||
Py_END_ALLOW_THREADS
|
||||
|
@ -6392,6 +6461,12 @@ socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
|
|||
pptr = "00";
|
||||
}
|
||||
#endif
|
||||
|
||||
if (PySys_Audit("socket.getaddrinfo", "OOiii",
|
||||
hobj, pobj, family, socktype, protocol) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = family;
|
||||
hints.ai_socktype = socktype;
|
||||
|
@ -6483,6 +6558,11 @@ socket_getnameinfo(PyObject *self, PyObject *args)
|
|||
"getnameinfo(): flowinfo must be 0-1048575.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (PySys_Audit("socket.getnameinfo", "(O)", sa) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue