Shutdown direct reading after service termination 16/263916/3 accepted/tizen/6.5/unified/20211028.093915 accepted/tizen/unified/20210915.001811 submit/tizen/20210914.100900 submit/tizen_6.5/20211028.161601 tizen_6.5.m2_release
authorShinwoo Kim <cinoo.kim@samsung.com>
Mon, 13 Sep 2021 10:01:10 +0000 (19:01 +0900)
committerShinwoo Kim <cinoo.kim@samsung.com>
Tue, 14 Sep 2021 10:04:38 +0000 (19:04 +0900)
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

src/dbus_direct_reading_adapter.c
src/main.c

index f5d50cdff8b12b91fbdcfd3d97ed61f896da34eb..ed3a56f04eee213d0a021a6774449427ce1c206d 100644 (file)
@@ -247,13 +247,17 @@ void dbus_direct_reading_shutdown(Reading_Adapter_Data *ra)
        }
 
        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]");
 }
index d7a53ef76598a7a71d38bdd2db9d414e2fad447a..6138dfb3b9bd6afdc90354679bb1de8f84dcb5b3 100644 (file)
@@ -266,10 +266,10 @@ static int app_terminate(void *data)
        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();