add several sanity checks to net_connection_list
This commit is contained in:
parent
cac8fa29a6
commit
87e66ddba6
|
@ -1638,11 +1638,21 @@ int sigar_net_interface_stat_get(sigar_t *sigar, const char *name,
|
||||||
return found ? SIGAR_OK : ENXIO;
|
return found ? SIGAR_OK : ENXIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define IS_NULL_PTR(ptr) ((ptr == NULL) || (*(ptr) == '\0'))
|
||||||
|
#define HEX_ENT_LEN 8
|
||||||
|
|
||||||
static SIGAR_INLINE int ip_format(char *buffer, int buflen, char *ptr)
|
static SIGAR_INLINE int ip_format(char *buffer, int buflen, char *ptr)
|
||||||
{
|
{
|
||||||
int alen = strlen(ptr);
|
int alen;
|
||||||
|
|
||||||
if (alen > 8) {
|
if (IS_NULL_PTR(ptr)) {
|
||||||
|
alen = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
alen = strlen(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alen > HEX_ENT_LEN) {
|
||||||
struct in6_addr addr;
|
struct in6_addr addr;
|
||||||
int i;
|
int i;
|
||||||
for (i=0; i<=3; i++, ptr+=8) {
|
for (i=0; i<=3; i++, ptr+=8) {
|
||||||
|
@ -1654,7 +1664,7 @@ static SIGAR_INLINE int ip_format(char *buffer, int buflen, char *ptr)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
struct in_addr addr;
|
struct in_addr addr;
|
||||||
addr.s_addr = hex2int(ptr);
|
addr.s_addr = (alen == HEX_ENT_LEN) ? hex2int(ptr) : 0;
|
||||||
if (!inet_ntop(AF_INET, &addr, buffer, buflen)) {
|
if (!inet_ntop(AF_INET, &addr, buffer, buflen)) {
|
||||||
return errno;
|
return errno;
|
||||||
}
|
}
|
||||||
|
@ -1690,12 +1700,22 @@ static int proc_net_read(net_conn_getter_t *getter,
|
||||||
char *laddr, *raddr;
|
char *laddr, *raddr;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
|
SIGAR_SKIP_SPACE(ptr);
|
||||||
|
if (IS_NULL_PTR(ptr)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
ptr = sigar_skip_token(ptr); /* skip number */
|
ptr = sigar_skip_token(ptr); /* skip number */
|
||||||
while (isspace(*ptr)) {
|
while (isspace(*ptr)) {
|
||||||
ptr++;
|
ptr++;
|
||||||
}
|
}
|
||||||
|
if (IS_NULL_PTR(ptr)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
port = strchr(ptr, ':');
|
if (!(port = strchr(ptr, ':'))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
*port = '\0';
|
*port = '\0';
|
||||||
++port;
|
++port;
|
||||||
|
|
||||||
|
@ -1706,8 +1726,13 @@ static int proc_net_read(net_conn_getter_t *getter,
|
||||||
while (isspace(*ptr)) {
|
while (isspace(*ptr)) {
|
||||||
ptr++;
|
ptr++;
|
||||||
}
|
}
|
||||||
|
if (IS_NULL_PTR(ptr)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
port = strchr(ptr, ':');
|
if (!(port = strchr(ptr, ':'))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
*port = '\0';
|
*port = '\0';
|
||||||
++port;
|
++port;
|
||||||
|
|
||||||
|
@ -1718,6 +1743,9 @@ static int proc_net_read(net_conn_getter_t *getter,
|
||||||
while (isspace(*ptr)) {
|
while (isspace(*ptr)) {
|
||||||
ptr++;
|
ptr++;
|
||||||
}
|
}
|
||||||
|
if (IS_NULL_PTR(ptr)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (!((conn.remote_port && (flags & SIGAR_NETCONN_CLIENT)) ||
|
if (!((conn.remote_port && (flags & SIGAR_NETCONN_CLIENT)) ||
|
||||||
(!conn.remote_port && (flags & SIGAR_NETCONN_SERVER))))
|
(!conn.remote_port && (flags & SIGAR_NETCONN_SERVER))))
|
||||||
|
@ -1747,18 +1775,36 @@ static int proc_net_read(net_conn_getter_t *getter,
|
||||||
sscanf(ptr, "%2x", &conn.state);
|
sscanf(ptr, "%2x", &conn.state);
|
||||||
ptr = sigar_skip_token(ptr);
|
ptr = sigar_skip_token(ptr);
|
||||||
SIGAR_SKIP_SPACE(ptr);
|
SIGAR_SKIP_SPACE(ptr);
|
||||||
|
if (IS_NULL_PTR(ptr)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen(ptr) < ((HEX_ENT_LEN*2) + 1)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
conn.send_queue = hex2int(ptr);
|
conn.send_queue = hex2int(ptr);
|
||||||
ptr += 9; /* tx + ':' */;
|
ptr += HEX_ENT_LEN+1; /* tx + ':' */;
|
||||||
|
|
||||||
conn.receive_queue = hex2int(ptr);
|
conn.receive_queue = hex2int(ptr);
|
||||||
ptr += 8;
|
ptr += HEX_ENT_LEN;
|
||||||
|
|
||||||
SIGAR_SKIP_SPACE(ptr);
|
SIGAR_SKIP_SPACE(ptr);
|
||||||
|
if (IS_NULL_PTR(ptr)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
ptr = sigar_skip_multiple_token(ptr, 2); /* tr:tm->when retrnsmt */
|
ptr = sigar_skip_multiple_token(ptr, 2); /* tr:tm->when retrnsmt */
|
||||||
|
if (IS_NULL_PTR(ptr)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
conn.uid = sigar_strtoul(ptr);
|
conn.uid = sigar_strtoul(ptr);
|
||||||
|
|
||||||
ptr = sigar_skip_token(ptr);
|
ptr = sigar_skip_token(ptr);
|
||||||
|
if (IS_NULL_PTR(ptr)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
conn.inode = sigar_strtoul(ptr);
|
conn.inode = sigar_strtoul(ptr);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue