screen_reader_terminate_service can use direct reading interface as below.
screen_reader_terminate_service >
stop_speaking > stop_speaking > tts_stop > (tts internal stack) >
tw_state_changed_cb > overwrite_last_read_command_with >
dispose_read_command > _reading_status_notify >
dbus_direct_reading_adapter_emit > eldbus_service_signal_emit
At this point screen-reader got a signal SIGSEGV,
because direct reading interface is unregistered already.
This patch set changes order of termination and adds some safety++ lines
to prevent referencing after free.
(Reference:
DF210913-00141)
Change-Id: I93afad34c38b1d7f7ec66c255016de19f5d9bf53
}
DEBUG("[START]");
- if (ra->iface)
+ if (ra->iface) {
eldbus_service_object_unregister(ra->iface);
- if (ra->conn)
+ ra->iface = NULL;
+ }
+ if (ra->conn) {
eldbus_connection_unref(ra->conn);
-
+ ra->conn = NULL;
+ }
utils_a11y_bus_connection_set(NULL);
free(ra);
+ ra = NULL;
DEBUG("[END]");
}
DEBUG("terminate navigator");
navigator_shutdown(sd->navigator_data);
#endif
- DEBUG("terminate direct reading");
- dbus_direct_reading_shutdown(sd->reading_adapter_data);
DEBUG("terminate service");
screen_reader_terminate_service(sd);
+ DEBUG("terminate direct reading");
+ dbus_direct_reading_shutdown(sd->reading_adapter_data);
DEBUG("libatspi terminated");
atspi_exit();