diff --git a/CHANGELOG.md b/CHANGELOG.md index 11774f7d0..7632395cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ SPDX-License-Identifier: GPL-3.0-or-later - irc: fix creation of irc.msgbuffer option without a server name - irc: ignore self join if the channel is already joined ([#2291](https://github.com/weechat/weechat/issues/2291)) - relay/api: fix memory leaks in resources "ping" and "sync" +- relay/api: fix memory leak in receive of message from remote WeeChat ## Version 4.8.1 (2025-12-01) diff --git a/src/plugins/relay/api/remote/relay-remote-event.c b/src/plugins/relay/api/remote/relay-remote-event.c index 0fcb27cb1..f51cbdbec 100644 --- a/src/plugins/relay/api/remote/relay-remote-event.c +++ b/src/plugins/relay/api/remote/relay-remote-event.c @@ -1283,7 +1283,15 @@ relay_remote_event_recv (struct t_relay_remote *remote, const char *data) json = cJSON_Parse (data); if (!json) - goto error_data; + { + weechat_printf ( + NULL, + _("%sremote[%s]: invalid data received from remote relay: \"%s\""), + weechat_prefix ("error"), + remote->name, + data); + return; + } event.remote = remote; event.name = NULL; @@ -1296,7 +1304,7 @@ relay_remote_event_recv (struct t_relay_remote *remote, const char *data) json_body = cJSON_GetObjectItem (json, "body"); if (!body_type && ((code == 200) || (code == 204))) - return; + goto end; JSON_GET_STR(json, event_name); event.name = event_name; @@ -1352,7 +1360,15 @@ relay_remote_event_recv (struct t_relay_remote *remote, const char *data) rc = (callback) (&event); } if (rc == WEECHAT_RC_ERROR) - goto error_cb; + { + weechat_printf ( + NULL, + _("%sremote[%s]: callback failed for body type \"%s\""), + weechat_prefix ("error"), + remote->name, + body_type); + goto end; + } } if (!remote->synced && initial_sync) @@ -1361,23 +1377,6 @@ relay_remote_event_recv (struct t_relay_remote *remote, const char *data) weechat_bar_item_update ("input_prompt"); } - return; - -error_data: - weechat_printf ( - NULL, - _("%sremote[%s]: invalid data received from remote relay: \"%s\""), - weechat_prefix ("error"), - remote->name, - data); - return; - -error_cb: - weechat_printf ( - NULL, - _("%sremote[%s]: callback failed for body type \"%s\""), - weechat_prefix ("error"), - remote->name, - body_type); - return; +end: + cJSON_Delete (json); } diff --git a/src/plugins/relay/api/remote/relay-remote-network.c b/src/plugins/relay/api/remote/relay-remote-network.c index f05156cf6..174345d18 100644 --- a/src/plugins/relay/api/remote/relay-remote-network.c +++ b/src/plugins/relay/api/remote/relay-remote-network.c @@ -156,6 +156,7 @@ relay_remote_network_check_auth (struct t_relay_remote *remote, int accept_ok, hash_size; http_resp = NULL; + json_body = NULL; msg_error = NULL; msg_resp_error = NULL; accept_ok = 0; @@ -225,6 +226,9 @@ relay_remote_network_check_auth (struct t_relay_remote *remote, relay_http_response_free (http_resp); + if (json_body) + cJSON_Delete (json_body); + return 1; error: @@ -238,6 +242,8 @@ error: (msg_resp_error) ? msg_resp_error : "", (msg_resp_error) ? ")" : ""); relay_http_response_free (http_resp); + if (json_body) + cJSON_Delete (json_body); return 0; } @@ -1200,6 +1206,8 @@ relay_remote_network_url_handshake_cb (const void *pointer, remote->hook_url_handshake = NULL; + json_body = NULL; + ptr_resp_code = weechat_hashtable_get (output, "response_code"); if (ptr_resp_code && ptr_resp_code[0] && (strcmp (ptr_resp_code, "200") != 0)) { @@ -1211,7 +1219,7 @@ relay_remote_network_url_handshake_cb (const void *pointer, weechat_config_string (remote->options[RELAY_REMOTE_OPTION_URL]), ptr_resp_code); relay_remote_network_disconnect (remote); - return WEECHAT_RC_OK; + goto end; } ptr_error = weechat_hashtable_get (output, "error"); @@ -1225,7 +1233,7 @@ relay_remote_network_url_handshake_cb (const void *pointer, weechat_config_string (remote->options[RELAY_REMOTE_OPTION_URL]), ptr_error); relay_remote_network_disconnect (remote); - return WEECHAT_RC_OK; + goto end; } ptr_output = weechat_hashtable_get (output, "output"); @@ -1262,7 +1270,7 @@ relay_remote_network_url_handshake_cb (const void *pointer, weechat_config_string (remote->options[RELAY_REMOTE_OPTION_URL]), _("hash algorithm not found")); relay_remote_network_disconnect (remote); - return WEECHAT_RC_OK; + goto end; } if (remote->password_hash_iterations < 0) @@ -1275,7 +1283,7 @@ relay_remote_network_url_handshake_cb (const void *pointer, weechat_config_string (remote->options[RELAY_REMOTE_OPTION_URL]), _("unknown number of hash iterations")); relay_remote_network_disconnect (remote); - return WEECHAT_RC_OK; + goto end; } if (remote->totp < 0) @@ -1288,7 +1296,7 @@ relay_remote_network_url_handshake_cb (const void *pointer, weechat_config_string (remote->options[RELAY_REMOTE_OPTION_URL]), _("unknown TOTP status")); relay_remote_network_disconnect (remote); - return WEECHAT_RC_OK; + goto end; } if (weechat_relay_plugin->debug >= 1) @@ -1325,7 +1333,7 @@ relay_remote_network_url_handshake_cb (const void *pointer, weechat_prefix ("error"), remote->name); relay_remote_network_disconnect (remote); - return WEECHAT_RC_OK; + goto end; } snprintf (option_name, length, "weechat.proxy.%s.type", proxy); proxy_type = weechat_config_get (option_name); @@ -1343,7 +1351,7 @@ relay_remote_network_url_handshake_cb (const void *pointer, _("%sremote[%s]: proxy \"%s\" not found, cannot connect"), weechat_prefix ("error"), remote->name, proxy); relay_remote_network_disconnect (remote); - return WEECHAT_RC_OK; + goto end; } str_proxy_type = weechat_config_string (proxy_type); str_proxy_address = weechat_config_string (proxy_address); @@ -1356,7 +1364,7 @@ relay_remote_network_url_handshake_cb (const void *pointer, "proxy \"%s\""), weechat_prefix ("error"), remote->name, proxy); relay_remote_network_disconnect (remote); - return WEECHAT_RC_OK; + goto end; } } @@ -1375,6 +1383,9 @@ relay_remote_network_url_handshake_cb (const void *pointer, remote, NULL); +end: + if (json_body) + cJSON_Delete (json_body); return WEECHAT_RC_OK; }