OSDN Git Service

virtio_console: fix sparse warnings
authorMichael S. Tsirkin <mst@redhat.com>
Mon, 1 Dec 2014 11:31:45 +0000 (13:31 +0200)
committerMichael S. Tsirkin <mst@redhat.com>
Tue, 9 Dec 2014 10:06:33 +0000 (12:06 +0200)
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_buf
drivers/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_buf
drivers/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.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
drivers/char/virtio_console.c

index 6cc832b..de03df9 100644 (file)
@@ -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)