From 3e51bdfd2c31e1f3bdb3a65f6480950ba360b8e6 Mon Sep 17 00:00:00 2001 From: Ahmad Fatoum Date: Fri, 20 Sep 2019 09:58:10 +0200 Subject: console: disallow opening for writing when no write method defined Some consoles, like the input console (usually /dev/cs0), don't feature a puts or putc callback. Trying to echo out of them would thus crash: barebox@Embest MarS Board i.MX6Dual:/ echo -a /dev/cs0 prefetch abort pc : [<00000004>] lr : [<4fd05071>] WARNING: [<...>] (fops_write+0xd/0x10) WARNING: [<...>] (devfs_write+0x21/0x2a) WARNING: [<...>] (__write+0xcb/0xf0) WARNING: [<...>] (write+0x2d/0x68) WARNING: [<...>] (dputc+0x31/0x34) WARNING: [<...>] (do_echo+0xcb/0x144) Fix this by only allowing open(.., O_WRONLY) or open(..., O_RDWR) when puts is defined. Consoles defining putc are covered by this as well as those have putc-calling __console_puts assigned as their puts when they are registered. Now echo -a /dev/cs0 would yield: open: Operation not permitted Signed-off-by: Ahmad Fatoum Signed-off-by: Sascha Hauer --- common/console.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'common') diff --git a/common/console.c b/common/console.c index d04aae58f9..e6e029848d 100644 --- a/common/console.c +++ b/common/console.c @@ -272,6 +272,9 @@ static int fops_open(struct cdev *cdev, unsigned long flags) { struct console_device *priv = cdev->priv; + if ((flags & (O_WRONLY | O_RDWR)) && !priv->puts ) + return -EPERM; + return console_open(priv); } -- cgit v1.2.3