diff --git a/CHANGELOG.md b/CHANGELOG.md index 6360dd742..581fc07b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ SPDX-License-Identifier: GPL-3.0-or-later ### Changed +- **breaking:** core: fix integer overflow and return "unsigned long" in function util_version_number - core: write configuration files on disk only if there are changes ([#2250](https://github.com/weechat/weechat/issues/2250)) ### Added diff --git a/doc/en/weechat_plugin_api.en.adoc b/doc/en/weechat_plugin_api.en.adoc index f4a69c085..88539a2ea 100644 --- a/doc/en/weechat_plugin_api.en.adoc +++ b/doc/en/weechat_plugin_api.en.adoc @@ -4879,7 +4879,7 @@ This function is not available in scripting API. ==== util_version_number -_WeeChat ≥ 0.3.9._ +_WeeChat ≥ 0.3.9, updated in 4.7.0._ Convert a string with WeeChat version to a number. @@ -4887,7 +4887,7 @@ Prototype: [source,c] ---- -int weechat_util_version_number (const char *version); +unsigned long weechat_util_version_number (const char *version); ---- Arguments: diff --git a/doc/fr/weechat_plugin_api.fr.adoc b/doc/fr/weechat_plugin_api.fr.adoc index f866def55..4eed9d52c 100644 --- a/doc/fr/weechat_plugin_api.fr.adoc +++ b/doc/fr/weechat_plugin_api.fr.adoc @@ -4960,7 +4960,7 @@ Cette fonction n'est pas disponible dans l'API script. ==== util_version_number -_WeeChat ≥ 0.3.9._ +_WeeChat ≥ 0.3.9, mis à jour dans la 4.7.0._ Convertir une chaîne avec la version WeeChat en nombre. @@ -4968,7 +4968,7 @@ Prototype : [source,c] ---- -int weechat_util_version_number (const char *version); +unsigned long weechat_util_version_number (const char *version); ---- Paramètres : diff --git a/doc/it/weechat_plugin_api.it.adoc b/doc/it/weechat_plugin_api.it.adoc index 00ac420ea..d25dc9167 100644 --- a/doc/it/weechat_plugin_api.it.adoc +++ b/doc/it/weechat_plugin_api.it.adoc @@ -5100,7 +5100,8 @@ Questa funzione non è disponibile nelle API per lo scripting. ==== util_version_number -_WeeChat ≥ 0.3.9._ +// TRANSLATION MISSING +_WeeChat ≥ 0.3.9, updated in 4.7.0._ // TRANSLATION MISSING Convert a string with WeeChat version to a number. @@ -5109,7 +5110,7 @@ Prototipo: [source,c] ---- -int weechat_util_version_number (const char *version); +unsigned long weechat_util_version_number (const char *version); ---- Argomenti: diff --git a/doc/ja/weechat_plugin_api.ja.adoc b/doc/ja/weechat_plugin_api.ja.adoc index 154829bce..86f2c1650 100644 --- a/doc/ja/weechat_plugin_api.ja.adoc +++ b/doc/ja/weechat_plugin_api.ja.adoc @@ -5014,7 +5014,8 @@ weechat_util_parse_time ("2023-12-25T10:29:09.456789Z", &tv); /* == 1 */ ==== util_version_number -_WeeChat バージョン 0.3.9 以上で利用可。_ +// TRANSLATION MISSING +_WeeChat ≥ 0.3.9, updated in 4.7.0._ WeeChat バージョンの文字列を番号に変換。 @@ -5022,7 +5023,7 @@ WeeChat バージョンの文字列を番号に変換。 [source,c] ---- -int weechat_util_version_number (const char *version); +unsigned long weechat_util_version_number (const char *version); ---- 引数: diff --git a/doc/sr/weechat_plugin_api.sr.adoc b/doc/sr/weechat_plugin_api.sr.adoc index b6fcabd45..12fd16720 100644 --- a/doc/sr/weechat_plugin_api.sr.adoc +++ b/doc/sr/weechat_plugin_api.sr.adoc @@ -4739,7 +4739,7 @@ weechat_util_parse_time ("2023-12-25T10:29:09.456789Z", &tv); /* == 1 */ ==== util_version_number -_WeeChat ≥ 0.3.9._ +_WeeChat ≥ 0.3.9, ажурирано у верзији 4.7.0._ Конвертује стринг са верзијом програма WeeChat у број. @@ -4747,7 +4747,7 @@ _WeeChat ≥ 0.3.9._ [source,c] ---- -int weechat_util_version_number (const char *version); +unsigned long weechat_util_version_number (const char *version); ---- Аргументи: diff --git a/src/core/core-util.c b/src/core/core-util.c index 93d88a768..2a3d426df 100644 --- a/src/core/core-util.c +++ b/src/core/core-util.c @@ -629,13 +629,13 @@ util_parse_delay (const char *string_delay, unsigned long long default_factor, * "0.3.0" ==> 196608 (== 0x00030000) */ -int +unsigned long util_version_number (const char *version) { char **items, buf[64], *error; const char *ptr_item; - int num_items, i, version_int[4], index_buf; - long number; + int num_items, i, index_buf; + unsigned long number, values[4]; if (!version || !version[0]) return 0; @@ -647,7 +647,7 @@ util_version_number (const char *version) 4, &num_items); for (i = 0; i < 4; i++) { - version_int[i] = 0; + values[i] = 0; if (items && (i < num_items)) { ptr_item = items[i]; @@ -667,20 +667,18 @@ util_version_number (const char *version) if (buf[0]) { error = NULL; - number = strtol (buf, &error, 10); + number = strtoul (buf, &error, 10); if (error && !error[0]) { - if (number < 0) - number = 0; - else if (number > 0xFF) + if (number > 0xFF) number = 0xFF; - version_int[i] = number; + values[i] = number; } } } } string_free_split (items); - return (version_int[0] << 24) | (version_int[1] << 16) - | (version_int[2] << 8) | version_int[3]; + return (values[0] << 24) | (values[1] << 16) + | (values[2] << 8) | values[3]; } diff --git a/src/core/core-util.h b/src/core/core-util.h index 620ae6575..0bad20765 100644 --- a/src/core/core-util.h +++ b/src/core/core-util.h @@ -48,6 +48,6 @@ extern int util_parse_delay (const char *string_delay, unsigned long long *delay); /* version */ -extern int util_version_number (const char *version); +extern unsigned long util_version_number (const char *version); #endif /* WEECHAT_UTIL_H */ diff --git a/src/plugins/plugin-api-info.c b/src/plugins/plugin-api-info.c index 48e3660ea..c3dd0883c 100644 --- a/src/plugins/plugin-api-info.c +++ b/src/plugins/plugin-api-info.c @@ -102,7 +102,7 @@ plugin_api_info_version_number_cb (const void *pointer, void *data, (void) arguments; snprintf ( - version_number, sizeof (version_number), "%d", + version_number, sizeof (version_number), "%lu", util_version_number ( (arguments && arguments[0]) ? arguments : version_get_version ())); return strdup (version_number); diff --git a/src/plugins/script/script-repo.c b/src/plugins/script/script-repo.c index 1903f59c2..64777fc7e 100644 --- a/src/plugins/script/script-repo.c +++ b/src/plugins/script/script-repo.c @@ -1109,7 +1109,8 @@ script_repo_file_read (int quiet) const char *ptr_desc; gzFile file; struct t_script_repo *script; - int version_number, version_ok, script_ok; + unsigned long version_number; + int version_ok, script_ok; struct tm tm_script; struct t_hashtable *descriptions; diff --git a/src/plugins/weechat-plugin.h b/src/plugins/weechat-plugin.h index edb11f888..576fc1774 100644 --- a/src/plugins/weechat-plugin.h +++ b/src/plugins/weechat-plugin.h @@ -76,7 +76,7 @@ struct t_weelist_item; * please change the date with current one; for a second change at same * date, increment the 01, otherwise please keep 01. */ -#define WEECHAT_PLUGIN_API_VERSION "20250507-01" +#define WEECHAT_PLUGIN_API_VERSION "20250508-01" /* macros for defining plugin infos */ #define WEECHAT_PLUGIN_NAME(__name) \ @@ -467,7 +467,7 @@ struct t_weechat_plugin int (*util_strftimeval) (char *string, int max, const char *format, struct timeval *tv); int (*util_parse_time) (const char *datetime, struct timeval *tv); - int (*util_version_number) (const char *version); + unsigned long (*util_version_number) (const char *version); /* sorted lists */ struct t_weelist *(*list_new) (void); diff --git a/tests/unit/core/test-core-util.cpp b/tests/unit/core/test-core-util.cpp index f17f14cef..155f7834d 100644 --- a/tests/unit/core/test-core-util.cpp +++ b/tests/unit/core/test-core-util.cpp @@ -520,23 +520,25 @@ TEST(CoreUtil, ParseDelay) TEST(CoreUtil, VersionNumber) { - LONGS_EQUAL(0, util_version_number (NULL)); - LONGS_EQUAL(0, util_version_number ("")); - LONGS_EQUAL(0, util_version_number ("abc")); + CHECK(util_version_number (NULL) == 0); + CHECK(util_version_number ("") == 0); + CHECK(util_version_number ("abc") == 0); - LONGS_EQUAL(0x00030200, util_version_number ("0.3.2-dev")); - LONGS_EQUAL(0x00030200, util_version_number ("0.3.2-rc1")); - LONGS_EQUAL(0x00030200, util_version_number ("0.3.2")); - LONGS_EQUAL(0x00030101, util_version_number ("0.3.1.1")); - LONGS_EQUAL(0x00030100, util_version_number ("0.3.1")); - LONGS_EQUAL(0x00030000, util_version_number ("0.3.0")); - LONGS_EQUAL(0x01000000, util_version_number ("1.0")); - LONGS_EQUAL(0x01000000, util_version_number ("1.0.0")); - LONGS_EQUAL(0x01000000, util_version_number ("1.0.0.0")); - LONGS_EQUAL(0x01000100, util_version_number ("1.0.1")); - LONGS_EQUAL(0x01000200, util_version_number ("1.0.2")); - LONGS_EQUAL(0x01010000, util_version_number ("1.1")); - LONGS_EQUAL(0x01010100, util_version_number ("1.1.1")); - LONGS_EQUAL(0x01010200, util_version_number ("1.1.2")); - LONGS_EQUAL(0x01020304, util_version_number ("1.2.3.4")); + CHECK(util_version_number ("0.3.2-dev") == 0x00030200); + CHECK(util_version_number ("0.3.2-rc1") == 0x00030200); + CHECK(util_version_number ("0.3.2") == 0x00030200); + CHECK(util_version_number ("0.3.1.1") == 0x00030101); + CHECK(util_version_number ("0.3.1") == 0x00030100); + CHECK(util_version_number ("0.3.0") == 0x00030000); + CHECK(util_version_number ("1.0") == 0x01000000); + CHECK(util_version_number ("1.0.0") == 0x01000000); + CHECK(util_version_number ("1.0.0.0") == 0x01000000); + CHECK(util_version_number ("1.0.1") == 0x01000100); + CHECK(util_version_number ("1.0.2") == 0x01000200); + CHECK(util_version_number ("1.1") == 0x01010000); + CHECK(util_version_number ("1.1.1") == 0x01010100); + CHECK(util_version_number ("1.1.2") == 0x01010200); + CHECK(util_version_number ("1.2.3.4") == 0x01020304); + CHECK(util_version_number ("255.255.255.255") == 0xFFFFFFFF); + CHECK(util_version_number ("999999999.999999999.999999999.999999999") == 0xFFFFFFFF); } diff --git a/tests/unit/plugins/test-plugin-api-info.cpp b/tests/unit/plugins/test-plugin-api-info.cpp index e5979dc7b..e4b2abea2 100644 --- a/tests/unit/plugins/test-plugin-api-info.cpp +++ b/tests/unit/plugins/test-plugin-api-info.cpp @@ -83,7 +83,7 @@ TEST(PluginApiInfo, VersionNumberCb) char *str, str_version_number[128]; snprintf (str_version_number, sizeof (str_version_number), - "%d", util_version_number (version_get_version ())); + "%lu", util_version_number (version_get_version ())); WEE_TEST_STR(str_version_number, hook_info_get (NULL, "version_number", NULL)); WEE_TEST_STR(str_version_number, hook_info_get (NULL, "version_number", ""));