Piotr Caban : msvcrt: Don't detect overflow in atoi implementation.

Alexandre Julliard julliard at winehq.org
Tue Jun 4 15:48:35 CDT 2013


Module: wine
Branch: master
Commit: f3eb64ec7344e97067a4defa366896489cd1be20
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f3eb64ec7344e97067a4defa366896489cd1be20

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Jun  4 15:52:10 2013 +0200

msvcrt: Don't detect overflow in atoi implementation.

---

 dlls/msvcr100/msvcr100.c       |    5 +++++
 dlls/msvcr100/msvcr100.spec    |    2 +-
 dlls/msvcr100/tests/msvcr100.c |   20 ++++++++++++++++++++
 dlls/msvcr110/msvcr110.spec    |    2 +-
 dlls/msvcr70/msvcr70.spec      |    2 +-
 dlls/msvcr71/msvcr71.spec      |    2 +-
 dlls/msvcr80/msvcr80.spec      |    2 +-
 dlls/msvcr90/msvcr90.spec      |    2 +-
 dlls/msvcrt/string.c           |   22 +++++++++++++++++++++-
 dlls/msvcrt/tests/string.c     |   18 ++++++++++++++++++
 include/msvcrt/stdlib.h        |    1 +
 11 files changed, 71 insertions(+), 7 deletions(-)

diff --git a/dlls/msvcr100/msvcr100.c b/dlls/msvcr100/msvcr100.c
index 149f132..d425455 100644
--- a/dlls/msvcr100/msvcr100.c
+++ b/dlls/msvcr100/msvcr100.c
@@ -484,6 +484,11 @@ size_t CDECL _aligned_msize(void *p, size_t alignment, size_t offset)
     return _msize(*alloc_ptr)-alignment-sizeof(void*);
 }
 
+int CDECL MSVCR100_atoi(const char *str)
+{
+    return _atoi_l(str, NULL);
+}
+
 /*********************************************************************
  *  DllMain (MSVCR100.@)
  */
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 370feb2..63a0caa 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -1629,7 +1629,7 @@
 @ cdecl -arch=arm,x86_64 atan2f(float float) msvcrt.atan2f
 @ cdecl atexit(ptr) msvcrt.atexit
 @ cdecl atof(str) msvcrt.atof
-@ cdecl atoi(str) msvcrt.atoi
+@ cdecl atoi(str) MSVCR100_atoi
 @ cdecl atol(str) msvcrt.atol
 @ cdecl bsearch(ptr ptr long long ptr) msvcrt.bsearch
 @ cdecl bsearch_s(ptr ptr long long ptr ptr) msvcrt.bsearch_s
diff --git a/dlls/msvcr100/tests/msvcr100.c b/dlls/msvcr100/tests/msvcr100.c
index 99834dd..7550eb9 100644
--- a/dlls/msvcr100/tests/msvcr100.c
+++ b/dlls/msvcr100/tests/msvcr100.c
@@ -75,6 +75,7 @@ static size_t (__cdecl *p_fread_s)(void*,size_t,size_t,size_t,FILE*);
 static void* (__cdecl *p__aligned_offset_malloc)(size_t, size_t, size_t);
 static void (__cdecl *p__aligned_free)(void*);
 static size_t (__cdecl *p__aligned_msize)(void*, size_t, size_t);
+static int (__cdecl *p_atoi)(const char*);
 
 /* make sure we use the correct errno */
 #undef errno
@@ -104,6 +105,7 @@ static BOOL init(void)
     SET(p__aligned_offset_malloc, "_aligned_offset_malloc");
     SET(p__aligned_free, "_aligned_free");
     SET(p__aligned_msize, "_aligned_msize");
+    SET(p_atoi, "atoi");
 
     return TRUE;
 }
@@ -358,6 +360,23 @@ static void test__aligned_msize(void)
     p__aligned_free(mem);
 }
 
+static void test_atoi(void)
+{
+    int r;
+
+    r = p_atoi("0");
+    ok(r == 0, "atoi(0) = %d\n", r);
+
+    r = p_atoi("-1");
+    ok(r == -1, "atoi(-1) = %d\n", r);
+
+    r = p_atoi("1");
+    ok(r == 1, "atoi(1) = %d\n", r);
+
+    r = p_atoi("4294967296");
+    ok(r == 2147483647, "atoi(4294967296) = %d\n", r);
+}
+
 START_TEST(msvcr100)
 {
     if (!init())
@@ -367,4 +386,5 @@ START_TEST(msvcr100)
     test_wmemmove_s();
     test_fread_s();
     test__aligned_msize();
+    test_atoi();
 }
diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec
index c38763a..e82f100 100644
--- a/dlls/msvcr110/msvcr110.spec
+++ b/dlls/msvcr110/msvcr110.spec
@@ -1991,7 +1991,7 @@
 @ cdecl -arch=arm,x86_64 atan2f(float float) msvcrt.atan2f
 @ cdecl atexit(ptr) msvcrt.atexit
 @ cdecl atof(str) msvcrt.atof
-@ cdecl atoi(str) msvcrt.atoi
+@ cdecl atoi(str) msvcr100.atoi #don't forward to msvcrt
 @ cdecl atol(str) msvcrt.atol
 @ cdecl bsearch(ptr ptr long long ptr) msvcrt.bsearch
 @ cdecl bsearch_s(ptr ptr long long ptr ptr) msvcrt.bsearch_s
