]> jfr.im git - irc/weechat/weechat.git/commitdiff
xfer: fix conversion of string to IPv4 on 32-bit systems (issue #1999)
authorSébastien Helleu <redacted>
Fri, 18 Aug 2023 13:34:06 +0000 (15:34 +0200)
committerSébastien Helleu <redacted>
Fri, 18 Aug 2023 14:44:36 +0000 (16:44 +0200)
ChangeLog.adoc
src/plugins/xfer/xfer-network.c
tests/unit/plugins/xfer/test-xfer-network.cpp

index 7f7d772315bc74891aa51a0100f932338b03f1d9..ea7c2553e23489595543217c68e400f4d0f27f54 100644 (file)
@@ -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::
 
index fffb7d8697061f680e5361df2097d43be8ae6fcc..5ba39b4bf470d0ba71025a972dd936298bbc19c4 100644 (file)
@@ -23,6 +23,7 @@
 #include <unistd.h>
 #include <errno.h>
 #include <stdio.h>
+#include <stdint.h>
 #include <string.h>
 #include <fcntl.h>
 #include <sys/types.h>
@@ -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,
index 9f5895a9fbb0a40e3bbc2284f2404c568a5e5d24..6a8fbbc6aa85ac6d84a6f6518f963ffb87005798 100644 (file)
@@ -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"));