[patch v2 1/1] staging: speakup: fix async usb removal

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



When an external USB synth is unplugged while the module is loaded, we
get a null pointer deref. This is because the tty disappears while
speakup tries to use to to communicate with the synth. This patch fixes
it by checking tty for null before using it. In case of error, it sets
synth->alive to zero and starts ttys.

Signed-off-by: Okash Khawaja <okash.khawaja@xxxxxxxxx>

---
 drivers/staging/speakup/spk_ttyio.c |   25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

--- a/drivers/staging/speakup/spk_ttyio.c
+++ b/drivers/staging/speakup/spk_ttyio.c
@@ -210,13 +210,35 @@ static int spk_ttyio_out(struct spk_synt
 	return 0;
 }
 
+static int check_tty(struct tty_struct *tty)
+{
+	if (!tty) {
+		pr_warn("%s: I/O error, deactivating speakup\n", spk_ttyio_synth->long_name);
+		/* No synth any more, so nobody will restart TTYs, and we thus
+		 * need to do it ourselves.  Now that there is no synth we can
+		 * let application flood anyway
+		 */
+		spk_ttyio_synth->alive = 0;
+		speakup_start_ttys();
+		return 1;
+	}
+
+	return 0;
+}
+
 static void spk_ttyio_send_xchar(char ch)
 {
+	if (check_tty(speakup_tty))
+		return;
+
 	speakup_tty->ops->send_xchar(speakup_tty, ch);
 }
 
 static void spk_ttyio_tiocmset(unsigned int set, unsigned int clear)
 {
+	if (check_tty(speakup_tty))
+		return;
+
 	speakup_tty->ops->tiocmset(speakup_tty, set, clear);
 }
 
@@ -257,6 +279,9 @@ static unsigned char spk_ttyio_in_nowait
 
 static void spk_ttyio_flush_buffer(void)
 {
+	if (check_tty(speakup_tty))
+		return;
+
 	if (speakup_tty->ops->flush_buffer)
 		speakup_tty->ops->flush_buffer(speakup_tty);
 }
_______________________________________________
Speakup mailing list
Speakup@xxxxxxxxxxxxxxxxx
http://linux-speakup.org/cgi-bin/mailman/listinfo/speakup




[Index of Archives]     [Linux for the Blind]     [Fedora Discussioin]     [Linux Kernel]     [Yosemite News]     [Big List of Linux Books]
  Powered by Linux