Alexandre Julliard : msvcp90: Call the appropriate secure function instead of duplicating the checks.
Alexandre Julliard
julliard at winehq.org
Mon Jan 13 12:46:32 CST 2014
Module: wine
Branch: master
Commit: 0f81fcb02fbcaf19e3ec60bde76053e03163bc29
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0f81fcb02fbcaf19e3ec60bde76053e03163bc29
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Jan 13 11:50:10 2014 +0100
msvcp90: Call the appropriate secure function instead of duplicating the checks.
---
dlls/msvcp90/string.c | 56 ++++++++++-----------------------------------
dlls/msvcp90/tests/misc.c | 17 ++++++++------
2 files changed, 22 insertions(+), 51 deletions(-)
diff --git a/dlls/msvcp90/string.c b/dlls/msvcp90/string.c
index 97b0f40..f5a9fa7 100644
--- a/dlls/msvcp90/string.c
+++ b/dlls/msvcp90/string.c
@@ -109,14 +109,8 @@ MSVCP_size_t CDECL MSVCP_char_traits_char_length(const char *str)
char* CDECL MSVCP_char_traits_char__Copy_s(char *dest,
MSVCP_size_t size, const char *src, MSVCP_size_t count)
{
- if(!dest || !src || size<count) {
- if(dest && size)
- dest[0] = '\0';
- _invalid_parameter(NULL, NULL, NULL, 0, 0);
- return dest;
- }
-
- return memcpy(dest, src, count);
+ memcpy_s(dest, size, src, count);
+ return dest;
}
/* ?copy@?$char_traits at D@std@@SAPADPADPBDI at Z */
@@ -140,14 +134,8 @@ const char * CDECL MSVCP_char_traits_char_find(
char* CDECL MSVCP_char_traits_char__Move_s(char *dest,
MSVCP_size_t size, const char *src, MSVCP_size_t count)
{
- if(!dest || !src || size<count) {
- if(dest && size)
- dest[0] = '\0';
- _invalid_parameter(NULL, NULL, NULL, 0, 0);
- return dest;
- }
-
- return memmove(dest, src, count);
+ memmove_s(dest, size, src, count);
+ return dest;
}
/* ?move@?$char_traits at D@std@@SAPADPADPBDI at Z */
@@ -245,14 +233,8 @@ MSVCP_size_t CDECL MSVCP_char_traits_wchar_length(const wchar_t *str)
wchar_t* CDECL MSVCP_char_traits_wchar__Copy_s(wchar_t *dest,
MSVCP_size_t size, const wchar_t *src, MSVCP_size_t count)
{
- if(!dest || !src || size<count) {
- if(dest && size)
- dest[0] = '\0';
- _invalid_parameter(NULL, NULL, NULL, 0, 0);
- return dest;
- }
-
- return memcpy(dest, src, count * sizeof(wchar_t));
+ memcpy_s(dest, size * sizeof(wchar_t), src, count * sizeof(wchar_t));
+ return dest;
}
/* ?copy@?$char_traits at _W@std@@SAPA_WPA_WPB_WI at Z */
@@ -282,14 +264,8 @@ const wchar_t* CDECL MSVCP_char_traits_wchar_find(
wchar_t* CDECL MSVCP_char_traits_wchar__Move_s(wchar_t *dest,
MSVCP_size_t size, const wchar_t *src, MSVCP_size_t count)
{
- if(!dest || !src || size<count) {
- if(dest && size)
- dest[0] = '\0';
- _invalid_parameter(NULL, NULL, NULL, 0, 0);
- return dest;
- }
-
- return memmove(dest, src, count * sizeof(WCHAR));
+ memmove_s(dest, size * sizeof(wchar_t), src, count * sizeof(wchar_t));
+ return dest;
}
/* ?move@?$char_traits at _W@std@@SAPA_WPA_WPB_WI at Z */
@@ -404,12 +380,8 @@ MSVCP_size_t CDECL MSVCP_char_traits_short_length(const unsigned short *str)
unsigned short * CDECL MSVCP_char_traits_short__Copy_s(unsigned short *dest,
MSVCP_size_t size, const unsigned short *src, MSVCP_size_t count)
{
- if(size<count) {
- _invalid_parameter(NULL, NULL, NULL, 0, 0);
- return dest;
- }
-
- return memcpy(dest, src, count * sizeof(unsigned short));
+ memcpy_s(dest, size * sizeof(unsigned short), src, count * sizeof(unsigned short));
+ return dest;
}
/* ?copy@?$char_traits at G@std@@SAPAGPAGPBGI at Z */
@@ -439,12 +411,8 @@ const unsigned short* CDECL MSVCP_char_traits_short_find(
unsigned short* CDECL MSVCP_char_traits_short__Move_s(unsigned short *dest,
MSVCP_size_t size, const unsigned short *src, MSVCP_size_t count)
{
- if(size<count) {
- _invalid_parameter(NULL, NULL, NULL, 0, 0);
- return dest;
- }
-
- return memmove(dest, src, count * sizeof(unsigned short));
+ memmove_s(dest, size * sizeof(unsigned short), src, count * sizeof(unsigned short));
+ return dest;
}
/* ?move@?$char_traits at G@std@@SAPAGPAGPBGI at Z */
diff --git a/dlls/msvcp90/tests/misc.c b/dlls/msvcp90/tests/misc.c
index 445bb45..f294b2a 100644
--- a/dlls/msvcp90/tests/misc.c
+++ b/dlls/msvcp90/tests/misc.c
@@ -20,6 +20,7 @@
#include <locale.h>
#include <wctype.h>
#include <float.h>
+#include <errno.h>
#include <windef.h>
#include <winbase.h>
@@ -60,6 +61,7 @@ static void* (__cdecl *p_set_invalid_parameter_handler)(void*);
static _locale_t (__cdecl *p__get_current_locale)(void);
static void (__cdecl *p__free_locale)(_locale_t);
static void (__cdecl *p_free)(void*);
+static int * (__cdecl *p_errno)(void);
static void (__cdecl *p_char_assign)(void*, const void*);
static void (__cdecl *p_wchar_assign)(void*, const void*);
@@ -196,7 +198,8 @@ static BOOL init(void)
p__get_current_locale = (void*)GetProcAddress(msvcr, "_get_current_locale");
p__free_locale = (void*)GetProcAddress(msvcr, "_free_locale");
p_free = (void*)GetProcAddress(msvcr, "free");
- if(!p_set_invalid_parameter_handler || !p__get_current_locale || !p__free_locale || !p_free) {
+ p_errno = (void*)GetProcAddress(msvcr, "_errno");
+ if(!p_set_invalid_parameter_handler || !p__get_current_locale || !p__free_locale || !p_free || !p_errno) {
win_skip("Error setting tests environment\n");
return FALSE;
}
@@ -449,7 +452,7 @@ static void test_Copy_s(void)
ok(dest[4] == '#', "dest[4] != '#'\n");
ok(!memcmp(dest, src, sizeof(char[4])), "dest = %s\n", dest);
- errno = 0xdeadbeef;
+ *p_errno() = 0xdeadbeef;
dest[0] = '#';
ret = p_Copy_s(dest, 3, src, 4);
ok(ret == dest, "ret != dest\n");
@@ -457,21 +460,21 @@ static void test_Copy_s(void)
ok(invalid_parameter==1, "invalid_parameter = %d\n",
invalid_parameter);
invalid_parameter = 0;
- ok(errno == 0xdeadbeef, "errno = %d\n", errno);
+ ok(*p_errno() == ERANGE, "errno = %d\n", *p_errno());
- errno = 0xdeadbeef;
+ *p_errno() = 0xdeadbeef;
p_Copy_s(NULL, 32, src, 4);
ok(invalid_parameter==1, "invalid_parameter = %d\n",
invalid_parameter);
invalid_parameter = 0;
- ok(errno == 0xdeadbeef, "errno = %d\n", errno);
+ ok(*p_errno() == EINVAL, "errno = %d\n", *p_errno());
- errno = 0xdeadbeef;
+ *p_errno() = 0xdeadbeef;
p_Copy_s(dest, 32, NULL, 4);
ok(invalid_parameter==1, "invalid_parameter = %d\n",
invalid_parameter);
invalid_parameter = 0;
- ok(errno == 0xdeadbeef, "errno = %d\n", errno);
+ ok(*p_errno() == EINVAL, "errno = %d\n", *p_errno());
}
static void test_wctype(void)
More information about the wine-cvs
mailing list