[PATCH 4.4 35/45] virtio-console: avoid DMA from stack

2017-04-19 Thread Greg Kroah-Hartman
4.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Omar Sandoval 

commit c4baad50297d84bde1a7ad45e50c73adae4a2192 upstream.

put_chars() stuffs the buffer it gets into an sg, but that buffer may be
on the stack. This breaks with CONFIG_VMAP_STACK=y (for me, it
manifested as printks getting turned into NUL bytes).

Signed-off-by: Omar Sandoval 
Signed-off-by: Michael S. Tsirkin 
Reviewed-by: Amit Shah 
Cc: Ben Hutchings 
Cc: Brad Spengler 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/char/virtio_console.c |   12 ++--
 1 file changed, 10 insertions(+), 2 deletions(-)

--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -1130,6 +1130,8 @@ static int put_chars(u32 vtermno, const
 {
struct port *port;
struct scatterlist sg[1];
+   void *data;
+   int ret;
 
if (unlikely(early_put_chars))
return early_put_chars(vtermno, buf, count);
@@ -1138,8 +1140,14 @@ static int put_chars(u32 vtermno, const
if (!port)
return -EPIPE;
 
-   sg_init_one(sg, buf, count);
-   return __send_to_port(port, sg, 1, count, (void *)buf, false);
+   data = kmemdup(buf, count, GFP_ATOMIC);
+   if (!data)
+   return -ENOMEM;
+
+   sg_init_one(sg, data, count);
+   ret = __send_to_port(port, sg, 1, count, data, false);
+   kfree(data);
+   return ret;
 }
 
 /*




[PATCH 4.4 35/45] virtio-console: avoid DMA from stack

2017-04-19 Thread Greg Kroah-Hartman
4.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Omar Sandoval 

commit c4baad50297d84bde1a7ad45e50c73adae4a2192 upstream.

put_chars() stuffs the buffer it gets into an sg, but that buffer may be
on the stack. This breaks with CONFIG_VMAP_STACK=y (for me, it
manifested as printks getting turned into NUL bytes).

Signed-off-by: Omar Sandoval 
Signed-off-by: Michael S. Tsirkin 
Reviewed-by: Amit Shah 
Cc: Ben Hutchings 
Cc: Brad Spengler 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/char/virtio_console.c |   12 ++--
 1 file changed, 10 insertions(+), 2 deletions(-)

--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -1130,6 +1130,8 @@ static int put_chars(u32 vtermno, const
 {
struct port *port;
struct scatterlist sg[1];
+   void *data;
+   int ret;
 
if (unlikely(early_put_chars))
return early_put_chars(vtermno, buf, count);
@@ -1138,8 +1140,14 @@ static int put_chars(u32 vtermno, const
if (!port)
return -EPIPE;
 
-   sg_init_one(sg, buf, count);
-   return __send_to_port(port, sg, 1, count, (void *)buf, false);
+   data = kmemdup(buf, count, GFP_ATOMIC);
+   if (!data)
+   return -ENOMEM;
+
+   sg_init_one(sg, data, count);
+   ret = __send_to_port(port, sg, 1, count, data, false);
+   kfree(data);
+   return ret;
 }
 
 /*