From 647d7033cf406fa41b287d92dcdefb17fece7c77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Helleu?= Date: Fri, 18 Aug 2023 15:34:06 +0200 Subject: [PATCH] xfer: fix conversion of string to IPv4 on 32-bit systems (issue #1999) --- ChangeLog.adoc | 1 + src/plugins/xfer/xfer-network.c | 9 +++++---- tests/unit/plugins/xfer/test-xfer-network.cpp | 3 +++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/ChangeLog.adoc b/ChangeLog.adoc index 7f7d77231..ea7c2553e 100644 --- a/ChangeLog.adoc +++ b/ChangeLog.adoc @@ -19,6 +19,7 @@ Bug fixes:: * core: fix increment/decrement of options weechat.notify.* * irc: add missing tags on multiline messages (issue #1987) * irc: fix redirection of command `/list` when the reply doesn't start with message 321 (start of /list) + * xfer: fix conversion of string to IPv4 on 32-bit systems (issue #1999) Tests:: diff --git a/src/plugins/xfer/xfer-network.c b/src/plugins/xfer/xfer-network.c index fffb7d869..5ba39b4bf 100644 --- a/src/plugins/xfer/xfer-network.c +++ b/src/plugins/xfer/xfer-network.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -57,17 +58,17 @@ char * xfer_network_convert_integer_to_ipv4 (const char *str_address) { char *error, result[128]; - long number; + long long number; if (!str_address || !str_address[0]) return NULL; - number = strtol (str_address, &error, 10); - if (!error || error[0] || (number <= 0)) + number = strtoll (str_address, &error, 10); + if (!error || error[0] || (number <= 0) || (number > UINT32_MAX)) return NULL; snprintf (result, sizeof (result), - "%ld.%ld.%ld.%ld", + "%lld.%lld.%lld.%lld", (number >> 24) & 0xFF, (number >> 16) & 0xFF, (number >> 8) & 0xFF, diff --git a/tests/unit/plugins/xfer/test-xfer-network.cpp b/tests/unit/plugins/xfer/test-xfer-network.cpp index 9f5895a9f..6a8fbbc6a 100644 --- a/tests/unit/plugins/xfer/test-xfer-network.cpp +++ b/tests/unit/plugins/xfer/test-xfer-network.cpp @@ -49,6 +49,9 @@ TEST(XferNetwork, ConvertIntegerToIpv4) POINTERS_EQUAL(NULL, xfer_network_convert_integer_to_ipv4 ("0")); POINTERS_EQUAL(NULL, xfer_network_convert_integer_to_ipv4 ("-1")); + /* too big: UINT32_MAX + 1 = 4294967296 */ + POINTERS_EQUAL(NULL, xfer_network_convert_integer_to_ipv4 ("4294967296")); + WEE_TEST_STR("0.0.0.1", xfer_network_convert_integer_to_ipv4 ("1")); WEE_TEST_STR("0.0.1.0", xfer_network_convert_integer_to_ipv4 ("256")); WEE_TEST_STR("0.1.0.0", xfer_network_convert_integer_to_ipv4 ("65536"));