aboutsummaryrefslogtreecommitdiff
path: root/src/mm-port-serial.c
diff options
context:
space:
mode:
authorBrian, Sam <Samuel.Brian@digi.com>2018-06-22 01:50:20 +0000
committerAleksander Morgado <aleksander@aleksander.es>2018-06-22 10:54:01 +0200
commitbb9e9a92a325b955ee839565618f13a2a0bf4cf0 (patch)
treed2edea62f3d7d901c627a219d389d42dc2f02b9d /src/mm-port-serial.c
parentefd57e8d5b2e0ced4ab857d72af0e86ae0bbf3f8 (diff)
port-serial: don't close tty file descriptor twice
After the tty is opened, the fd is passed off to a GIOChannel which manages it. When the serial port is closed with _close_internal(), g_io_channel_shutdown() is called which then calls g_io_unix_close() which in turn close()s the fd. _close_internal() performs a second explicit close() after the g_io_channel_shutdown() which *in the best case scenario* will fail with EBADF. This is a race condition that can result in other file descriptors being closed. This change avoids double closing the serial port fd -- the shutdown() call is removed in favour of the explicit close().
Diffstat (limited to 'src/mm-port-serial.c')
-rw-r--r--src/mm-port-serial.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/mm-port-serial.c b/src/mm-port-serial.c
index 44699a76..225a684e 100644
--- a/src/mm-port-serial.c
+++ b/src/mm-port-serial.c
@@ -1263,7 +1263,6 @@ error:
mm_warn ("(%s) failed to open serial device", device);
if (self->priv->iochannel) {
- g_io_channel_shutdown (self->priv->iochannel, FALSE, NULL);
g_io_channel_unref (self->priv->iochannel);
self->priv->iochannel = NULL;
}
@@ -1351,7 +1350,9 @@ _close_internal (MMPortSerial *self, gboolean force)
/* Destroy channel */
if (self->priv->iochannel) {
data_watch_enable (self, FALSE);
- g_io_channel_shutdown (self->priv->iochannel, TRUE, NULL);
+ /* unref() without g_io_channel_shutdown() to destroy the channel
+ * without closing the fd. The close() is called explicitly after.
+ */
g_io_channel_unref (self->priv->iochannel);
self->priv->iochannel = NULL;
}