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?

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++;
> 
> 
> 



-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to