From cb0a9a3c42e1208e08d2e99066ccad42f0ff046a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Helleu?= Date: Sat, 20 Jun 2026 11:27:42 +0200 Subject: [PATCH] relay: use util functions to parse integers --- src/plugins/relay/api/relay-api-protocol.c | 23 ++++----- src/plugins/relay/api/relay-api.c | 5 +- .../relay/api/remote/relay-remote-event.c | 5 +- src/plugins/relay/irc/relay-irc.c | 18 +++---- src/plugins/relay/relay-auth.c | 16 ++---- src/plugins/relay/relay-config.c | 49 ++++++++++++++----- src/plugins/relay/relay-http.c | 41 ++++++---------- src/plugins/relay/relay-remote.c | 9 ++-- src/plugins/relay/relay-websocket.c | 13 ++--- src/plugins/relay/weechat/relay-weechat-msg.c | 6 +-- .../relay/weechat/relay-weechat-protocol.c | 6 +-- 11 files changed, 87 insertions(+), 104 deletions(-) diff --git a/src/plugins/relay/api/relay-api-protocol.c b/src/plugins/relay/api/relay-api-protocol.c index 7a71f68c4..1fbf07582 100644 --- a/src/plugins/relay/api/relay-api-protocol.c +++ b/src/plugins/relay/api/relay-api-protocol.c @@ -77,7 +77,6 @@ relay_api_protocol_signal_buffer_cb (const void *pointer, void *data, long long buffer_id; int nicks; const char *ptr_id; - char *error; /* make C compiler happy */ (void) data; @@ -119,9 +118,7 @@ relay_api_protocol_signal_buffer_cb (const void *pointer, void *data, ptr_buffer); if (ptr_id) { - error = NULL; - buffer_id = strtoll (ptr_id, &error, 10); - if (!error || error[0]) + if (!weechat_util_parse_longlong (ptr_id, 10, &buffer_id)) buffer_id = -1; weechat_hashtable_remove ( RELAY_API_DATA(ptr_client, buffers_closing), @@ -499,7 +496,7 @@ invalid_hash_algo: RELAY_API_PROTOCOL_CALLBACK(version) { cJSON *json; - char *version, *error; + char *version; long number; json = cJSON_CreateObject (); @@ -517,9 +514,7 @@ RELAY_API_PROTOCOL_CALLBACK(version) free (version); version = weechat_info_get ("version_number", NULL); - error = NULL; - number = strtol (version, &error, 10); - if (error && !error[0]) + if (weechat_util_parse_long (version, 10, &number)) { cJSON_AddItemToObject (json, "weechat_version_number", @@ -561,10 +556,9 @@ RELAY_API_PROTOCOL_CALLBACK(buffers) struct t_gui_buffer *ptr_buffer; struct t_gui_line *ptr_line; struct t_gui_line_data *ptr_line_data; - long lines, lines_free, line_id; - int colors, nicks; + long lines, lines_free; + int colors, nicks, line_id; const char *ptr_colors; - char *error; json = NULL; @@ -610,9 +604,10 @@ RELAY_API_PROTOCOL_CALLBACK(buffers) { if (client->http_req->num_path_items > 4) { - line_id = strtol (client->http_req->path_items[4], &error, 10); - ptr_line = (error && !error[0]) ? - weechat_line_search_by_id (ptr_buffer, line_id) : NULL; + if (weechat_util_parse_int (client->http_req->path_items[4], 10, &line_id)) + ptr_line = weechat_line_search_by_id (ptr_buffer, line_id); + else + ptr_line = NULL; ptr_line_data = (ptr_line) ? weechat_hdata_pointer (relay_hdata_line, ptr_line, "data") : NULL; if (!ptr_line_data) diff --git a/src/plugins/relay/api/relay-api.c b/src/plugins/relay/api/relay-api.c index fca51f9a9..c0d5057db 100644 --- a/src/plugins/relay/api/relay-api.c +++ b/src/plugins/relay/api/relay-api.c @@ -51,7 +51,6 @@ long long relay_api_get_buffer_id (struct t_gui_buffer *buffer) { const char *ptr_id; - char *error; long long id; if (!buffer) @@ -61,9 +60,7 @@ relay_api_get_buffer_id (struct t_gui_buffer *buffer) if (!ptr_id) return -1; - error = NULL; - id = strtoll (ptr_id, &error, 10); - if (!error || error[0]) + if (!weechat_util_parse_longlong (ptr_id, 10, &id)) return -1; return id; diff --git a/src/plugins/relay/api/remote/relay-remote-event.c b/src/plugins/relay/api/remote/relay-remote-event.c index db6ed041e..b24d11eca 100644 --- a/src/plugins/relay/api/remote/relay-remote-event.c +++ b/src/plugins/relay/api/remote/relay-remote-event.c @@ -113,7 +113,6 @@ long long relay_remote_event_get_buffer_id (struct t_gui_buffer *buffer) { const char *ptr_id; - char *error; long long buffer_id; if (!buffer) @@ -123,9 +122,7 @@ relay_remote_event_get_buffer_id (struct t_gui_buffer *buffer) if (!ptr_id) return -1; - error = NULL; - buffer_id = strtoll (ptr_id, &error, 10); - if (!error || error[0]) + if (!weechat_util_parse_longlong (ptr_id, 10, &buffer_id)) return -1; return buffer_id; diff --git a/src/plugins/relay/irc/relay-irc.c b/src/plugins/relay/irc/relay-irc.c index 907f166b9..f0382c3d8 100644 --- a/src/plugins/relay/irc/relay-irc.c +++ b/src/plugins/relay/irc/relay-irc.c @@ -429,9 +429,8 @@ relay_irc_signal_irc_in2_cb (const void *pointer, void *data, int relay_irc_tag_relay_client_id (const char *tags) { - char **argv, *error; - int result, argc, i; - long number; + char **argv; + int number, result, argc, i; result = -1; @@ -449,9 +448,7 @@ relay_irc_tag_relay_client_id (const char *tags) { if (strncmp (argv[i], "relay_client_", 13) == 0) { - error = NULL; - number = strtol (argv[i] + 13, &error, 10); - if (error && !error[0]) + if (weechat_util_parse_int (argv[i] + 13, 10, &number)) { result = number; break; @@ -1606,10 +1603,9 @@ relay_irc_recv (struct t_relay_client *client, const char *data) const char *ptr_data, *ptr_nick_modes, *pos; char str_time[128], str_signal[128], str_server_channel[256], *nick; char str_param[128], *str_args, *version, str_command[128], **params; - char *password, *irc_is_channel, *info, *error, *str_cmd_lower; + char *password, *irc_is_channel, *info, *str_cmd_lower; char modifier_data[128], *new_data, *ctcp_type, *ctcp_params, *nick_modes; - long num_params; - int i, redirect_msg; + int i, num_params, redirect_msg; new_data = NULL; hash_parsed = NULL; @@ -1650,9 +1646,7 @@ relay_irc_recv (struct t_relay_client *client, const char *data) goto end; irc_command = weechat_hashtable_get (hash_parsed, "command"); str_num_params = weechat_hashtable_get (hash_parsed, "num_params"); - error = NULL; - num_params = strtol (str_num_params, &error, 10); - if (!error || error[0]) + if (!weechat_util_parse_int (str_num_params, 10, &num_params)) num_params = 0; if (num_params > 0) { diff --git a/src/plugins/relay/relay-auth.c b/src/plugins/relay/relay-auth.c index 42536af81..7b5cd4e03 100644 --- a/src/plugins/relay/relay-auth.c +++ b/src/plugins/relay/relay-auth.c @@ -283,7 +283,7 @@ relay_auth_parse_pbkdf2 (const char *parameters, char **salt_hexa, char **salt, int *salt_size, int *iterations, char **hash) { - char **argv, *error; + char **argv; int argc; if (salt_hexa) @@ -329,9 +329,7 @@ relay_auth_parse_pbkdf2 (const char *parameters, } /* parameter 2: iterations */ - error = NULL; - *iterations = (int)strtol (argv[1], &error, 10); - if (!error || error[0]) + if (!weechat_util_parse_int (argv[1], 10, iterations)) *iterations = 0; /* parameter 3: the PBKDF2 hash */ @@ -362,9 +360,7 @@ int relay_auth_check_salt (struct t_relay_client *client, const char *salt_hexa, const char *salt, int salt_size) { - long number; - int time_window; - char *error; + long long number, time_window; time_t time_now; if (!client) @@ -374,12 +370,10 @@ relay_auth_check_salt (struct t_relay_client *client, { if (!salt || (salt_size < 1)) return 0; - error = NULL; - number = strtol (salt, &error, 10); - if (!error || error[0]) + if (!weechat_util_parse_longlong (salt, 10, &number)) return 0; time_now = time (NULL); - time_window = weechat_config_integer (relay_config_network_time_window); + time_window = (long long)weechat_config_integer (relay_config_network_time_window); return ((number >= time_now - time_window) && (number <= time_now + time_window)) ? 1 : 0; } diff --git a/src/plugins/relay/relay-config.c b/src/plugins/relay/relay-config.c index 69d4e25ae..989a16e59 100644 --- a/src/plugins/relay/relay-config.c +++ b/src/plugins/relay/relay-config.c @@ -652,23 +652,46 @@ relay_config_check_port_cb (const void *pointer, void *data, struct t_config_option *option, const char *value) { - char *error; - long port; struct t_relay_server *ptr_server; + int number, port; + long long new_port; /* make C compiler happy */ (void) pointer; (void) data; - (void) option; - error = NULL; - port = strtol (value, &error, 10); - ptr_server = relay_server_search_port ((int)port); + if (strncmp (value, "++", 2) == 0) + { + /* relative value: add to the current port */ + if (!weechat_util_parse_int (value + 2, 10, &number)) + return 1; + new_port = (long long)weechat_config_integer (option) + number; + } + else if (strncmp (value, "--", 2) == 0) + { + /* relative value: subtract from the current port */ + if (!weechat_util_parse_int (value + 2, 10, &number)) + return 1; + new_port = (long long)weechat_config_integer (option) - number; + } + else + { + /* let WeeChat display the error if value is not a valid integer */ + if (!weechat_util_parse_int (value, 10, &port)) + return 1; + new_port = port; + } + + /* if port is out of range, let WeeChat validate and display the error */ + if ((new_port < 0) || (new_port > 65535)) + return 1; + + ptr_server = relay_server_search_port ((int)new_port); if (ptr_server) { weechat_printf (NULL, _("%s%s: error: port \"%d\" is already used"), weechat_prefix ("error"), - RELAY_PLUGIN_NAME, (int)port); + RELAY_PLUGIN_NAME, (int)new_port); return 0; } @@ -866,9 +889,8 @@ relay_config_create_option_port_path (const void *pointer, void *data, const char *option_name, const char *value) { - int rc, protocol_number, ipv4, ipv6, tls, unix_socket; - char *error, *protocol, *protocol_args; - long port; + int rc, protocol_number, ipv4, ipv6, tls, unix_socket, port; + char *protocol, *protocol_args; struct t_relay_server *ptr_server; /* make C compiler happy */ @@ -925,9 +947,10 @@ relay_config_create_option_port_path (const void *pointer, void *data, } else { - error = NULL; - port = strtol (value, &error, 10); - ptr_server = relay_server_search_port ((int)port); + if (weechat_util_parse_int (value, 10, &port)) + ptr_server = relay_server_search_port (port); + else + ptr_server = NULL; } if (ptr_server) { diff --git a/src/plugins/relay/relay-http.c b/src/plugins/relay/relay-http.c index 306c13b0e..7ed77b0d3 100644 --- a/src/plugins/relay/relay-http.c +++ b/src/plugins/relay/relay-http.c @@ -212,7 +212,6 @@ relay_http_get_param_long (struct t_relay_http_request *request, long *value) { const char *ptr_value; - char *error; long number; if (!value) @@ -223,8 +222,7 @@ relay_http_get_param_long (struct t_relay_http_request *request, return 0; if (ptr_value) { - number = strtol (ptr_value, &error, 10); - if (!error || error[0]) + if (!weechat_util_parse_long (ptr_value, 10, &number)) return 0; *value = number; } @@ -411,10 +409,9 @@ relay_http_parse_header (struct t_relay_http_request *request, const char *header, int ws_deflate_allowed) { - char *name, *name_lower, *error, **items; + char *name, *name_lower, **items; const char *pos, *existing_value, *ptr_value; - int i, num_items; - long number; + int i, number, num_items; weechat_string_dyn_concat (request->raw, header, -1); weechat_string_dyn_concat (request->raw, "\n", -1); @@ -475,10 +472,8 @@ relay_http_parse_header (struct t_relay_http_request *request, /* if header is "Content-Length", save the length */ if (strcmp (name_lower, "content-length") == 0) { - error = NULL; - number = strtol (ptr_value, &error, 10); - if (error && !error[0]) - request->content_length = (int)number; + if (weechat_util_parse_int (ptr_value, 10, &number)) + request->content_length = number; } /* @@ -606,7 +601,7 @@ relay_http_get_auth_status (struct t_relay_client *client) { const char *auth, *sec_websocket_protocol, *client_totp, *pos; char *relay_password, *totp_secret, *info_totp_args, *info_totp; - char *user_pass, **protocol_array, *error; + char *user_pass, **protocol_array; int rc, i, length, protocol_count, use_base64url, totp_ok; long number; @@ -626,8 +621,8 @@ relay_http_get_auth_status (struct t_relay_client *client) rc = -4; goto end; } - number = strtol (client_totp, &error, 10); - if (!error || error[0] || (number < 0) || (number > 999999)) + if (!weechat_util_parse_long (client_totp, 10, &number) + || (number < 0) || (number > 999999)) { rc = -4; goto end; @@ -1496,8 +1491,8 @@ relay_http_parse_response_code (struct t_relay_http_response *response, const char *response_code) { const char *pos, *pos2; - char *error, *return_code; - long value; + char *return_code; + int value; if (!response) return 0; @@ -1528,10 +1523,8 @@ relay_http_parse_response_code (struct t_relay_http_response *response, if (!return_code) goto error; - error = NULL; - value = strtol (return_code, &error, 10); - if (error && !error[0]) - response->return_code = (int)value; + if (weechat_util_parse_int (return_code, 10, &value)) + response->return_code = value; free (return_code); @@ -1566,9 +1559,9 @@ int relay_http_parse_response_header (struct t_relay_http_response *response, const char *header) { - char *name, *name_lower, *error; + char *name, *name_lower; const char *pos, *ptr_value; - long number; + int number; /* empty line => end of headers */ if (!header || !header[0]) @@ -1608,10 +1601,8 @@ relay_http_parse_response_header (struct t_relay_http_response *response, /* if header is "Content-Length", save the length */ if (strcmp (name_lower, "content-length") == 0) { - error = NULL; - number = strtol (ptr_value, &error, 10); - if (error && !error[0]) - response->content_length = (int)number; + if (weechat_util_parse_int (ptr_value, 10, &number)) + response->content_length = number; } free (name); diff --git a/src/plugins/relay/relay-remote.c b/src/plugins/relay/relay-remote.c index 14ec36f02..68849e035 100644 --- a/src/plugins/relay/relay-remote.c +++ b/src/plugins/relay/relay-remote.c @@ -203,7 +203,7 @@ relay_remote_parse_url (const char *url, int *tls, char **address, int *port) { const char *ptr_url, *pos; - char *str_port, *error; + char *str_port; long number; if (tls) @@ -270,12 +270,11 @@ relay_remote_parse_url (const char *url, weechat_strndup (ptr_url, pos - ptr_url) : strdup (ptr_url); if (!str_port) return 0; - error = NULL; - number = strtol (str_port, &error, 10); - if (error && !error[0] && (number >= 0) && (number <= 65535)) + if (weechat_util_parse_long (str_port, 10, &number) + && (number >= 0) && (number <= 65535)) { if (port) - *port = number; + *port = (int)number; free (str_port); } else diff --git a/src/plugins/relay/relay-websocket.c b/src/plugins/relay/relay-websocket.c index 3295c3a28..40c758477 100644 --- a/src/plugins/relay/relay-websocket.c +++ b/src/plugins/relay/relay-websocket.c @@ -306,9 +306,8 @@ relay_websocket_parse_extensions (const char *extensions, struct t_relay_websocket_deflate *ws_deflate, int ws_deflate_allowed) { - char **exts, **params, **items, *error; - int i, j, num_exts, num_params, num_items; - long number; + char **exts, **params, **items; + int i, j, number, num_exts, num_params, num_items; if (!extensions || !ws_deflate) return; @@ -351,9 +350,7 @@ relay_websocket_parse_extensions (const char *extensions, number = 15; if (num_items >= 2) { - error = NULL; - number = strtol (items[1], &error, 10); - if (error && !error[0]) + if (weechat_util_parse_int (items[1], 10, &number)) { if (number < 8) number = 8; @@ -368,12 +365,12 @@ relay_websocket_parse_extensions (const char *extensions, if (strcmp (items[0], "server_max_window_bits") == 0) { ws_deflate->server_max_window_bits_recv = 1; - ws_deflate->window_bits_deflate = (int)number; + ws_deflate->window_bits_deflate = number; } else { ws_deflate->client_max_window_bits_recv = 1; - ws_deflate->window_bits_inflate = (int)number; + ws_deflate->window_bits_inflate = number; } } } diff --git a/src/plugins/relay/weechat/relay-weechat-msg.c b/src/plugins/relay/weechat/relay-weechat-msg.c index 3b4512b43..54aac63b6 100644 --- a/src/plugins/relay/weechat/relay-weechat-msg.c +++ b/src/plugins/relay/weechat/relay-weechat-msg.c @@ -362,7 +362,7 @@ relay_weechat_msg_add_hdata_path (struct t_relay_weechat_msg *msg, { int num_added, i, j, count, count_all, var_type, array_size, max_array_size; int length; - char *pos, *pos2, *str_count, *error, *name; + char *pos, *pos2, *str_count, *name; void *sub_pointer; struct t_hdata *sub_hdata; const char *sub_hdata_name; @@ -384,9 +384,7 @@ relay_weechat_msg_add_hdata_path (struct t_relay_weechat_msg *msg, count_all = 1; else { - error = NULL; - count = (int)strtol (str_count, &error, 10); - if (error && !error[0]) + if (weechat_util_parse_int (str_count, 10, &count)) { if (count > 0) count--; diff --git a/src/plugins/relay/weechat/relay-weechat-protocol.c b/src/plugins/relay/weechat/relay-weechat-protocol.c index d2a34bab8..39e43c739 100644 --- a/src/plugins/relay/weechat/relay-weechat-protocol.c +++ b/src/plugins/relay/weechat/relay-weechat-protocol.c @@ -684,7 +684,7 @@ RELAY_WEECHAT_PROTOCOL_CALLBACK(completion) struct t_gui_completion_word *word; struct t_arraylist *ptr_list; struct t_relay_weechat_msg *msg; - char *error, *pos_data; + char *pos_data; int i, position, length_data, context, pos_start, size; RELAY_WEECHAT_PROTOCOL_MIN_ARGS(0); @@ -709,9 +709,7 @@ RELAY_WEECHAT_PROTOCOL_CALLBACK(completion) goto error; } - error = NULL; - position = (int)strtol (argv[1], &error, 10); - if (!error || error[0]) + if (!weechat_util_parse_int (argv[1], 10, &position)) goto error; pos_data = strchr (argv_eol[1], ' ');