On Wed, Nov 18, 2009 at 10:13:48PM +0100, Moritz Muehlenhoff wrote: > On Tue, Oct 13, 2009 at 11:13:01AM +0000, Gerrit Pape wrote: > > tags 547902 + patch > > quit > > [ Adding Christian to CC: ] > > Christian, did you submit your patch upstream?
No, not yet. It still has the problem that reading the value(s) bytewise returns garbage if the value(s) change during reading. But I can try to send it to lkml and see what they say. Shall I point to this bug-report and may I add a "Tested-by" line ? Christian > > Cheers, > Moritz > > > Hi, please see http://bugs.debian.org/547902 > > > > Here's a patch from Christian Hohnstaedt <chohnsta...@innominate.com> > > > > Thanks, Gerrit. > > > > > > --- > > Testparameter: > > for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19; do dd > > if=/proc/sys/net/ipv4/tcp_wmem bs=$i 2>/dev/null; done > > > > for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19; do dd > > if=/proc/sys/net/ipv4/tcp_wmem skip=$i bs=1 2>/dev/null |wc -c ; done > > > > diff --git a/kernel/sysctl.c b/kernel/sysctl.c > > index 9270125..038df14 100644 > > --- a/kernel/sysctl.c > > +++ b/kernel/sysctl.c > > @@ -2117,17 +2117,16 @@ static int __do_proc_dointvec(void *tbl_data, > > struct ctl_table *table, > > #define TMPBUFLEN 21 > > int *i, vleft, first=1, neg, val; > > unsigned long lval; > > - size_t left, len; > > + size_t left, len, off; > > > > char buf[TMPBUFLEN], *p; > > char __user *s = buffer; > > > > - if (!tbl_data || !table->maxlen || !*lenp || > > - (*ppos && !write)) { > > + if (!tbl_data || !table->maxlen || !*lenp) { > > *lenp = 0; > > return 0; > > } > > - > > + off = 0; > > i = (int *) tbl_data; > > vleft = table->maxlen / sizeof(*i); > > left = *lenp; > > @@ -2176,25 +2175,31 @@ static int __do_proc_dointvec(void *tbl_data, > > struct ctl_table *table, > > if (conv(&neg, &lval, i, 1, data)) > > break; > > } else { > > + loff_t diff; > > p = buf; > > - if (!first) > > - *p++ = '\t'; > > - > > if (conv(&neg, &lval, i, 0, data)) > > break; > > > > - sprintf(p, "%s%lu", neg ? "-" : "", lval); > > - len = strlen(buf); > > - if (len > left) > > - len = left; > > - if(copy_to_user(s, buf, len)) > > - return -EFAULT; > > - left -= len; > > - s += len; > > + len = sprintf(p, "%s%s%lu", first ? "" : "\t", > > + neg ? "-" : "", lval); > > + diff = *ppos - off; > > + off += len; > > + if (diff > 0 && diff < len) { > > + p += diff; > > + len -= diff; > > + } > > + if (off > *ppos) { > > + if (len > left) > > + len = left; > > + if(copy_to_user(s, p, len)) > > + return -EFAULT; > > + left -= len; > > + s += len; > > + } > > } > > } > > > > - if (!write && !first && left) { > > + if (!write && !first && left && off >= *ppos) { > > if(put_user('\n', s)) > > return -EFAULT; > > left--, s++; > > > > > > Christian Hohnstaedt -- Christian Hohnstaedt / Project Manager Hardware and Manufacturing Innominate Security Technologies AG / protecting industrial networks tel: +49.30.921028.208 / fax: +49.30.921028.020 Rudower Chaussee 13, D-12489 Berlin / http://www.innominate.com Register Court: AG Charlottenburg, HR B 81603 Management Board: Dirk Seewald Chairman of the Supervisory Board: Volker Bibelhausen -- To UNSUBSCRIBE, email to debian-kernel-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org