serial: fix cleanup of flash function (rh #591728)
The flash function could be called when the port was closed, and since the flash function would only be canceled when the port was open, it could trigger after the port object was destroyed.
This commit is contained in:
@@ -44,6 +44,7 @@ mm_serial_error_get_type (void)
|
|||||||
ENUM_ENTRY (MM_SERIAL_ERROR_RESPONSE_TIMEOUT, "SerialResponseTimeout"),
|
ENUM_ENTRY (MM_SERIAL_ERROR_RESPONSE_TIMEOUT, "SerialResponseTimeout"),
|
||||||
ENUM_ENTRY (MM_SERIAL_ERROR_OPEN_FAILED_NO_DEVICE, "SerialOpenFailedNoDevice"),
|
ENUM_ENTRY (MM_SERIAL_ERROR_OPEN_FAILED_NO_DEVICE, "SerialOpenFailedNoDevice"),
|
||||||
ENUM_ENTRY (MM_SERIAL_ERROR_FLASH_FAILED, "SerialFlashFailed"),
|
ENUM_ENTRY (MM_SERIAL_ERROR_FLASH_FAILED, "SerialFlashFailed"),
|
||||||
|
ENUM_ENTRY (MM_SERIAL_ERROR_NOT_OPEN, "SerialNotOpen"),
|
||||||
{ 0, 0, 0 }
|
{ 0, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -25,6 +25,7 @@ enum {
|
|||||||
MM_SERIAL_ERROR_RESPONSE_TIMEOUT = 2,
|
MM_SERIAL_ERROR_RESPONSE_TIMEOUT = 2,
|
||||||
MM_SERIAL_ERROR_OPEN_FAILED_NO_DEVICE = 3,
|
MM_SERIAL_ERROR_OPEN_FAILED_NO_DEVICE = 3,
|
||||||
MM_SERIAL_ERROR_FLASH_FAILED = 4,
|
MM_SERIAL_ERROR_FLASH_FAILED = 4,
|
||||||
|
MM_SERIAL_ERROR_NOT_OPEN = 5,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MM_SERIAL_ERROR (mm_serial_error_quark ())
|
#define MM_SERIAL_ERROR (mm_serial_error_quark ())
|
||||||
|
@@ -814,10 +814,7 @@ mm_serial_port_close (MMSerialPort *self)
|
|||||||
priv->channel = NULL;
|
priv->channel = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (priv->flash_id > 0) {
|
mm_serial_port_flash_cancel (self);
|
||||||
g_source_remove (priv->flash_id);
|
|
||||||
priv->flash_id = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
tcsetattr (priv->fd, TCSANOW, &priv->old_t);
|
tcsetattr (priv->fd, TCSANOW, &priv->old_t);
|
||||||
close (priv->fd);
|
close (priv->fd);
|
||||||
@@ -1032,6 +1029,15 @@ mm_serial_port_flash (MMSerialPort *self,
|
|||||||
|
|
||||||
priv = MM_SERIAL_PORT_GET_PRIVATE (self);
|
priv = MM_SERIAL_PORT_GET_PRIVATE (self);
|
||||||
|
|
||||||
|
if (!mm_serial_port_is_open (self)) {
|
||||||
|
error = g_error_new_literal (MM_SERIAL_ERROR,
|
||||||
|
MM_SERIAL_ERROR_NOT_OPEN,
|
||||||
|
"The serial port is not open.");
|
||||||
|
callback (self, error, user_data);
|
||||||
|
g_error_free (error);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (priv->flash_id > 0) {
|
if (priv->flash_id > 0) {
|
||||||
error = g_error_new_literal (MM_MODEM_ERROR,
|
error = g_error_new_literal (MM_MODEM_ERROR,
|
||||||
MM_MODEM_ERROR_OPERATION_IN_PROGRESS,
|
MM_MODEM_ERROR_OPERATION_IN_PROGRESS,
|
||||||
@@ -1215,6 +1221,8 @@ dispose (GObject *object)
|
|||||||
if (mm_serial_port_is_open (MM_SERIAL_PORT (object)))
|
if (mm_serial_port_is_open (MM_SERIAL_PORT (object)))
|
||||||
mm_serial_port_close_force (MM_SERIAL_PORT (object));
|
mm_serial_port_close_force (MM_SERIAL_PORT (object));
|
||||||
|
|
||||||
|
mm_serial_port_flash_cancel (MM_SERIAL_PORT (object));
|
||||||
|
|
||||||
G_OBJECT_CLASS (mm_serial_port_parent_class)->dispose (object);
|
G_OBJECT_CLASS (mm_serial_port_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user