Hi Prasad
On Thu, Aug 7, 2008 at 8:50 AM, Prasad Joshi <[EMAIL PROTECTED]> wrote:
> ssize_t my_write(struct file *filp, const char __user *buf, size_t len,
> loff_t *ppos)
> {
> size_t ret;
> char *data = kmalloc(sizeof(char)*len, GFP_KERNEL);
>
> copy_from_user(data, buf, len);
> encrypt_data(data, len);
> ret = do_sync_write(filp, data, len, ppos);
>
> kfree(data);
> return ret;
> }
>
> After running the code and writing data to the file using echo "test" >
> /mnt_pt/file I am getting bad address error
>
> Is it because do_sync_write() also expects buf pointer from the userspace?
> ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len,
> loff_t *ppos)
>
> But, the only thing do_sync_write should be concerned with whether it can
> access the data pointer or not. So, if the data pointer is valid and kernel
> is able to access the location why so worry about userspace pointer?
Either your suspicion is right, or the write isn't finished yet but
you already kfree()-ed the buffer. The reason why I suspected that is
this line:
if (-EIOCBQUEUED == ret)
ret = wait_on_sync_kiocb(&kiocb);
in do_sync_write(). Thus, what you further need is probably check the
return value and act accordingly.
I'm not really fs guy...so this is the best idea I can suggest so far.
regards,
Mulyadi.
--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to [EMAIL PROTECTED]
Please read the FAQ at http://kernelnewbies.org/FAQ