projects
/
openwrt
/
staging
/
blogic.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
f889491
)
virtio-console: avoid DMA from stack
author
Omar Sandoval
<
[email protected]
>
Wed, 1 Feb 2017 08:02:27 +0000
(
00:02
-0800)
committer
Michael S. Tsirkin
<
[email protected]
>
Wed, 1 Mar 2017 23:35:06 +0000
(
01:35
+0200)
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 <
[email protected]
>
Signed-off-by: Michael S. Tsirkin <
[email protected]
>
Reviewed-by: Amit Shah <
[email protected]
>
drivers/char/virtio_console.c
patch
|
blob
|
history
diff --git
a/drivers/char/virtio_console.c
b/drivers/char/virtio_console.c
index 6266c0568e1d0a3e6526723a66490c932216fb56..e9b7e0b3cabe60d3be3ab8a092159b137854d8ec 100644
(file)
--- a/
drivers/char/virtio_console.c
+++ b/
drivers/char/virtio_console.c
@@
-1136,6
+1136,8
@@
static int put_chars(u32 vtermno, const char *buf, int count)
{
struct port *port;
struct scatterlist sg[1];
+ void *data;
+ int ret;
if (unlikely(early_put_chars))
return early_put_chars(vtermno, buf, count);
@@
-1144,8
+1146,14
@@
static int put_chars(u32 vtermno, const char *buf, int count)
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;
}
/*