swrun_*: snprint may have set a too long string length. Fix it if needed.
diff --git a/agent/mibgroup/host/data_access/swrun_cygwin.c b/agent/mibgroup/host/data_access/swrun_cygwin.c
index ca5194d..fcecbe6 100644
--- a/agent/mibgroup/host/data_access/swrun_cygwin.c
+++ b/agent/mibgroup/host/data_access/swrun_cygwin.c
@@ -222,6 +222,8 @@
}
}
}
+ if (entry->hrSWRunPath_len >= sizeof(entry->hrSWRunPath))
+ entry->hrSWRunPath_len = sizeof(entry->hrSWRunPath)-1;
/*
* Set hrSWRunName to be the last component of hrSWRunPath,
* but without any file extension
@@ -241,6 +243,8 @@
if ( cp1 )
*cp1 = '.'; /* Restore the file extension */
+ if (entry->hrSWRunName_len >= sizeof(entry->hrSWRunName))
+ entry->hrSWRunName_len = sizeof(entry->hrSWRunName)-1;
}
/*
diff --git a/agent/mibgroup/host/data_access/swrun_kinfo.c b/agent/mibgroup/host/data_access/swrun_kinfo.c
index 0869eac..fc4ed7a 100644
--- a/agent/mibgroup/host/data_access/swrun_kinfo.c
+++ b/agent/mibgroup/host/data_access/swrun_kinfo.c
@@ -177,7 +177,7 @@
{
struct SWRUN_TABLE *proc_table;
int nprocs, i, rc;
- char buf[BUFSIZ], **argv;
+ char buf[BUFSIZ+1], **argv;
netsnmp_swrun_entry *entry;
if ( 0 == kd ) {
@@ -225,11 +225,16 @@
entry->hrSWRunName_len = snprintf(entry->hrSWRunName,
sizeof(entry->hrSWRunName)-1,
"%s", proc_table[i].SWRUN_K_COMM);
+ if (entry->hrSWRunName_len >= sizeof(entry->hrSWRunName))
+ entry->hrSWRunName_len = sizeof(entry->hrSWRunName)-1;
- if ( argv && *argv)
+ if ( argv && *argv) {
entry->hrSWRunPath_len = snprintf(entry->hrSWRunPath,
sizeof(entry->hrSWRunPath)-1,
"%s", argv[0]);
+ if (entry->hrSWRunPath_len >= sizeof(entry->hrSWRunPath))
+ entry->hrSWRunPath_len = sizeof(entry->hrSWRunPath)-1;
+ }
else {
memcpy( entry->hrSWRunPath, entry->hrSWRunName,
entry->hrSWRunName_len );
@@ -252,13 +257,17 @@
if (argv)
argv++; /* Skip argv[0] */
while ( argv && *argv ) {
- strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
- strncat(buf, *argv, sizeof(buf) - strlen(buf) - 1);
+ strcat(buf, " ");
+ strcat(buf, *argv);
argv++;
}
+ if (strlen(buf) >= BUFSIZ-10)
+ snmp_log(LOG_ERR, "params %lu/%d %s\n", strlen(buf), BUFSIZ, buf);
entry->hrSWRunParameters_len = snprintf(entry->hrSWRunParameters,
- sizeof(entry->hrSWRunParameters)-1,
+ sizeof(entry->hrSWRunParameters),
"%s", buf+1);
+ if (entry->hrSWRunParameters_len >= sizeof(entry->hrSWRunParameters))
+ entry->hrSWRunParameters_len = sizeof(entry->hrSWRunParameters)-1;
entry->hrSWRunType = (P_SYSTEM & proc_table[i].SWRUN_K_FLAG)
#ifdef SWRUN_K_CLASS
diff --git a/agent/mibgroup/host/data_access/swrun_kvm_proc.c b/agent/mibgroup/host/data_access/swrun_kvm_proc.c
index ae6876e..e2dc86c 100644
--- a/agent/mibgroup/host/data_access/swrun_kvm_proc.c
+++ b/agent/mibgroup/host/data_access/swrun_kvm_proc.c
@@ -112,6 +112,8 @@
entry->hrSWRunName_len = snprintf(entry->hrSWRunName,
sizeof(entry->hrSWRunName)-1,
"%s", proc_buf->p_user.u_comm);
+ if (entry->hrSWRunName_len >= sizeof(entry->hrSWRunName))
+ entry->hrSWRunName_len = sizeof(entry->hrSWRunName)-1;
/*
* Split u_psargs into two:
* argv[0] is hrSWRunPath
@@ -123,9 +125,13 @@
entry->hrSWRunPath_len = snprintf(entry->hrSWRunPath,
sizeof(entry->hrSWRunPath)-1,
"%s", proc_buf->p_user.u_psargs);
+ if (entry->hrSWRunPath_len >= sizeof(entry->hrSWRunPath))
+ entry->hrSWRunPath_len = sizeof(entry->hrSWRunPath)-1;
entry->hrSWRunParameters_len = snprintf(entry->hrSWRunParameters,
sizeof(entry->hrSWRunParameters)-1,
"%s", cp+1);
+ if (entry->hrSWRunParameters_len >= sizeof(entry->hrSWRunParameters))
+ entry->hrSWRunParameters_len = sizeof(entry->hrSWRunParameters)-1;
*cp = ' '; /* Restore u_psargs value */
/*
diff --git a/agent/mibgroup/host/data_access/swrun_procfs_psinfo.c b/agent/mibgroup/host/data_access/swrun_procfs_psinfo.c
index c8124d4..6cafd9c 100644
--- a/agent/mibgroup/host/data_access/swrun_procfs_psinfo.c
+++ b/agent/mibgroup/host/data_access/swrun_procfs_psinfo.c
@@ -93,6 +93,8 @@
= sprintf(entry->hrSWRunName, "%.*s",
(int)sizeof(entry->hrSWRunName) - 1,
psinfo.pr_fname);
+ if (entry->hrSWRunName_len >= sizeof(entry->hrSWRunName))
+ entry->hrSWRunName_len = sizeof(entry->hrSWRunName)-1;
/*
* Split pr_psargs into two:
* argv[0] is hrSWRunPath
@@ -105,10 +107,14 @@
= sprintf(entry->hrSWRunPath, "%.*s",
(int)sizeof(entry->hrSWRunPath) - 1,
psinfo.pr_psargs);
+ if (entry->hrSWRunPath_len >= sizeof(entry->hrSWRunPath))
+ entry->hrSWRunPath_len = sizeof(entry->hrSWRunPath)-1;
entry->hrSWRunParameters_len
= sprintf(entry->hrSWRunParameters, "%.*s",
(int)sizeof(entry->hrSWRunParameters) - 1, cp+1);
+ if (entry->hrSWRunParameters_len >= sizeof(entry->hrSWRunParameters))
+ entry->hrSWRunParameters_len = sizeof(entry->hrSWRunParameters)-1;
*cp = ' '; /* Restore pr_psargs value */
/*