mirror of
https://github.com/weechat/weechat.git
synced 2026-06-12 14:14:48 +02:00
core: fix integer overflow and return "unsigned long" in function util_version_number
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 :
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
----
|
||||
|
||||
引数:
|
||||
|
||||
@@ -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);
|
||||
----
|
||||
|
||||
Аргументи:
|
||||
|
||||
+9
-11
@@ -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];
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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", ""));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user