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() {

