Re: /proc/net/dev regression
From: Al Viro <viro@ZenIV.linux.org.uk>
Date: 2015-01-11 01:39:17
Also in:
lkml
On Sun, Jan 11, 2015 at 01:33:35AM +0000, Carlos R. Mafra wrote:
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...