Re: EFAULT in an ioctl (in a kernel module) when calling copy_to_user() - why ??

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks!
I had checked the return value, bofore calling
copy_to_user();

and access_ok(VERIFY_WRITE, (unsigned int *)data, sizeof(unsigned
int)) returns 1!  so it seems valid
to write to it ! I am totally confused now. What should I do now ?

John


On 12/20/05, Sameer Dhavale <sameer.dhavale@xxxxxxxxx> wrote:
> Hey John,
>    copy_to_user() returns the no of bytes that it couldn't actually copy to
> the user space and sizeof(unsigned int)=4...rite? That's where "4" came
> from.
>
>    I think, you are trying to write to a location which is not mapped to the
> user memory. The function access_ok() which is called from within
> copy_to_user() is returning error and so copy_to_user() cannot succeed.
>    My take is that "data" variable is on the kernel stack(as it an
> arguement...copy by value). So its wrong to write to this location using
> copy_to_user() as its not in user space.
>    You can confirm if I am right by calling
>    access_ok(VERIFY_WRITE, (unsigned int *)data, sizeof(unsigned int));
>   If this function returns 1, then you are allowed to write.
>
>     So my solution is that try to write to a valid user-address and you are
> done.
>
>    Correct me if I am wrong.
>
>    Namaste,
>
>    Sameer
>
>
> On 12/20/05, John Que <qwejohn@xxxxxxxxx> wrote:
> >
> > Hello,
> > 1)I don't have a clue from where this 4 is returned.
> > 2)The udage is ususally thus is the kernel:
> > if the return value of copy_to_user() is not zero, than
> > the method who calls it returns  -EFAULT.
> >
> > Any ideas how to solve this problem?
> > John
> >
> > On 12/20/05, Bernd Petrovitsch <bernd@xxxxxxxxx> wrote:
> > > On Tue, 2005-12-20 at 14:32 +0200, John Que wrote:
> > > [....]
> > > > res of copy_to_user = 4
> > > > Any idea?
> > >
> > > Yes.
> > > Where might the 4 come from?
> > > And how do others use the return value?
> > >
> > > [...]
> > > > On 12/20/05, Bernd Petrovitsch < bernd@xxxxxxxxx> wrote:
> > > > > On Tue, 2005-12-20 at 14:02 +0200, John Que wrote:
> > > > > [...]
> > > > > > I had written a very simple ioctl() method in a module;
> > > > > > this ioctl calls copy_to_user();
> > > > > >
> > > > > > I am getting EFAULT when trying to call this ioctl from
> > > > > > use space.
> > > > > >
> > > > > > Any idea what can be the reason ?
> > > > >
> > > > > Yes.
> > > > >
> > > > > > Here is the code:
> > > > > >
> > > > > > static unsigned long my_ioctl(struct inode* inode,
> > > > > >
>   struct file* file,
> > > > > >
>   unsigned int cmd,
> > > > > >
>   unsigned long data)
> > > > > >
> > > > > >   {
> > > > > >       ...
> > > > > >       ...
> > > > > > case MY_IOCTL:
> > > > > >   {
> > > > > >   unsigned int result = 99;
> > > > > >
> > > > > >   if (copy_to_user((unsigned int *)data,
> > > > > >                               &result,
> > > > > >                               sizeof(unsigned int)))
> > > > > >     {
> > > > > >    printk("copy_to_user failed\n");
> > > > > >    return -EFAULT;
> > > > > >    }
> > > > > >
> > > > > > }
> > > > >
> > > > > What value is returned by copy_to_user()?
> > >
> > >         Bernd
> > > --
> > > Firmix Software GmbH                   http://www.firmix.at/
> > > mobil: +43 664 4416156                 fax: +43 1 7890849-55
> > >           Embedded Linux Development and Services
> > >
> > >
> >
> > --
> > Kernelnewbies: Help each other learn about the Linux kernel.
> > Archive:       http://mail.nl.linux.org/kernelnewbies/
> > FAQ:           http://kernelnewbies.org/faq/
> >
> >
>
>

--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux