summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiampaolo Rodola <g.rodola@gmail.com>2016-10-26 16:51:54 +0200
committerGiampaolo Rodola <g.rodola@gmail.com>2016-10-26 16:51:54 +0200
commitd61248b81fd47087ff194019c7567d31c18755a3 (patch)
tree6eaaf68300ed38e330f660884f3b68c71dba47e2
parent75e184016d36c60a469385386768614ecd0ce7ca (diff)
downloadpsutil-d61248b81fd47087ff194019c7567d31c18755a3.tar.gz
fix #932 / netbsd: check connections return value and raise exception
-rw-r--r--HISTORY.rst12
-rw-r--r--psutil/arch/bsd/netbsd_socks.c114
2 files changed, 90 insertions, 36 deletions
diff --git a/HISTORY.rst b/HISTORY.rst
index fb8505be..5d619ab4 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -1,5 +1,17 @@
*Bug tracker at https://github.com/giampaolo/psutil/issues*
+4.4.3
+=====
+
+*XXXX-XX-XX*
+
+Bug fixes
+---------
+
+- 932_: [NetBSD] net_connections() and Process.connections() may fail without
+ raising an exception.
+
+
4.4.2
=====
diff --git a/psutil/arch/bsd/netbsd_socks.c b/psutil/arch/bsd/netbsd_socks.c
index c8e7122e..c782a443 100644
--- a/psutil/arch/bsd/netbsd_socks.c
+++ b/psutil/arch/bsd/netbsd_socks.c
@@ -64,7 +64,7 @@ static void psutil_kpcblist_init(void);
static void psutil_kpcblist_clear(void);
static int psutil_get_files(void);
static int psutil_get_sockets(const char *name);
-static void psutil_get_info(int aff);
+static int psutil_get_info(int aff);
// Initialize kinfo_file results list.
@@ -121,14 +121,22 @@ psutil_get_files(void) {
mib[4] = sizeof(struct kinfo_file);
mib[5] = 0;
- if (sysctl(mib, 6, NULL, &len, NULL, 0) == -1)
+ if (sysctl(mib, 6, NULL, &len, NULL, 0) == -1) {
+ PyErr_SetFromErrno(PyExc_OSError);
return -1;
+ }
+
offset = len % sizeof(off_t);
mib[5] = len / sizeof(struct kinfo_file);
- if ((buf = malloc(len + offset)) == NULL)
+
+ if ((buf = malloc(len + offset)) == NULL) {
+ PyErr_NoMemory();
return -1;
+ }
+
if (sysctl(mib, 6, buf + offset, &len, NULL, 0) == -1) {
free(buf);
+ PyErr_SetFromErrno(PyExc_OSError);
return -1;
}
@@ -164,13 +172,18 @@ psutil_get_sockets(const char *name) {
memset(mib, 0, sizeof(mib));
- if (sysctlnametomib(name, mib, &namelen) == -1)
+ if (sysctlnametomib(name, mib, &namelen) == -1) {
+ PyErr_SetFromErrno(PyExc_OSError);
return -1;
+ }
- if (sysctl(mib, __arraycount(mib), NULL, &len, NULL, 0) == -1)
+ if (sysctl(mib, __arraycount(mib), NULL, &len, NULL, 0) == -1) {
+ PyErr_SetFromErrno(PyExc_OSError);
return -1;
+ }
if ((pcb = malloc(len)) == NULL) {
+ PyErr_NoMemory();
return -1;
}
memset(pcb, 0, len);
@@ -180,6 +193,7 @@ psutil_get_sockets(const char *name) {
if (sysctl(mib, __arraycount(mib), pcb, &len, NULL, 0) == -1) {
free(pcb);
+ PyErr_SetFromErrno(PyExc_OSError);
return -1;
}
@@ -207,61 +221,86 @@ psutil_get_sockets(const char *name) {
// Collect open file and connections.
-static void
+static int
psutil_get_info(int aff) {
- psutil_get_files();
-
switch (aff) {
case INET:
- psutil_get_sockets("net.inet.tcp.pcblist");
- psutil_get_sockets("net.inet.udp.pcblist");
- psutil_get_sockets("net.inet6.tcp6.pcblist");
- psutil_get_sockets("net.inet6.udp6.pcblist");
+ if (psutil_get_sockets("net.inet.tcp.pcblist") != 0)
+ return -1;
+ if (psutil_get_sockets("net.inet.udp.pcblist") != 0)
+ return -1;
+ if (psutil_get_sockets("net.inet6.tcp6.pcblist") != 0)
+ return -1;
+ if (psutil_get_sockets("net.inet6.udp6.pcblist") != 0)
+ return -1;
break;
case INET4:
- psutil_get_sockets("net.inet.tcp.pcblist");
- psutil_get_sockets("net.inet.udp.pcblist");
+ if (psutil_get_sockets("net.inet.tcp.pcblist") != 0)
+ return -1;
+ if (psutil_get_sockets("net.inet.udp.pcblist") != 0)
+ return -1;
break;
case INET6:
- psutil_get_sockets("net.inet6.tcp6.pcblist");
- psutil_get_sockets("net.inet6.udp6.pcblist");
+ if (psutil_get_sockets("net.inet6.tcp6.pcblist") != 0)
+ return -1;
+ if (psutil_get_sockets("net.inet6.udp6.pcblist") != 0)
+ return -1;
break;
case TCP:
- psutil_get_sockets("net.inet.tcp.pcblist");
- psutil_get_sockets("net.inet6.tcp6.pcblist");
+ if (psutil_get_sockets("net.inet.tcp.pcblist") != 0)
+ return -1;
+ if (psutil_get_sockets("net.inet6.tcp6.pcblist") != 0)
+ return -1;
break;
case TCP4:
- psutil_get_sockets("net.inet.tcp.pcblist");
+ if (psutil_get_sockets("net.inet.tcp.pcblist") != 0)
+ return -1;
break;
case TCP6:
- psutil_get_sockets("net.inet6.tcp6.pcblist");
+ if (psutil_get_sockets("net.inet6.tcp6.pcblist") != 0)
+ return -1;
break;
case UDP:
- psutil_get_sockets("net.inet.udp.pcblist");
- psutil_get_sockets("net.inet6.udp6.pcblist");
+ if (psutil_get_sockets("net.inet.udp.pcblist") != 0)
+ return -1;
+ if (psutil_get_sockets("net.inet6.udp6.pcblist") != 0)
+ return -1;
break;
case UDP4:
- psutil_get_sockets("net.inet.udp.pcblist");
+ if (psutil_get_sockets("net.inet.udp.pcblist") != 0)
+ return -1;
break;
case UDP6:
- psutil_get_sockets("net.inet6.udp6.pcblist");
+ if (psutil_get_sockets("net.inet6.udp6.pcblist") != 0)
+ return -1;
break;
case UNIX:
- psutil_get_sockets("net.local.stream.pcblist");
- psutil_get_sockets("net.local.seqpacket.pcblist");
- psutil_get_sockets("net.local.dgram.pcblist");
+ if (psutil_get_sockets("net.local.stream.pcblist") != 0)
+ return -1;
+ if (psutil_get_sockets("net.local.seqpacket.pcblist") != 0)
+ return -1;
+ if (psutil_get_sockets("net.local.dgram.pcblist") != 0)
+ return -1;
break;
case ALL:
- psutil_get_sockets("net.inet.tcp.pcblist");
- psutil_get_sockets("net.inet.udp.pcblist");
- psutil_get_sockets("net.inet6.tcp6.pcblist");
- psutil_get_sockets("net.inet6.udp6.pcblist");
- psutil_get_sockets("net.local.stream.pcblist");
- psutil_get_sockets("net.local.seqpacket.pcblist");
- psutil_get_sockets("net.local.dgram.pcblist");
+ if (psutil_get_sockets("net.inet.tcp.pcblist") != 0)
+ return -1;
+ if (psutil_get_sockets("net.inet.udp.pcblist") != 0)
+ return -1;
+ if (psutil_get_sockets("net.inet6.tcp6.pcblist") != 0)
+ return -1;
+ if (psutil_get_sockets("net.inet6.udp6.pcblist") != 0)
+ return -1;
+ if (psutil_get_sockets("net.local.stream.pcblist") != 0)
+ return -1;
+ if (psutil_get_sockets("net.local.seqpacket.pcblist") != 0)
+ return -1;
+ if (psutil_get_sockets("net.local.dgram.pcblist") != 0)
+ return -1;
break;
}
- return;
+
+ return 0;
}
@@ -284,7 +323,10 @@ psutil_net_connections(PyObject *self, PyObject *args) {
psutil_kiflist_init();
psutil_kpcblist_init();
- psutil_get_info(ALL);
+ if (psutil_get_files() != 0)
+ goto error;
+ if (psutil_get_info(ALL) != 0)
+ goto error;
struct kif *k;
SLIST_FOREACH(k, &kihead, kifs) {