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); --