RE: /proc/net/dev regression
From: David Laight <hidden>
Date: 2015-01-12 11:48:39
Also in:
lkml
From: Al Viro
quoted
I think the problem with wmnet is not that it was expecting the fields to be aligned because it never had problems before (when definitely more than 10 megabytes were received, wmnet is crappy but not _that_ crappy). I think the problem really was here, totalbytes_in = strtoul(&buffer[7], NULL, 10); After the patch the device name is 8 characters long and &buffer[7] overlaps with the name instead of reading the bytes. Before the patch is was fine because the call to strtoul() seems correct in the sense that it would read everything until the NULL. So more than 10 megabytes was still ok. So I guess I was wrong when suggesting that the problem was the alignment.Several lines below there's this: totalpackets_out = strtoul(&buffer[74], NULL, 10); if (totalpackets_out != lastpackets_out) { totalbytes_out = strtoul(&buffer[66], NULL, 10); diffpackets_out += totalpackets_out - lastpackets_out; diffbytes_out += totalbytes_out - lastbytes_out; lastpackets_out = totalpackets_out; lastbytes_out = totalbytes_out; tx = True; } So I'm afraid it *is* that crappy. This function really should use scanf(); note that updateStats_ipchains() in the same file does just that (well, fgets()+sscanf() for fsck knows what reason). And I'd be careful with all those %d, actually - it's not _that_ hard to get more than 4Gb sent. scanf formats really ought to match the kernel-side (seq_)printf one...
IMHO it is safer to use strchr(p, ' '); to skip the interface name and then use repeated calls to strtoull() to read the numbers. Correctly/safely using scanf() is really too hard. David