2004-10-05 05:29:41

by Roland Dreier

[permalink] [raw]
Subject: proper way to annotate kernel use of sys_xxx?

What is the correct way to annotate kernel code that calls a sys_xxx
function that expects a __user pointer as an argument?

To give a concrete example, sparse (among lots of other warnings for
do_mounts.c) says:

init/do_mounts.c:69:16: warning: incorrect type in argument 1 (different address spaces)
init/do_mounts.c:69:16: expected char const [noderef] *filename<asn:1>
init/do_mounts.c:69:16: got char [addressable] *<noident>

The code in question is the following:

char path[64];

/* ... */

sprintf(path, "/sys/block/%s/dev", name);
fd = sys_open(path, 0, 0); /* LINE 69 */

This is an abuse of sys_open(), but we know it's OK. Is the right way
to shut up sparse to just change it to:

fd = sys_open((const char __user *) path, 0, 0);

Thanks,
Roland


2004-10-05 08:34:52

by Arnd Bergmann

[permalink] [raw]
Subject: Re: proper way to annotate kernel use of sys_xxx?

On Dienstag, 5. Oktober 2004 07:28, Roland Dreier wrote:
> This is an abuse of sys_open(), but we know it's OK. ?Is the right way
> to shut up sparse to just change it to:
>
> ????????fd = sys_open((const char __user *) path, 0, 0);
>
No, that's wrong, see
http://marc.theaimsgroup.com/?l=linux-kernel&m=108697882525067 ;-)

In this case, you can easily convert the calls to use
filp_open/vfs_read/filp_close, though I'm not sure if that's
the correct solution either.

Arnd <><


Attachments:
(No filename) (483.00 B)
(No filename) (189.00 B)
signature
Download all attachments

2004-10-05 17:23:53

by Roland Dreier

[permalink] [raw]
Subject: Re: proper way to annotate kernel use of sys_xxx?

Arnd> In this case, you can easily convert the calls to use
Arnd> filp_open/vfs_read/filp_close, though I'm not sure if that's
Arnd> the correct solution either.

For the do_mounts.c code, I see how the call to sys_open() could be
replaced with a call to filp_open(). However, vfs_read() still takes
a __user pointer for its buffer argument -- in fact, even the
filesystem .aio_read method takes a __user pointer. So I'm not sure
how this code should be fixed.

Thanks,
Roland