On Sat, Jul 7, 2018 at 1:29 AM Samuel Thibault <samuel.thibault@xxxxxxxxxxxx> wrote: > > Re, > > Could you review, test, and resubmit the patch below instead? Er... you mean, you want me to take your patch, add my Signed-off-by below yours, and then send that? > Samuel > > > If softsynthx_read() is called with `count < 3`, `count - 3` wraps, causing > the loop to copy as much data as available to the provided buffer. If > softsynthx_read() is invoked through sys_splice(), this causes an > unbounded kernel write; but even when userspace just reads from it > normally, a small size could cause userspace crashes. This looks sane to me. I've also tested it, and it seems to work. Some random thing I noticed, but I don't think it has anything to do with this issue: In some runs, when the console is repeatedly printing "Debian GNU/Linux 9 debian tty1\n\ndebian login: " in response to me pressing enter repeatedly, /dev/softsynthu (read in 1-byte steps) seems to return things like "Debian GNU slash Linux 9 debian tty1 \n debi login: ". I don't understand why it sometimes says "debi login" instead of "debian login". > Fixes: 425e586cf95b ("speakup: add unicode variant of /dev/softsynth") > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx> > > --- a/drivers/staging/speakup/speakup_soft.c > +++ b/drivers/staging/speakup/speakup_soft.c > @@ -198,11 +198,15 @@ static ssize_t softsynthx_read(struct fi > int chars_sent = 0; > char __user *cp; > char *init; > + size_t bytes_per_ch = unicode ? 3 : 1; > u16 ch; > int empty; > unsigned long flags; > DEFINE_WAIT(wait); > > + if (count < bytes_per_ch) > + return -EINVAL; > + > spin_lock_irqsave(&speakup_info.spinlock, flags); > while (1) { > prepare_to_wait(&speakup_event, &wait, TASK_INTERRUPTIBLE); > @@ -228,7 +232,7 @@ static ssize_t softsynthx_read(struct fi > init = get_initstring(); > > /* Keep 3 bytes available for a 16bit UTF-8-encoded character */ > - while (chars_sent <= count - 3) { > + while (chars_sent <= count - bytes_per_ch) { > if (speakup_info.flushing) { > speakup_info.flushing = 0; > ch = '\x18'; _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel