[PATCH] libqmi-glib,device: avoid closing same file descriptor twice
Dan Williams
dcbw at redhat.com
Fri Jun 29 02:44:24 UTC 2018
On Thu, 2018-06-28 at 14:47 -0700, Ben Chan wrote:
> The GUnixInputStream and GUnixOutputStream object created in
> create_iostream_with_fd() references the same file descriptor and are
> both set to close the file descriptor when the stream is closed. That
> leads to the same file descriptor being closed twice, which isn't
> desirable. This patch addresses the issue by having the QmiDevice
> object
> to keep track of the file descriptor and close it, which avoids
> any potential race condition in the future.
LGTM
> The issue was observed by Eric Caruso <ejcaruso at chromium.org>
> ---
> src/libqmi-glib/qmi-device.c | 19 +++++++++++++------
> 1 file changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/src/libqmi-glib/qmi-device.c b/src/libqmi-glib/qmi-
> device.c
> index 2bf6a40..c793171 100644
> --- a/src/libqmi-glib/qmi-device.c
> +++ b/src/libqmi-glib/qmi-device.c
> @@ -107,6 +107,7 @@ struct _QmiDevicePrivate {
> GArray *supported_services;
>
> /* I/O stream, set when the file is open */
> + gint fd;
> GInputStream *istream;
> GOutputStream *ostream;
> GSource *input_source;
> @@ -125,6 +126,8 @@ struct _QmiDevicePrivate {
>
> #define BUFFER_SIZE 2048
>
> +static void destroy_iostream (QmiDevice *self);
> +
> /*******************************************************************
> **********/
> /* Message transactions (private) */
>
> @@ -1603,10 +1606,7 @@ setup_iostream (GTask *task)
>
> /* Check in/out streams */
> if (!self->priv->istream || !self->priv->ostream) {
> - g_clear_object (&self->priv->istream);
> - g_clear_object (&self->priv->ostream);
> - g_clear_object (&self->priv->socket_connection);
> - g_clear_object (&self->priv->socket_client);
> + destroy_iostream (self);
> g_task_return_new_error (task,
> QMI_CORE_ERROR,
> QMI_CORE_ERROR_FAILED,
> @@ -1649,8 +1649,10 @@ create_iostream_with_fd (GTask *task)
> return;
> }
>
> - self->priv->istream = g_unix_input_stream_new (fd, TRUE);
> - self->priv->ostream = g_unix_output_stream_new (fd, TRUE);
> + g_assert (self->priv->fd < 0);
> + self->priv->fd = fd;
> + self->priv->istream = g_unix_input_stream_new (fd, FALSE);
> + self->priv->ostream = g_unix_output_stream_new (fd, FALSE);
>
> setup_iostream (task);
> }
> @@ -2417,6 +2419,10 @@ destroy_iostream (QmiDevice *self)
> g_clear_object (&self->priv->ostream);
> g_clear_object (&self->priv->socket_connection);
> g_clear_object (&self->priv->socket_client);
> + if (self->priv->fd >= 0) {
> + close (self->priv->fd);
> + self->priv->fd = -1;
> + }
> }
>
> #if defined MBIM_QMUX_ENABLED
> @@ -3016,6 +3022,7 @@ qmi_device_init (QmiDevice *self)
> NULL,
> g_object
> _unref);
> self->priv->proxy_path = g_strdup (QMI_PROXY_SOCKET_PATH);
> + self->priv->fd = -1;
> }
>
> static gboolean
More information about the libqmi-devel
mailing list