virtio_console: fix sparse warnings
Subsystems (3)
Michael S. Tsirkin
maintainerPATCH 1/1 virtio_console: fix sparse warnings
CHECK drivers/char/virtio_console.c drivers/char/virtio_console.c:687:36: warning: incorrect type in
argument 1 (different address spaces)drivers/char/virtio_console.c:687:36: expected void [noderef]
<asn:1>*to
drivers/char/virtio_console.c:687:36: got char *out_bufdrivers/char/virtio_console.c:790:35: warning: incorrect type in
argument 2 (different address spaces)drivers/char/virtio_console.c:790:35: expected char *out_bufdrivers/char/virtio_console.c:790:35: got char [noderef]
<asn:1>*ubuf
fill_readbuf is reused with both kernel and userspace pointers, depending on value of to_user flag.
Tag address parameter as __user, and cast to/from regular pointer type when we know it's safe.
--- drivers/char/virtio_console.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/char/virtio_console.c +5 -4
@@ -669,8 +669,8 @@ done:* Give out the data that's requested from the buffer that we have * queued up. */ -static ssize_t fill_readbuf (struct port *port,char *out_buf,size_t out_count, -bool to_user) +static ssize_t fill_readbuf (struct port *port,char __user *out_buf, +size_t out_count,bool to_user) {struct port_buffer *buf;unsigned long flags;
@@ -688,7 +688,8 @@ static ssize_t fill_readbuf(struct port *port, char *out_buf, size_t out_count,if (ret)return -EFAULT ; }else { -memcpy (out_buf, buf->buf + buf->offset, out_count); +memcpy ((__force char *)out_buf, buf->buf + buf->offset, + out_count); } buf->offset += out_count;
@@ -1162,7 +1163,7 @@ static int get_chars(u32 vtermno, char *buf, int count)/* If we don't have an input queue yet, we can't get input. */ BUG_ON (!port->in_vq); -return fill_readbuf (port, buf, count, false); +return fill_readbuf (port, (__force char __user *)buf, count, false); }static void resize_console (struct port *port)
Signature · 1 line
MST
Greg Kroah-Hartman
maintainerQuoted 10 lines · Michael S. Tsirkin
CHECK
drivers/char/virtio_console.cdrivers/char/virtio_console.c:687:36: warning: incorrect type in
argument 1 (different address spaces)drivers/char/virtio_console.c:687:36: expected void [noderef]<asn:1>*to
drivers/char/virtio_console.c:687:36: got char*out_bufdrivers/char/virtio_console.c:790:35: warning: incorrect type in
argument 2 (different address spaces)drivers/char/virtio_console.c:790:35: expected char*out_bufdrivers/char/virtio_console.c:790:35: got char [noderef]
Quoted 4 lines
<asn:1>*ubuf
fill_readbufis reused with both kernel and userspace pointers, depending on value ofto_userflag.
That's horrid, don't do that. Have two different functions for this type of thing, otherwise you defeat the whole purpose of trying to track __user pointers.
thanks,
greg k-h