diff --git a/dlls/msvcr70/msvcr70.spec b/dlls/msvcr70/msvcr70.spec
index 2ed25c2..1a33fbb 100644
--- a/dlls/msvcr70/msvcr70.spec
+++ b/dlls/msvcr70/msvcr70.spec
@@ -688,7 +688,7 @@
 @ cdecl atan2(double double) msvcrt.atan2
 @ cdecl atexit(ptr) msvcrt.atexit
 @ cdecl atof(str) msvcrt.atof
-@ cdecl atoi(str) msvcrt.atoi
+@ cdecl atoi(str) msvcr100.atoi #don't forward to msvcrt
 @ cdecl atol(str) msvcrt.atol
 @ cdecl bsearch(ptr ptr long long ptr) msvcrt.bsearch
 @ cdecl calloc(long long) msvcrt.calloc
diff --git a/dlls/msvcr71/msvcr71.spec b/dlls/msvcr71/msvcr71.spec
index 0f985c7..afdab05 100644
--- a/dlls/msvcr71/msvcr71.spec
+++ b/dlls/msvcr71/msvcr71.spec
@@ -684,7 +684,7 @@
 @ cdecl atan2(double double) msvcrt.atan2
 @ cdecl atexit(ptr) msvcrt.atexit
 @ cdecl atof(str) msvcrt.atof
-@ cdecl atoi(str) msvcrt.atoi
+@ cdecl atoi(str) msvcr100.atoi #don't forward to msvcrt
 @ cdecl atol(str) msvcrt.atol
 @ cdecl bsearch(ptr ptr long long ptr) msvcrt.bsearch
 @ cdecl calloc(long long) msvcrt.calloc
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 47bf34f..521a69d 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -1310,7 +1310,7 @@
 @ cdecl -arch=arm,x86_64 atan2f(float float) msvcrt.atan2f
 @ cdecl atexit(ptr) msvcrt.atexit
 @ cdecl atof(str) msvcrt.atof
-@ cdecl atoi(str) msvcrt.atoi
+@ cdecl atoi(str) msvcr100.atoi #don't forward to msvcrt
 @ cdecl atol(str) msvcrt.atol
 @ cdecl bsearch(ptr ptr long long ptr) msvcrt.bsearch
 @ cdecl bsearch_s(ptr ptr long long ptr ptr) msvcrt.bsearch_s
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index d76ab73..fd71ef4 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -1283,7 +1283,7 @@
 @ cdecl -arch=arm,x86_64 atanf(float) msvcrt.atanf
 @ cdecl atexit(ptr) msvcrt.atexit
 @ cdecl atof(str) msvcrt.atof
-@ cdecl atoi(str) msvcrt.atoi
+@ cdecl atoi(str) msvcr100.atoi ##don't forward to msvcrt
 @ cdecl atol(str) msvcrt.atol
 @ cdecl bsearch(ptr ptr long long ptr) msvcrt.bsearch
 @ cdecl bsearch_s(ptr ptr long long ptr ptr) msvcrt.bsearch_s
diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c
index 9ad4cef..f2d1e20 100644
--- a/dlls/msvcrt/string.c
+++ b/dlls/msvcrt/string.c
@@ -893,7 +893,27 @@ int __cdecl MSVCRT__atoi_l(const char *str, MSVCRT__locale_t locale)
  */
 int __cdecl MSVCRT_atoi(const char *str)
 {
-    return MSVCRT__atoi_l(str, NULL);
+    BOOL minus = FALSE;
+    int ret = 0;
+
+    if(!str)
+        return 0;
+
+    while(isspace(*str)) str++;
+
+    if(*str == '+') {
+        str++;
+    }else if(*str == '-') {
+        minus = TRUE;
+        str++;
+    }
+
+    while(*str>='0' && *str<='9') {
+        ret = ret*10+*str-'0';
+        str++;
+    }
+
+    return minus ? -ret : ret;
 }
 
 /*********************************************************************
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index 31314fd..6115377 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -2521,6 +2521,23 @@ static void test__wcstoi64(void)
     return;
 }
 
+static void test_atoi(void)
+{
+    int r;
+
+    r = atoi("0");
+    ok(r == 0, "atoi(0) = %d\n", r);
+
+    r = atoi("-1");
+    ok(r == -1, "atoi(-1) = %d\n", r);
+
+    r = atoi("1");
+    ok(r == 1, "atoi(1) = %d\n", r);
+
+    r = atoi("4294967296");
+    ok(r == 0, "atoi(4294967296) = %d\n", r);
+}
+
 START_TEST(string)
 {
     char mem[100];
@@ -2620,4 +2637,5 @@ START_TEST(string)
     test__atodbl();
     test__stricmp();
     test__wcstoi64();
+    test_atoi();
 }
diff --git a/include/msvcrt/stdlib.h b/include/msvcrt/stdlib.h
index d4755f4..e88ffa3 100644
--- a/include/msvcrt/stdlib.h
+++ b/include/msvcrt/stdlib.h
@@ -182,6 +182,7 @@ int           __cdecl abs(int);
 int           __cdecl atexit(void (*)(void));
 double        __cdecl atof(const char*);
 int           __cdecl atoi(const char*);
+int           __cdecl _atoi_l(const char*,_locale_t);
 __msvcrt_long __cdecl atol(const char*);
 void*         __cdecl calloc(size_t,size_t);
 #ifndef __i386__




More information about the wine-cvs mailing list