diff -urNp linux-2.4.21/drivers/net/wireless/airo.c linux-2.4.21.SUSE/drivers/net/wireless/airo.c --- linux-2.4.21/drivers/net/wireless/airo.c 2004-06-21 16:13:14.163585537 +0200 +++ linux-2.4.21.SUSE/drivers/net/wireless/airo.c 2004-06-21 16:13:40.248903653 +0200 @@ -3012,19 +3012,22 @@ static ssize_t proc_read( struct file *f size_t len, loff_t *offset ) { - int i; - int pos; + loff_t pos = *offset; struct proc_data *priv = (struct proc_data*)file->private_data; - if( !priv->rbuffer ) return -EINVAL; + if (!priv->rbuffer) + return -EINVAL; - pos = *offset; - for( i = 0; i+pos < priv->readlen && i < len; i++ ) { - if (put_user( priv->rbuffer[i+pos], buffer+i )) - return -EFAULT; - } - *offset += i; - return i; + if (pos < 0) + return -EINVAL; + if (pos >= priv->readlen) + return 0; + if (len > priv->readlen - pos) + len = priv->readlen - pos; + if (copy_to_user(buffer, priv->rbuffer + pos, len)) + return -EFAULT; + *offset = pos + len; + return len; } /* @@ -3036,24 +3039,24 @@ static ssize_t proc_write( struct file * size_t len, loff_t *offset ) { - int i; - int pos; + loff_t pos = *offset; struct proc_data *priv = (struct proc_data*)file->private_data; - if ( !priv->wbuffer ) { + if (!priv->wbuffer) return -EINVAL; - } - - pos = *offset; - for( i = 0; i + pos < priv->maxwritelen && - i < len; i++ ) { - if (get_user( priv->wbuffer[i+pos], buffer + i )) - return -EFAULT; - } - if ( i+pos > priv->writelen ) priv->writelen = i+file->f_pos; - *offset += i; - return i; + if (pos < 0) + return -EINVAL; + if (pos >= priv->maxwritelen) + return 0; + if (len > priv->maxwritelen - pos) + len = priv->maxwritelen - pos; + if (copy_from_user(priv->wbuffer + pos, buffer, len)) + return -EFAULT; + if (pos + len > priv->writelen) + priv->writelen = pos + len; + *offset = pos + len; + return len; } static int proc_status_open( struct inode *inode, struct file *file ) {