diff --git a/ndpi-netfilter/src/ndpi_proc_generic.c b/ndpi-netfilter/src/ndpi_proc_generic.c index 4dba9f28e..91a34f95d 100644 --- a/ndpi-netfilter/src/ndpi_proc_generic.c +++ b/ndpi-netfilter/src/ndpi_proc_generic.c @@ -78,25 +78,25 @@ generic_proc_write(struct ndpi_net *n, const char __user *buffer, skip = w_buf->cpos == w_buf->max - 1; while(pos < length) { - l = min(length,sizeof(buf)-1); + l = min(length-pos,sizeof(buf)-1); memset(buf,0,sizeof(buf)); if (!(ACCESS_OK(VERIFY_READ, buffer+pos, l) && !__copy_from_user(&buf[0], buffer+pos, l))) return -EFAULT; - for(i = 0; i < l; i++) { + for(i = 0; i < l; (*loff)++,i++) { c = buf[i]; if(c == '\n' || !c) { if(w_buf->cpos) { if(ndpi_log_debug > 1) - pr_info("%s:%s cmd %d:%s\n", __func__,n->ns_name, - w_buf->cpos,&w_buf->cmd[0]); + pr_info("%s:%s POS %lld cmd %d:'%s' i %d\n", __func__,n->ns_name, + *loff,w_buf->cpos,&w_buf->cmd[0],i); r = (parse_line)(n,&w_buf->cmd[0]); + memset(&w_buf->cmd[0],0,w_buf->cpos); + skip = 0; + w_buf->cpos = 0; + if(r) return -EINVAL; } - skip = 0; - w_buf->cpos = 0; - memset(&w_buf->cmd[0],0,cmd_size); - if(r) return -EINVAL; } else { if(w_buf->cpos < w_buf->max - 1) w_buf->cmd[w_buf->cpos++] = c;