copy_from_user() and block_write question

From: Stephane Eranian (eranian@cello.hpl.hp.com)
Date: Thu Jan 27 2000 - 03:07:12 EST


Hi,

Could someone explain to me what was the intent of the following
piece of code (extracted from linux-2.3.35 in fs/buffer.c) ?

int block_write_zero_range(struct inode *inode, struct page *page,
                unsigned zerofrom, unsigned from, unsigned to,
                const char * buf)
{
        ....

        /*
         * Now we can copy the data.
         */
        if (zerofrom < from)
                memset(kaddr+zerofrom, 0, from-zerofrom);
        if (from < to)
>>>> err = copy_from_user(kaddr+from, buf, to-from);
        if (to < zeroto)
                memset(kaddr+to, 0, zeroto-to);
        else
                zeroto = to;
>>>>> if (err < 0)
                goto out;

copy_from_user() always returns something that is >= 0 so the test
err < 0 is never taken. In this case, isn't the use of err for
copy_from_user() kind of confusing ?

I understand that POSIX does not define the behavior of write when
you have a wild pointer. That's the behavior that you get here:
write never fails because buf is invalid. I have seen systems where
the behavior is to return EFAULT though.

Any comments ?

+--------------------------------------------------------------------+
| Ste'phane ERANIAN | Email eranian@hpl.hp.com |
| Hewlett-Packard Laboratories | |
| 1501, Page Mill Road MS 1U-15 | |
| Palo Alto, CA 94303-096 | |
| USA | |
| Tel : (650) 857-7174 | |
| Fax : (650) 857-5548 | |
+--------------------------------------------------------------------+

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



This archive was generated by hypermail 2b29 : Mon Jan 31 2000 - 21:00:17 EST