The ops->receive_buf() may be accessed concurrently from these two
functions. If the driver flushes data to the line discipline
receive_buf() method while tiocsti() is using the ops->receive_buf(),
the data race will happen.
For example:
tty_ioctl |tty_ldisc_receive_buf
->tioctsi | ->tty_port_default_receive_buf
| ->tty_ldisc_receive_buf
->hci_uart_tty_receive | ->hci_uart_tty_receive
->h4_recv | ->h4_recv
In this case, the h4 receive buffer will be overwritten by the
latecomer, and it cause a memory leak.
Hence, change tioctsi() function to use the exclusive lock interface
from tty_buffer to avoid the data race.
Signed-off-by: Nguyen Dinh Phi <redacted>
Reported-by: syzbot+97388eb9d31b997fe1d0@syzkaller.appspotmail.com
---
drivers/tty/tty_io.c | 2 ++
1 file changed, 2 insertions(+)
On Sun, Aug 08, 2021 at 03:05:13AM +0800, Nguyen Dinh Phi wrote:
The ops->receive_buf() may be accessed concurrently from these two
functions. If the driver flushes data to the line discipline
receive_buf() method while tiocsti() is using the ops->receive_buf(),
the data race will happen.
For example:
tty_ioctl |tty_ldisc_receive_buf
->tioctsi | ->tty_port_default_receive_buf
| ->tty_ldisc_receive_buf
->hci_uart_tty_receive | ->hci_uart_tty_receive
->h4_recv | ->h4_recv
In this case, the h4 receive buffer will be overwritten by the
latecomer, and it cause a memory leak.
That looks to be a bug in the h4 code, if the receive_buf() call can not
be run at the same time, it should have a lock in it, right?
Hence, change tioctsi() function to use the exclusive lock interface
from tty_buffer to avoid the data race.
Where is the lock being grabbed from the other receive_buf() call path
to ensure that the lock is always needed here?
Did this fix the syzbot reported issue?
thanks,
greg k-h
Yes, this fixed the syzbot reported issue.
The lock is grabbed in flush_to_ldisc() and paste_selection().
Actually, I follow the document in tty_buffer.c, where it say the
callers to receive_buff() other than flush_to_ldisc() need to exclude
the kworker from concurrent use of the line discipline.
And function tiocsti() has the following comment:
/* FIXME: may race normal receive processing */
that why I add lock in this function.
BR,
Phi.
_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees
Did this fix the syzbot reported issue?
thanks,
greg k-h
Yes, this fixed the syzbot reported issue.
The lock is grabbed in flush_to_ldisc() and paste_selection().
Actually, I follow the document in tty_buffer.c, where it say the callers to
receive_buff() other than flush_to_ldisc() need to exclude the kworker from
concurrent use of the line discipline.
And function tiocsti() has the following comment:
/* FIXME: may race normal receive processing */
that why I add lock in this function.
As you are fixing this FIXME, please remove it in this patch, otherwise
we will not know it is resolved :)
Can you add that to the change and submit a new version?
Also, this should go to stable kernels, right? Any idea how far back?
thanks,
greg k-h
_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees
Did this fix the syzbot reported issue?
thanks,
greg k-h
Yes, this fixed the syzbot reported issue.
The lock is grabbed in flush_to_ldisc() and paste_selection().
Actually, I follow the document in tty_buffer.c, where it say the callers to
receive_buff() other than flush_to_ldisc() need to exclude the kworker from
concurrent use of the line discipline.
And function tiocsti() has the following comment:
/* FIXME: may race normal receive processing */
that why I add lock in this function.
As you are fixing this FIXME, please remove it in this patch, otherwise
we will not know it is resolved :)
Can you add that to the change and submit a new version?
Yes, I will submit a new version.
Also, this should go to stable kernels, right? Any idea how far back?
I have no idea about this question, but I see it meets specified
requirements in stable-kernel-rules.rst
BR,
Phi.
_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees