From 29c860170ca18c3f7f15b5ba7723e06ddc760361 Mon Sep 17 00:00:00 2001 From: Bohdan Horbeshko Date: Sat, 7 Aug 2021 17:32:41 +0300 Subject: sa->pc safety check in request/timeout callbacks It mitigates a common cause of segmentation faults due to a freed SkypeAccount structure which may contain corrupted data already, still the sa->pc may be NULL as it is freed right before the whole structure. It does not guarantee the crash prevention though, and does not solve the root problem, as these callbacks should be removed and not invoked if an account is disconnected. The crash backtraces are collected in #650, most of them happened in `skypeweb_post_or_get`. --- skypeweb/skypeweb_connection.c | 1 + skypeweb/skypeweb_login.c | 11 +++++++++++ skypeweb/skypeweb_messages.c | 4 ++++ 3 files changed, 16 insertions(+) diff --git a/skypeweb/skypeweb_connection.c b/skypeweb/skypeweb_connection.c index 22dcc08..0ff4109 100644 --- a/skypeweb/skypeweb_connection.c +++ b/skypeweb/skypeweb_connection.c @@ -74,6 +74,7 @@ SkypeWebConnection *skypeweb_post_or_get(SkypeWebAccount *sa, SkypeWebMethod met gchar *language_names; gchar *real_url; + g_return_val_if_fail(sa->pc != NULL, NULL); g_return_val_if_fail(host != NULL, NULL); g_return_val_if_fail(url != NULL, NULL); diff --git a/skypeweb/skypeweb_login.c b/skypeweb/skypeweb_login.c index 22f1ab4..b2383de 100644 --- a/skypeweb/skypeweb_login.c +++ b/skypeweb/skypeweb_login.c @@ -27,6 +27,8 @@ skypeweb_login_did_auth(PurpleHttpConnection *http_conn, PurpleHttpResponse *res SkypeWebAccount *sa = user_data; const gchar *data; gsize len; + + g_return_if_fail(sa->pc); data = purple_http_response_get_data(response, &len); @@ -153,6 +155,8 @@ static void skypeweb_login_got_t(PurpleHttpConnection *http_conn, PurpleHttpResponse *response, gpointer user_data) { SkypeWebAccount *sa = user_data; + g_return_if_fail(sa->pc); + const gchar *login_url = "https://" SKYPEWEB_LOGIN_HOST "/login/microsoft"; PurpleHttpRequest *request; GString *postdata; @@ -247,6 +251,8 @@ static void skypeweb_login_got_opid(PurpleHttpConnection *http_conn, PurpleHttpResponse *response, gpointer user_data) { SkypeWebAccount *sa = user_data; + g_return_if_fail(sa->pc); + const gchar *live_login_url = "https://login.live.com" "/ppsecure/post.srf?wa=wsignin1.0&wp=MBI_SSL&wreply=https%3A%2F%2Flw.skype.com%2Flogin%2Foauth%2Fproxy%3Fsite_name%3Dlw.skype.com"; gchar *ppft; gchar *opid; @@ -298,6 +304,7 @@ static void skypeweb_login_got_ppft(PurpleHttpConnection *http_conn, PurpleHttpResponse *response, gpointer user_data) { SkypeWebAccount *sa = user_data; + g_return_if_fail(sa->pc); const gchar *live_login_url = "https://login.live.com" "/ppsecure/post.srf?wa=wsignin1.0&wp=MBI_SSL&wreply=https%3A%2F%2Flw.skype.com%2Flogin%2Foauth%2Fproxy%3Fsite_name%3Dlw.skype.com"; gchar *cktst_cookie; gchar *ppft; @@ -410,6 +417,8 @@ skypeweb_login_did_got_api_skypetoken(PurpleHttpConnection *http_conn, PurpleHtt gchar *error = NULL; PurpleConnectionError error_type = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + g_return_if_fail(sa->pc); + data = purple_http_response_get_data(response, &len); purple_debug_misc("skypeweb", "Full skypetoken response: %s\n", data); @@ -504,6 +513,8 @@ skypeweb_login_did_soap(PurpleHttpConnection *http_conn, PurpleHttpResponse *res gchar *token; const char *error = NULL; + g_return_if_fail(sa->pc); + data = purple_http_response_get_data(response, &len); envelope = purple_xmlnode_from_str(data, len); diff --git a/skypeweb/skypeweb_messages.c b/skypeweb/skypeweb_messages.c index 959fb31..4acca45 100644 --- a/skypeweb/skypeweb_messages.c +++ b/skypeweb/skypeweb_messages.c @@ -1215,6 +1215,8 @@ skypeweb_got_registration_token(PurpleHttpConnection *http_conn, PurpleHttpRespo gchar *new_messages_host = NULL; const gchar *data; gsize len; + + g_return_if_fail(sa->pc); data = purple_http_response_get_data(response, &len); @@ -1282,6 +1284,8 @@ skypeweb_got_vdms_token(PurpleHttpConnection *http_conn, PurpleHttpResponse *res { const gchar *token; SkypeWebAccount *sa = user_data; + g_return_if_fail(sa->pc); + JsonParser *parser = json_parser_new(); const gchar *data; gsize len; -- cgit v1.2.3