Skip to content

Commit 0be6a94

Browse files
RDK-52204: fixed the crashed issue dueto double free() while stopping
Signed-off-by: yuvaramachandran_gurusamy <[email protected]>
1 parent 8c57e7b commit 0be6a94

16 files changed

+681
-438
lines changed

server/gdial-app.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,6 @@ static void gdial_app_class_init (GDialAppClass *klass) {
172172
G_TYPE_NONE, 1, /* return type, arg num */
173173
G_TYPE_POINTER); /* arg types */
174174

175-
gdial_plat_init(g_main_context_default());
176175
gdial_plat_application_set_state_cb(gdial_plat_app_state_cb, NULL);
177176
}
178177

@@ -343,6 +342,7 @@ void gdial_app_set_additional_dial_data(GDialApp *app, GHashTable *additional_di
343342
gdial_app_write_additional_dial_data(app->name, query_str, length);
344343
}
345344
g_free(query_str);
345+
query_str = NULL;
346346
}
347347

348348
GHashTable *gdial_app_get_additional_dial_data(GDialApp *app) {
@@ -368,9 +368,13 @@ void gdial_app_refresh_additional_dial_data(GDialApp *app) {
368368
/* we are ready to convert to hashtable*/
369369
gdial_util_str_str_hashtable_from_string(data, length, priv->additional_dial_data);
370370
GDIAL_LOGINFO("gdial_app_refresh_additional_dial_data [%s]", data);
371-
g_free(data);
372371
}
373372
}
373+
if (data) {
374+
g_free(data);
375+
data = NULL;
376+
}
377+
374378
GDIAL_LOGTRACE("Exiting ...");
375379
}
376380

@@ -428,6 +432,7 @@ GDIAL_STATIC gboolean gdial_app_write_additional_dial_data(const gchar *app_name
428432
}
429433
g_object_unref(gfile);
430434
g_free(filename);
435+
filename = NULL;
431436

432437
return result;
433438
}
@@ -473,6 +478,7 @@ GDIAL_STATIC gboolean gdial_app_read_additional_dial_data(const gchar *app_name,
473478

474479
g_object_unref(gfile);
475480
g_free(filename);
481+
filename = NULL;
476482

477483
GDIAL_LOGTRACE("Exiting ...");
478484

@@ -494,6 +500,7 @@ GDIAL_STATIC gboolean gdial_app_remove_additional_dial_data_file(const gchar *ap
494500
}
495501
g_object_unref(gfile);
496502
g_free(filename);
503+
filename = NULL;
497504

498505
return result;
499506
}

server/gdial-rest.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ static gboolean gdial_soup_message_security_check(SoupMessage *msg) {
7676
}
7777

