forked from Mirrors/wine-wine
msvcrt: Fix strcpy implementation so it works on overlapping buffers.
Signed-off-by: Piotr Caban <piotr@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>oldstable
parent
967fb744e4
commit
395a65bdc6
|
@ -1800,7 +1800,7 @@
|
||||||
@ cdecl strchr(str long) MSVCRT_strchr
|
@ cdecl strchr(str long) MSVCRT_strchr
|
||||||
@ cdecl strcmp(str str) MSVCRT_strcmp
|
@ cdecl strcmp(str str) MSVCRT_strcmp
|
||||||
@ cdecl strcoll(str str) MSVCRT_strcoll
|
@ cdecl strcoll(str str) MSVCRT_strcoll
|
||||||
@ cdecl strcpy(ptr str) ntdll.strcpy
|
@ cdecl strcpy(ptr str) MSVCRT_strcpy
|
||||||
@ cdecl strcpy_s(ptr long str) MSVCRT_strcpy_s
|
@ cdecl strcpy_s(ptr long str) MSVCRT_strcpy_s
|
||||||
@ cdecl strcspn(str str) ntdll.strcspn
|
@ cdecl strcspn(str str) ntdll.strcspn
|
||||||
@ cdecl strerror(long) MSVCRT_strerror
|
@ cdecl strerror(long) MSVCRT_strerror
|
||||||
|
|
|
@ -2158,7 +2158,7 @@
|
||||||
@ cdecl strchr(str long) MSVCRT_strchr
|
@ cdecl strchr(str long) MSVCRT_strchr
|
||||||
@ cdecl strcmp(str str) MSVCRT_strcmp
|
@ cdecl strcmp(str str) MSVCRT_strcmp
|
||||||
@ cdecl strcoll(str str) MSVCRT_strcoll
|
@ cdecl strcoll(str str) MSVCRT_strcoll
|
||||||
@ cdecl strcpy(ptr str) ntdll.strcpy
|
@ cdecl strcpy(ptr str) MSVCRT_strcpy
|
||||||
@ cdecl strcpy_s(ptr long str) MSVCRT_strcpy_s
|
@ cdecl strcpy_s(ptr long str) MSVCRT_strcpy_s
|
||||||
@ cdecl strcspn(str str) ntdll.strcspn
|
@ cdecl strcspn(str str) ntdll.strcspn
|
||||||
@ cdecl strerror(long) MSVCRT_strerror
|
@ cdecl strerror(long) MSVCRT_strerror
|
||||||
|
|
|
@ -2368,7 +2368,7 @@
|
||||||
@ cdecl strchr(str long) MSVCRT_strchr
|
@ cdecl strchr(str long) MSVCRT_strchr
|
||||||
@ cdecl strcmp(str str) MSVCRT_strcmp
|
@ cdecl strcmp(str str) MSVCRT_strcmp
|
||||||
@ cdecl strcoll(str str) MSVCRT_strcoll
|
@ cdecl strcoll(str str) MSVCRT_strcoll
|
||||||
@ cdecl strcpy(ptr str) ntdll.strcpy
|
@ cdecl strcpy(ptr str) MSVCRT_strcpy
|
||||||
@ cdecl strcpy_s(ptr long str) MSVCRT_strcpy_s
|
@ cdecl strcpy_s(ptr long str) MSVCRT_strcpy_s
|
||||||
@ cdecl strcspn(str str) ntdll.strcspn
|
@ cdecl strcspn(str str) ntdll.strcspn
|
||||||
@ cdecl strerror(long) MSVCRT_strerror
|
@ cdecl strerror(long) MSVCRT_strerror
|
||||||
|
|
|
@ -813,7 +813,7 @@
|
||||||
@ cdecl strchr(str long) MSVCRT_strchr
|
@ cdecl strchr(str long) MSVCRT_strchr
|
||||||
@ cdecl strcmp(str str) MSVCRT_strcmp
|
@ cdecl strcmp(str str) MSVCRT_strcmp
|
||||||
@ cdecl strcoll(str str) MSVCRT_strcoll
|
@ cdecl strcoll(str str) MSVCRT_strcoll
|
||||||
@ cdecl strcpy(ptr str) ntdll.strcpy
|
@ cdecl strcpy(ptr str) MSVCRT_strcpy
|
||||||
@ cdecl strcspn(str str) ntdll.strcspn
|
@ cdecl strcspn(str str) ntdll.strcspn
|
||||||
@ cdecl strerror(long) MSVCRT_strerror
|
@ cdecl strerror(long) MSVCRT_strerror
|
||||||
@ cdecl strftime(ptr long str ptr) MSVCRT_strftime
|
@ cdecl strftime(ptr long str ptr) MSVCRT_strftime
|
||||||
|
|
|
@ -809,7 +809,7 @@
|
||||||
@ cdecl strchr(str long) MSVCRT_strchr
|
@ cdecl strchr(str long) MSVCRT_strchr
|
||||||
@ cdecl strcmp(str str) MSVCRT_strcmp
|
@ cdecl strcmp(str str) MSVCRT_strcmp
|
||||||
@ cdecl strcoll(str str) MSVCRT_strcoll
|
@ cdecl strcoll(str str) MSVCRT_strcoll
|
||||||
@ cdecl strcpy(ptr str) ntdll.strcpy
|
@ cdecl strcpy(ptr str) MSVCRT_strcpy
|
||||||
@ cdecl strcspn(str str) ntdll.strcspn
|
@ cdecl strcspn(str str) ntdll.strcspn
|
||||||
@ cdecl strerror(long) MSVCRT_strerror
|
@ cdecl strerror(long) MSVCRT_strerror
|
||||||
@ cdecl strftime(ptr long str ptr) MSVCRT_strftime
|
@ cdecl strftime(ptr long str ptr) MSVCRT_strftime
|
||||||
|
|
|
@ -1480,7 +1480,7 @@
|
||||||
@ cdecl strchr(str long) MSVCRT_strchr
|
@ cdecl strchr(str long) MSVCRT_strchr
|
||||||
@ cdecl strcmp(str str) MSVCRT_strcmp
|
@ cdecl strcmp(str str) MSVCRT_strcmp
|
||||||
@ cdecl strcoll(str str) MSVCRT_strcoll
|
@ cdecl strcoll(str str) MSVCRT_strcoll
|
||||||
@ cdecl strcpy(ptr str) ntdll.strcpy
|
@ cdecl strcpy(ptr str) MSVCRT_strcpy
|
||||||
@ cdecl strcpy_s(ptr long str) MSVCRT_strcpy_s
|
@ cdecl strcpy_s(ptr long str) MSVCRT_strcpy_s
|
||||||
@ cdecl strcspn(str str) ntdll.strcspn
|
@ cdecl strcspn(str str) ntdll.strcspn
|
||||||
@ cdecl strerror(long) MSVCRT_strerror
|
@ cdecl strerror(long) MSVCRT_strerror
|
||||||
|
|
|
@ -1453,7 +1453,7 @@
|
||||||
@ cdecl strchr(str long) MSVCRT_strchr
|
@ cdecl strchr(str long) MSVCRT_strchr
|
||||||
@ cdecl strcmp(str str) MSVCRT_strcmp
|
@ cdecl strcmp(str str) MSVCRT_strcmp
|
||||||
@ cdecl strcoll(str str) MSVCRT_strcoll
|
@ cdecl strcoll(str str) MSVCRT_strcoll
|
||||||
@ cdecl strcpy(ptr str) ntdll.strcpy
|
@ cdecl strcpy(ptr str) MSVCRT_strcpy
|
||||||
@ cdecl strcpy_s(ptr long str) MSVCRT_strcpy_s
|
@ cdecl strcpy_s(ptr long str) MSVCRT_strcpy_s
|
||||||
@ cdecl strcspn(str str) ntdll.strcspn
|
@ cdecl strcspn(str str) ntdll.strcspn
|
||||||
@ cdecl strerror(long) MSVCRT_strerror
|
@ cdecl strerror(long) MSVCRT_strerror
|
||||||
|
|
|
@ -1421,7 +1421,7 @@
|
||||||
@ cdecl strchr(str long) MSVCRT_strchr
|
@ cdecl strchr(str long) MSVCRT_strchr
|
||||||
@ cdecl strcmp(str str) MSVCRT_strcmp
|
@ cdecl strcmp(str str) MSVCRT_strcmp
|
||||||
@ cdecl strcoll(str str) MSVCRT_strcoll
|
@ cdecl strcoll(str str) MSVCRT_strcoll
|
||||||
@ cdecl strcpy(ptr str) ntdll.strcpy
|
@ cdecl strcpy(ptr str) MSVCRT_strcpy
|
||||||
@ cdecl strcpy_s(ptr long str) MSVCRT_strcpy_s
|
@ cdecl strcpy_s(ptr long str) MSVCRT_strcpy_s
|
||||||
@ cdecl strcspn(str str) ntdll.strcspn
|
@ cdecl strcspn(str str) ntdll.strcspn
|
||||||
@ cdecl strerror(long) MSVCRT_strerror
|
@ cdecl strerror(long) MSVCRT_strerror
|
||||||
|
|
|
@ -696,6 +696,16 @@ char* __cdecl MSVCRT_strncpy(char *dst, const char *src, MSVCRT_size_t len)
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
* strcpy (MSVCRT.@)
|
||||||
|
*/
|
||||||
|
char* CDECL MSVCRT_strcpy(char *dst, const char *src)
|
||||||
|
{
|
||||||
|
char *ret = dst;
|
||||||
|
while ((*dst++ = *src++));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* strcpy_s (MSVCRT.@)
|
* strcpy_s (MSVCRT.@)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -56,6 +56,7 @@ static void* (__cdecl *pmemcpy)(void *, const void *, size_t n);
|
||||||
static int (__cdecl *p_memcpy_s)(void *, size_t, const void *, size_t);
|
static int (__cdecl *p_memcpy_s)(void *, size_t, const void *, size_t);
|
||||||
static int (__cdecl *p_memmove_s)(void *, size_t, const void *, size_t);
|
static int (__cdecl *p_memmove_s)(void *, size_t, const void *, size_t);
|
||||||
static int* (__cdecl *pmemcmp)(void *, const void *, size_t n);
|
static int* (__cdecl *pmemcmp)(void *, const void *, size_t n);
|
||||||
|
static int (__cdecl *p_strcpy)(char *dst, const char *src);
|
||||||
static int (__cdecl *pstrcpy_s)(char *dst, size_t len, const char *src);
|
static int (__cdecl *pstrcpy_s)(char *dst, size_t len, const char *src);
|
||||||
static int (__cdecl *pstrcat_s)(char *dst, size_t len, const char *src);
|
static int (__cdecl *pstrcat_s)(char *dst, size_t len, const char *src);
|
||||||
static int (__cdecl *p_mbscat_s)(unsigned char *dst, size_t size, const unsigned char *src);
|
static int (__cdecl *p_mbscat_s)(unsigned char *dst, size_t size, const unsigned char *src);
|
||||||
|
@ -493,8 +494,8 @@ static void test_strdup(void)
|
||||||
static void test_strcpy_s(void)
|
static void test_strcpy_s(void)
|
||||||
{
|
{
|
||||||
char dest[8];
|
char dest[8];
|
||||||
const char *small = "small";
|
const char small[] = "small";
|
||||||
const char *big = "atoolongstringforthislittledestination";
|
const char big[] = "atoolongstringforthislittledestination";
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if(!pstrcpy_s)
|
if(!pstrcpy_s)
|
||||||
|
@ -543,6 +544,15 @@ static void test_strcpy_s(void)
|
||||||
|
|
||||||
ret = pstrcpy_s(NULL, sizeof(dest), small);
|
ret = pstrcpy_s(NULL, sizeof(dest), small);
|
||||||
ok(ret == EINVAL, "Copying a big string a NULL dest returned %d, expected EINVAL\n", ret);
|
ok(ret == EINVAL, "Copying a big string a NULL dest returned %d, expected EINVAL\n", ret);
|
||||||
|
|
||||||
|
/* strcpy overlapping buffers test */
|
||||||
|
memset(dest, 'X', sizeof(dest));
|
||||||
|
memcpy(dest+1, small, sizeof(small));
|
||||||
|
p_strcpy(dest, dest+1);
|
||||||
|
ok(dest[0] == 's' && dest[1] == 'm' && dest[2] == 'a' && dest[3] == 'l' &&
|
||||||
|
dest[4] == 'l' && dest[5] == '\0' && dest[6] == '\0' && dest[7] == 'X',
|
||||||
|
"Unexpected return data from strcpy: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",
|
||||||
|
dest[0], dest[1], dest[2], dest[3], dest[4], dest[5], dest[6], dest[7]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define NUMELMS(array) (sizeof(array)/sizeof((array)[0]))
|
#define NUMELMS(array) (sizeof(array)/sizeof((array)[0]))
|
||||||
|
@ -3199,6 +3209,7 @@ START_TEST(string)
|
||||||
SET(pmemcmp,"memcmp");
|
SET(pmemcmp,"memcmp");
|
||||||
SET(p_mbctype,"_mbctype");
|
SET(p_mbctype,"_mbctype");
|
||||||
SET(p__mb_cur_max,"__mb_cur_max");
|
SET(p__mb_cur_max,"__mb_cur_max");
|
||||||
|
SET(p_strcpy, "strcpy");
|
||||||
pstrcpy_s = (void *)GetProcAddress( hMsvcrt,"strcpy_s" );
|
pstrcpy_s = (void *)GetProcAddress( hMsvcrt,"strcpy_s" );
|
||||||
pstrcat_s = (void *)GetProcAddress( hMsvcrt,"strcat_s" );
|
pstrcat_s = (void *)GetProcAddress( hMsvcrt,"strcat_s" );
|
||||||
p_mbscat_s = (void*)GetProcAddress( hMsvcrt, "_mbscat_s" );
|
p_mbscat_s = (void*)GetProcAddress( hMsvcrt, "_mbscat_s" );
|
||||||
|
|
|
@ -2499,7 +2499,7 @@
|
||||||
@ cdecl strchr(str long) MSVCRT_strchr
|
@ cdecl strchr(str long) MSVCRT_strchr
|
||||||
@ cdecl strcmp(str str) MSVCRT_strcmp
|
@ cdecl strcmp(str str) MSVCRT_strcmp
|
||||||
@ cdecl strcoll(str str) MSVCRT_strcoll
|
@ cdecl strcoll(str str) MSVCRT_strcoll
|
||||||
@ cdecl strcpy(ptr str) ntdll.strcpy
|
@ cdecl strcpy(ptr str) MSVCRT_strcpy
|
||||||
@ cdecl strcpy_s(ptr long str) MSVCRT_strcpy_s
|
@ cdecl strcpy_s(ptr long str) MSVCRT_strcpy_s
|
||||||
@ cdecl strcspn(str str) ntdll.strcspn
|
@ cdecl strcspn(str str) ntdll.strcspn
|
||||||
@ cdecl strerror(long) MSVCRT_strerror
|
@ cdecl strerror(long) MSVCRT_strerror
|
||||||
|
|
Loading…
Reference in New Issue