Suspicious code in i2c-dev.c

Frodo Looijaard frodol en dds.nl
Lun Ene 24 00:00:41 CST 2000


Russell King wrote:

> Looking through i2c-dev.c, I noticed the following code, which appears
> to be wrong:
> 
>   /* copy user space data to kernel space. */
>   tmp = kmalloc(count,GFP_KERNEL);
>   if (tmp==NULL)
>      return -ENOMEM;
> 
> #ifdef DEBUG
>   printk("i2c-dev,o: i2c-%d reading %d bytes.\n",MINOR(inode->i_rdev),count);
> #endif
> 
>   ret = i2c_master_recv(client,tmp,count);
>   copy_to_user(buf,tmp,count);
>   kfree(tmp);
>   return ret;
> 
> for the following reasons:
> 
> 1. If i2c_master_recv does not write to `tmp' but returns an error,
>    copy_to_user will copy uninitialised kernel memory to the user,
>    possibly from another user process - security concern.

Granted. Easily solved with a test whether ret equals zero at this place.
I have applied this to our master archive; we'll include it in the
next diffs we send (probably tomorrow).
 
> 2. copy_to_user may fault, and if this is the case, the user will
>    never know (the user will not see the EFAULT error code returned).

> There are more instances of point 2, including some with copy_from_user.

Hmm. Can you elaborate on that? What exactly will happen when a
copy_{to,from}_user faults? And what does a fault in this instance
mean (cache miss?).

Thanks,
  Frodo

-- 
Frodo Looijaard <frodol en dds.nl>  PGP key and more: http://huizen.dds.nl/~frodol
Defenestration n. (formal or joc.):
  The act of removing Windows from your computer in disgust, usually followed
  by the installation of Linux or some other Unix-like operating system.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo en vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/



Más información sobre la lista de distribución Ayuda