7878
static void gdial_soup_message_set_http_error(SoupMessage *msg, guint state_code) {
79-
GDIAL_LOGERROR("%s::uri=%s::state_code=%d", __FUNCTION__, soup_uri_get_path(soup_message_get_uri(msg)), state_code);
79+
GDIAL_LOGERROR("uri[%s] state_code[%d]", soup_uri_get_path(soup_message_get_uri(msg)), state_code);
8080
soup_message_headers_replace(msg->response_headers, "Connection", "close");
8181
soup_message_set_status(msg, state_code);
8282
return;
@@ -931,7 +931,10 @@ static void gdial_rest_http_server_apps_callback(SoupServer *server,
931931
static void gdial_rest_server_dispose(GObject *object) {
932932
GDialRestServerPrivate *priv = gdial_rest_server_get_instance_private(GDIAL_REST_SERVER(object));
933933
soup_server_remove_handler(priv->soup_instance, GDIAL_REST_HTTP_APPS_URI);
934-
if(GDIAL_REST_HTTP_APPS_URI) g_free(GDIAL_REST_HTTP_APPS_URI);
934+
if(GDIAL_REST_HTTP_APPS_URI) {
935+
g_free(GDIAL_REST_HTTP_APPS_URI);
936+
GDIAL_REST_HTTP_APPS_URI = NULL;
937+
}
935938
g_object_unref(priv->soup_instance);
936939
g_object_unref(priv->local_soup_instance);
937940
while (priv->registered_apps) {

server/gdial-shield.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ static GHashTable *active_conns_ = NULL;
3434

3535
static void soup_message_weak_ref_callback(gpointer user_data, GObject *obj);
3636
static void server_request_remove_callback (SoupMessage *msg) {
37+
GDIAL_LOGTRACE("Entering ...");
3738
DialShieldConnectionContext * conn_context = (DialShieldConnectionContext *) g_hash_table_lookup(active_conns_, msg);
3839
if (conn_context) {
3940
if (conn_context->read_timeout_source != 0) {
@@ -43,51 +44,64 @@ static void server_request_remove_callback (SoupMessage *msg) {
4344
}
4445
g_hash_table_remove(active_conns_, msg);
4546
g_free(conn_context);
47+
conn_context = NULL;
4648
}
49+
GDIAL_LOGTRACE("Exiting ...");
4750
}
4851

4952
static gboolean soup_message_read_timeout_callback(gpointer user_data) {
5053
SoupMessage *msg = (SoupMessage*)user_data;
54+
GDIAL_LOGTRACE("Entering ...");
5155
DialShieldConnectionContext * conn_context = (DialShieldConnectionContext *)g_hash_table_lookup(active_conns_, msg);
5256
g_print_with_timestamp("soup_message_read_timeout_callback tid=[%lx] msg=%p", pthread_self(), msg);
5357
if (conn_context) {
5458
conn_context->read_timeout_source = 0;
5559
g_socket_close(conn_context->read_gsocket, NULL);//this will trigger abort callback
5660
}
61+
GDIAL_LOGTRACE("Exiting ...");
5762
return G_SOURCE_REMOVE;;
5863
}
5964

6065

6166
static void server_request_read_callback (SoupServer *server, SoupMessage *msg,
6267
SoupClientContext *context, gpointer data) {
68+
GDIAL_LOGTRACE("Entering ...");
6369
g_print_with_timestamp("server_request_read_callback tid=[%lx] msg=%p", pthread_self(), msg);
6470
g_object_weak_unref(G_OBJECT(msg), (GWeakNotify)soup_message_weak_ref_callback, msg);
6571
server_request_remove_callback(msg);
72+
GDIAL_LOGTRACE("Exiting ...");
6673
}
6774

6875
static void server_request_finished_callback (SoupServer *server, SoupMessage *msg,
6976
SoupClientContext *context, gpointer data) {
77+
GDIAL_LOGTRACE("!!!");
7078
}
7179

7280
static void server_request_aborted_callback (SoupServer *server, SoupMessage *msg,
7381
SoupClientContext *context, gpointer data) {
82+
GDIAL_LOGTRACE("Entering ...");
7483
g_print_with_timestamp("server_request_aborted_callback tid=[%lx] msg=%p", pthread_self(), msg);
84+
7585
g_object_weak_unref(G_OBJECT(msg), (GWeakNotify)soup_message_weak_ref_callback, msg);
7686
server_request_remove_callback(msg);
87+
GDIAL_LOGTRACE("Exiting ...");
7788
}
7889

7990
static void soup_message_weak_ref_callback(gpointer user_data, GObject *obj) {
8091
SoupMessage *msg0=(SoupMessage*)obj;
8192
SoupMessage *msg=(SoupMessage*)user_data;
93+
GDIAL_LOGTRACE("Entering ...");
8294
assert(msg0==msg);
8395
g_print_with_timestamp("soup_message_weak_ref_callback tid=[%lx] msg=%p", pthread_self(), msg);
8496
server_request_remove_callback(msg);
97+
GDIAL_LOGTRACE("Exiting ...");
8598
}
8699

87100
static void server_request_started_callback (SoupServer *server, SoupMessage *msg,
88101
SoupClientContext *context, gpointer data) {
89102

90103
static const int throttle = GDIAL_THROTTLE_DELAY_US;
104+
GDIAL_LOGTRACE("Entering ...");
91105
DialShieldConnectionContext *conn_context = g_new(DialShieldConnectionContext, 1);
92106
guint read_timeout_source = g_timeout_add(2000, (GSourceFunc)soup_message_read_timeout_callback, msg);
93107
conn_context->read_gsocket = soup_client_context_get_gsocket(context);
@@ -97,23 +111,30 @@ static void server_request_started_callback (SoupServer *server, SoupMessage *ms
97111
g_hash_table_insert(active_conns_, msg, conn_context);
98112
g_object_weak_ref(G_OBJECT(msg), (GWeakNotify)soup_message_weak_ref_callback, msg);
99113
usleep(throttle);
114+
GDIAL_LOGTRACE("Exiting ...");
100115
}
101116

102117
void gdial_shield_init(void) {
118+
GDIAL_LOGTRACE("Entering ...");
103119
active_conns_ = g_hash_table_new(g_direct_hash, g_direct_equal);
120+
GDIAL_LOGTRACE("Exiting ...");
104121
}
105122

106123
void gdial_shield_server(SoupServer *server) {
107124
g_return_if_fail(server != NULL);
125+
GDIAL_LOGTRACE("Entering ...");
108126
g_signal_connect(server, "request_started", G_CALLBACK(server_request_started_callback), NULL);
109127
g_signal_connect(server, "request_read", G_CALLBACK(server_request_read_callback), NULL);
110128
g_signal_connect(server, "request_finished",G_CALLBACK(server_request_finished_callback), NULL);
111129
g_signal_connect(server, "request_aborted", G_CALLBACK(server_request_aborted_callback), NULL);
130+
GDIAL_LOGTRACE("Exiting ...");
112131
}
113132

114133
void gdial_shield_term(void) {
115134
GHashTableIter iter;
116135
gpointer key, value;
136+
GDIAL_LOGTRACE("Entering ...");
137+
g_return_if_fail(active_conns_ != NULL);
117138
GDIAL_LOGINFO("gdial_shield_term: hash_table_size start= %d", g_hash_table_size(active_conns_));
118139
g_hash_table_iter_init(&iter, (GHashTable *)active_conns_);
119140
while (g_hash_table_iter_next(&iter, &key, &value)) {
@@ -123,4 +144,5 @@ void gdial_shield_term(void) {
123144
GDIAL_LOGINFO("gdial_shield_term: hash_table_size end= %d", g_hash_table_size(active_conns_));
124145
g_hash_table_unref(active_conns_);
125146
active_conns_ = NULL;
147+
GDIAL_LOGTRACE("Exiting ...");
126148
}

server/gdial-ssdp.c

Lines changed: 64 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ static void ssdp_http_server_callback(SoupServer *server, SoupMessage *msg, cons
107107
gchar *application_url_str = g_strdup_printf("http://%s:%d/%s/", iface_ipv4_address, GDIAL_REST_HTTP_PORT,app_random_uuid);
108108
soup_message_headers_replace (msg->response_headers, "Application-URL", application_url_str);
109109
g_free(application_url_str);
110+
application_url_str = NULL;
110111
soup_message_set_response(msg, "text/xml; charset=utf-8", SOUP_MEMORY_STATIC, dd_xml_response_str_, dd_xml_response_str_len);
111112
soup_message_set_status(msg, SOUP_STATUS_OK);
112113
GDIAL_CHECK("Content-Type:text/xml");
@@ -121,6 +122,7 @@ void gdial_ssdp_networkstandbymode_handler(const bool nwstandby)
121122
gchar *dial_ssdp_WAKEUP = g_strdup_printf(DIAL_SSDP_WAKEUP_FMT,gdial_plat_util_get_iface_mac_addr(gdial_options_->iface_name),MAX_POWERON_TIME);
122123
gssdp_client_append_header(ssdp_client_, "WAKEUP", dial_ssdp_WAKEUP);
123124
g_free(dial_ssdp_WAKEUP);
125+
dial_ssdp_WAKEUP = NULL;
124126
}
125127
else{
126128
GDIAL_LOGINFO("gdial_ssdp_networkstandbymode_handler remove WAKEUP header ");
@@ -137,6 +139,8 @@ int gdial_ssdp_new(SoupServer *ssdp_http_server, GDialOptions *options, const gc
137139
g_return_val_if_fail(options->iface_name != NULL, -1);
138140

139141
gdial_options_ = options;
142+
GDIAL_LOGINFO("gdial_options_->friendly_name[%p]",gdial_options_->friendly_name);
143+
140144
if (gdial_options_->friendly_name == NULL) gdial_options_->friendly_name = g_strdup(GDIAL_SSDP_FRIENDLY_DEFAULT);
141145
if (gdial_options_->manufacturer== NULL) gdial_options_->manufacturer = g_strdup(GDIAL_SSDP_MANUFACTURER_DEFAULT);
142146
if (gdial_options_->model_name== NULL) gdial_options_->model_name = g_strdup(GDIAL_SSDP_MODELNAME_DEFAULT);
@@ -177,6 +181,7 @@ int gdial_ssdp_new(SoupServer *ssdp_http_server, GDialOptions *options, const gc
177181
gchar *dial_ssdp_WAKEUP = g_strdup_printf(DIAL_SSDP_WAKEUP_FMT,gdial_plat_util_get_iface_mac_addr(gdial_options_->iface_name),MAX_POWERON_TIME);
178182
gssdp_client_append_header(ssdp_client, "WAKEUP", dial_ssdp_WAKEUP);
179183
g_free(dial_ssdp_WAKEUP);
184+
dial_ssdp_WAKEUP = NULL;
180185
}
181186
else {
182187
GDIAL_LOGINFO("WOL Wake feature is disabled");
@@ -192,7 +197,9 @@ int gdial_ssdp_new(SoupServer *ssdp_http_server, GDialOptions *options, const gc
192197
gssdp_resource_group_add_resource_simple (ssdp_resource_group, dial_ssdp_ST_target, dial_ssdp_USN, dial_ssdp_LOCATION);
193198
gssdp_resource_group_set_available (ssdp_resource_group, FALSE);
194199
g_free(dial_ssdp_USN);
200+
dial_ssdp_USN = NULL;
195201
g_free(dial_ssdp_LOCATION);
202+
dial_ssdp_LOCATION = NULL;
196203

197204
ssdp_resource_group_ = ssdp_resource_group;
198205

@@ -207,23 +214,66 @@ int gdial_ssdp_new(SoupServer *ssdp_http_server, GDialOptions *options, const gc
207214
}
208215

209216
int gdial_ssdp_destroy() {
210-
soup_server_remove_handler(ssdp_http_server_, "/dd.xml");
211-
gssdp_resource_group_remove_resource(ssdp_resource_group_, ssdp_resource_id_);
212-
213-
if (dd_xml_response_str_) {
214-
g_free(dd_xml_response_str_);
217+
GDIAL_LOGTRACE("Entering ...");
218+
if (ssdp_http_server_)
219+
{
220+
soup_server_remove_handler(ssdp_http_server_, "/dd.xml");
215221
}
216-
if (gdial_options_->friendly_name != NULL) g_free(gdial_options_->friendly_name);
217-
if (gdial_options_->uuid != NULL) g_free(gdial_options_->uuid);
218-
if (gdial_options_->iface_name != NULL) g_free(gdial_options_->iface_name);
219-
if (app_random_uuid) g_free(app_random_uuid);
220-
221-
gssdp_client_clear_headers(ssdp_client_);
222222

223-
g_object_unref(ssdp_http_server_);
224-
g_object_unref(ssdp_resource_group_);
225-
g_object_unref(ssdp_client_);
223+
if (ssdp_resource_group_)
224+
{
225+
gssdp_resource_group_remove_resource(ssdp_resource_group_, ssdp_resource_id_);
226+
ssdp_resource_id_ = 0;
227+
}
226228

229+
if (dd_xml_response_str_)
230+
{
231+
g_free(dd_xml_response_str_);
232+
dd_xml_response_str_ = NULL;
233+
}
234+
if (gdial_options_)
235+
{
236+
if (gdial_options_->friendly_name != NULL)
237+
{
238+
g_free(gdial_options_->friendly_name);
239+
gdial_options_->friendly_name = NULL;
240+
}
241+
if (gdial_options_->uuid != NULL)
242+
{
243+
g_free(gdial_options_->uuid);
244+
gdial_options_->uuid = NULL;
245+
}
246+
if (gdial_options_->iface_name != NULL)
247+
{
248+
g_free(gdial_options_->iface_name);
249+
gdial_options_->iface_name = NULL;
250+
}
251+
gdial_options_ = NULL;
252+
}
253+
if (app_random_uuid != NULL) {
254+
g_free(app_random_uuid);
255+
app_random_uuid = NULL;
256+
}
257+
if (ssdp_client_)
258+
{
259+
gssdp_client_clear_headers(ssdp_client_);
260+
}
261+
if (ssdp_http_server_)
262+
{
263+
g_object_unref(ssdp_http_server_);
264+
ssdp_http_server_ = NULL;
265+
}
266+
if (ssdp_resource_group_)
267+
{
268+
g_object_unref(ssdp_resource_group_);
269+
ssdp_resource_group_ = NULL;
270+
}
271+
if (ssdp_client_)
272+
{
273+
g_object_unref(ssdp_client_);
274+
ssdp_client_ = NULL;
275+
}
276+
GDIAL_LOGTRACE("Exiting ...");
227277
return 0;
228278
}
229279

server/gdialserver_ut.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ class gdialServiceTest: public GDialNotifier
181181
GDIAL_LOGINFO("App:%s appID:%s",appName.c_str(),appID.c_str());
182182
}
183183

184-
virtual void onDisconnect() override
184+
virtual void onStopped() override
185185
{
186186
GDIAL_LOGINFO("~~~~~~~~~~~");
187187
}
@@ -224,7 +224,16 @@ int main(int argc, char *argv[])
224224
break;
225225
}
226226

227-
if (input == "enable") {
227+
if (input == "restart") {
228+
GDIAL_LOGINFO("Restarting");
229+
if (nullptr != testObject)
230+
{
231+
delete testObject;
232+
testObject = nullptr;
233+
}
234+
testObject = new gdialServiceTest(gdial_args);
235+
}
236+
else if (input == "enable") {
228237
GDIAL_LOGINFO("Activation enabled");
229238
testObject->ActivationChanged(true);
230239
}

0 commit comments

Comments
 (0)