]> granicus.if.org Git - php/commitdiff
fix int overflow preserving the old behavior
authorAnatol Belski <ab@php.net>
Sun, 14 Sep 2014 14:37:38 +0000 (16:37 +0200)
committerAnatol Belski <ab@php.net>
Sun, 14 Sep 2014 14:39:25 +0000 (16:39 +0200)
ext/standard/strnatcmp.c

index face191a6ede9c2c5cb83c25b72e8f4f389c1138..7b3826b5befb8de481accf3bdf08f61ccfbcd5cf 100644 (file)
@@ -108,8 +108,25 @@ PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len
        int fractional, result;
        short leading = 1;
 
-       if (a_len == 0 || b_len == 0)
-               return a_len - b_len;
+       if (a_len == 0 || b_len == 0) {
+               result = 0;
+
+               if (a_len > b_len) {
+                       if (a_len - b_len <= INT_MAX) {
+                               result = (int)(a_len - b_len);
+                       } else {
+                               result = 1;
+                       }
+               } else {
+                       if (b_len - a_len <= (size_t)(-INT_MIN)) {
+                               result = -(int)(b_len - a_len);
+                       } else {
+                               result = -1;
+                       }
+               }
+
+               return result;
+       }
 
        ap = a;
        bp = b;