Control: tags -1 patch

Dear Giuseppe,

Stefan improved his patch (attached) so I hope we can integrate it.

My co-maintainership offer still stand or I can do an NMU for you if
you wish. Please advise.

Best wishes,
 Dmitry Smirnov
 GPG key : 4096R/53968D1B
Last-Update: 2013-07-04
Forwarded: yes
Bug-nmon: https://sourceforge.net/p/nmon/bugs/2/
From: Stefan Paletta <[email protected]>
Description: fixes crash (segfault) on NFS view 'N'
 Reworked all of the nfs / nfsd related parsing code to remove
 assumptions about what lines are present and in what order.

--- a/lmon.c
+++ b/lmon.c
@@ -1445,45 +1445,49 @@
 {
 int i;
 int j;
 int len;
+int lno;
 
 /* sample /proc/net/rpc/nfs
 net 0 0 0 0
 rpc 70137 0 0
 proc2 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 proc3 22 0 27364 0 32 828 22 40668 0 1 0 0 0 0 0 0 0 0 1212 6 2 1 0
 proc4 35 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 */
-    if(proc[P_NFS].fp != 0) {
-	/* client version 2 line readers "proc2 18 num num etc" */
-	len=strlen(proc[P_NFS].line[2]);
-	for(j=0,i=8;i<len && j<18;i++) {
-		if(proc[P_NFS].line[2][i] == ' ') {
-			p->nfs.v2c[j] =atol(&proc[P_NFS].line[2][i+1]);
+    if(proc[P_NFS].fp != 0)
+	for ( lno=0 ; lno < proc[P_NFS].lines ; lno++ )
+		{
+		len=strlen(proc[P_NFS].line[lno]);
+
+		if ( 0 == strncmp( "proc2 ", proc[P_NFS].line[lno], 6 ) )
+			{
+			/* client version 2 line readers "proc2 18 num num etc" */
 			nfs_v2c_found=1;
-			j++;
-		}
-	}
-	/* client version 3 line readers "proc3 22 num num etc" */
-	len=strlen(proc[P_NFS].line[3]);
-	for(j=0,i=8;i<len && j<22;i++) {
-		if(proc[P_NFS].line[3][i] == ' ') {
-			p->nfs.v3c[j] =atol(&proc[P_NFS].line[3][i+1]);
+			for(j=0,i=8;i<len && j<18;i++)
+				if(proc[P_NFS].line[lno][i] == ' ')
+					p->nfs.v2c[j++] =atol(&proc[P_NFS].line[lno][i+1]);
+			}
+		else
+		if ( 0 == strncmp( "proc3 ", proc[P_NFS].line[lno], 6 ) )
+			{
+			/* client version 3 line readers "proc3 22 num num etc" */
 			nfs_v3c_found=1;
-			j++;
-		}
-	}
-	/* client version 4 line readers "proc4 35 num num etc" */
-	len=strlen(proc[P_NFS].line[4]);
-	for(j=0,i=8;i<len && j<35;i++) {
-		if(proc[P_NFS].line[4][i] == ' ') {
-			p->nfs.v4c[j] =atol(&proc[P_NFS].line[4][i+1]);
+			for(j=0,i=8;i<len && j<22;i++)
+				if(proc[P_NFS].line[lno][i] == ' ')
+					p->nfs.v3c[j++] =atol(&proc[P_NFS].line[lno][i+1]);
+			}
+		else
+		if ( 0 == strncmp( "proc4 ", proc[P_NFS].line[lno], 6 ) )
+			{
+			/* client version 4 line readers "proc4 35 num num etc" */
 			nfs_v4c_found=1;
-			j++;
+			for(j=0,i=8;i<len && j<35;i++)
+				if(proc[P_NFS].line[lno][i] == ' ')
+					p->nfs.v4c[j++] =atol(&proc[P_NFS].line[lno][i+1]);
+    			}
 		}
-	}
-    }
 /* sample /proc/net/rpc/nfsd 
 rc 0 0 0
 fh 0 0 0 0 0
 io 0 0
@@ -1495,37 +1499,40 @@
 proc3 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 proc4 2 0 0
 proc4ops 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 */
-    if(proc[P_NFSD].fp != 0) {
-	/* server version 2 line readers "proc2 18 num num etc" */
-	len=strlen(proc[P_NFSD].line[7]);
-	for(j=0,i=8;i<len && j<18;i++) {
-		if(proc[P_NFSD].line[2][i] == ' ') {
-			p->nfs.v2s[j] =atol(&proc[P_NFSD].line[7][i+1]);
+    if(proc[P_NFSD].fp != 0)
+	for ( lno=0 ; lno < proc[P_NFSD].lines ; lno++ )
+		{
+		len=strlen(proc[P_NFSD].line[lno]);
+		
+		if ( 0 == strncmp( "proc2 ", proc[P_NFSD].line[lno], 6 ) )
+			{
+			/* server version 2 line readers "proc2 18 num num etc" */
 			nfs_v2s_found=1;
-			j++;
-		}
-	}
-	/* server version 3 line readers "proc3 22 num num etc" */
-	len=strlen(proc[P_NFSD].line[8]);
-	for(j=0,i=8;i<len && j<22;i++) {
-		if(proc[P_NFS].line[3][i] == ' ') {
-			p->nfs.v3s[j] =atol(&proc[P_NFSD].line[8][i+1]);
+			for(j=0,i=8;i<len && j<18;i++)
+				if(proc[P_NFSD].line[lno][i] == ' ')
+					p->nfs.v2s[j++] =atol(&proc[P_NFSD].line[lno][i+1]);
+			}
+		else
+		if ( 0 == strncmp( "proc3 ", proc[P_NFSD].line[lno], 6 ) )
+			{
+			/* server version 3 line readers "proc3 22 num num etc" */
 			nfs_v3s_found=1;
-			j++;
-		}
-	}
-	/* server version 4 line readers "proc4ops 40 num num etc"  NOTE: the "ops" hence starting in column 11 */ 
-	len=strlen(proc[P_NFSD].line[10]);
-	for(j=0,i=11;i<len && j<40;i++) {
-		if(proc[P_NFS].line[3][i] == ' ') {
-			p->nfs.v4s[j] =atol(&proc[P_NFSD].line[10][i+1]);
+			for(j=0,i=8;i<len && j<22;i++)
+				if(proc[P_NFSD].line[lno][i] == ' ')
+					p->nfs.v3s[j++] =atol(&proc[P_NFSD].line[lno][i+1]);
+			}
+		else
+		if ( 0 == strncmp( "proc4ops ", proc[P_NFSD].line[lno], 9 ) )
+			{
+			/* server version 4 line readers "proc4ops 40 num num etc" */
 			nfs_v4s_found=1;
-			j++;
+			for(j=0,i=11;i<len && j<40;i++)
+				if(proc[P_NFSD].line[lno][i] == ' ')
+					p->nfs.v4s[j++] =atol(&proc[P_NFSD].line[lno][i+1]);
+			}
 		}
-	}
-    }
 }
 
 void proc_kernel()
 {

Reply via email to