cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=53e0a2d6bd726385ae9c702eb54299287af781f6

commit 53e0a2d6bd726385ae9c702eb54299287af781f6
Author: Sylvain Laperche <sylvain.laper...@gmail.com>
Date:   Fri Mar 7 10:58:36 2014 +0800

    eina: Fix bug in eina_convert_itoa
    
    The current implementation of eina_convert_itoa cannot convert INT_MIN.
    
    When the input number is negative, the function negates it and this is
    an undefined behavior for INT_MIN since -INT_MIN cannot be represented
    in a signed int.
    
    @fix T1062
    
    Signed-off-by: Cedric BAIL <cedric.b...@samsung.com>
---
 src/lib/eina/eina_convert.c        | 5 ++---
 src/tests/eina/eina_test_convert.c | 6 ++++++
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/lib/eina/eina_convert.c b/src/lib/eina/eina_convert.c
index 3eeacda..0255b00 100644
--- a/src/lib/eina/eina_convert.c
+++ b/src/lib/eina/eina_convert.c
@@ -157,14 +157,13 @@ eina_convert_itoa(int n, char *s)
 
    if (n < 0)
      {
-        n = -n;
         *s++ = '-';
         r = 1;
      }
 
    do {
-        s[i++] = n % 10 + '0';
-   } while ((n /= 10) > 0);
+        s[i++] = abs(n % 10) + '0';
+   } while (n /= 10);
 
    s[i] = '\0';
 
diff --git a/src/tests/eina/eina_test_convert.c 
b/src/tests/eina/eina_test_convert.c
index 8e7f58c..68472ab 100644
--- a/src/tests/eina/eina_test_convert.c
+++ b/src/tests/eina/eina_test_convert.c
@@ -24,6 +24,7 @@
 #include <string.h>
 #include <math.h>
 #include <float.h>
+#include <limits.h>
 
 #include "eina_suite.h"
 #include "Eina.h"
@@ -31,6 +32,7 @@
 START_TEST(eina_convert_simple)
 {
    char tmp[128];
+   char ref[128];
 
    fail_if(eina_convert_itoa(0, tmp) != 1);
    fail_if(strcmp(tmp, "0") != 0);
@@ -47,6 +49,10 @@ START_TEST(eina_convert_simple)
    fail_if(eina_convert_itoa(10000000, tmp) != 8);
    fail_if(strcmp(tmp, "10000000") != 0);
 
+   snprintf(ref, sizeof (ref), "%d", INT_MIN);
+   fail_if(eina_convert_itoa(INT_MIN, tmp) != (int) strlen(ref));
+   fail_if(strcmp(tmp, ref) != 0);
+
    fail_if(eina_convert_xtoa(0, tmp) != 1);
    fail_if(strcmp(tmp, "0") != 0);
 

-- 


Reply via email to