Piotr Caban : msvcp90: Allocate facetvec of size at least 40 in locale:: _Locimp::_Locimp_Addfac.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed May 4 11:38:21 CDT 2016
Module: wine
Branch: master
Commit: a8399b38724b674fd0920ea8c9095df123e04ac6
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a8399b38724b674fd0920ea8c9095df123e04ac6
Author: Piotr Caban <piotr at codeweavers.com>
Date: Wed May 4 14:29:35 2016 +0200
msvcp90: Allocate facetvec of size at least 40 in locale::_Locimp::_Locimp_Addfac.
Matlab depends on facetvec internal buffer not being reallocated.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/msvcp90/locale.c | 4 ++--
dlls/msvcp90/tests/misc.c | 35 +++++++++++++++++++++++++++++++++++
2 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/dlls/msvcp90/locale.c b/dlls/msvcp90/locale.c
index d0fbee0..24cacc7 100644
--- a/dlls/msvcp90/locale.c
+++ b/dlls/msvcp90/locale.c
@@ -10204,8 +10204,8 @@ void __cdecl locale__Locimp__Locimp_Addfac(locale__Locimp *locimp, locale_facet
MSVCP_size_t new_size = id+1;
locale_facet **new_facetvec;
- if(new_size < locale_id__Id_cnt+1)
- new_size = locale_id__Id_cnt+1;
+ if(new_size < 40)
+ new_size = 40;
new_facetvec = MSVCRT_operator_new(sizeof(locale_facet*)*new_size);
if(!new_facetvec) {
diff --git a/dlls/msvcp90/tests/misc.c b/dlls/msvcp90/tests/misc.c
index 34d6090..2c61bcc 100644
--- a/dlls/msvcp90/tests/misc.c
+++ b/dlls/msvcp90/tests/misc.c
@@ -81,6 +81,22 @@ typedef struct {
float imag;
} complex_float;
+typedef struct {
+ void *vtable;
+ size_t refs;
+} locale_facet;
+
+typedef unsigned char MSVCP_bool;
+
+typedef struct _locale__Locimp {
+ locale_facet facet;
+ locale_facet **facetvec;
+ size_t facet_cnt;
+ int catmask;
+ MSVCP_bool transparent;
+ basic_string_char name;
+} locale__Locimp;
+
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);
@@ -102,6 +118,7 @@ static MSVCP__Ctypevec* (__cdecl *p__Getctype)(MSVCP__Ctypevec*);
static /*MSVCP__Collvec*/ULONGLONG (__cdecl *p__Getcoll)(void);
static wctrans_t (__cdecl *p_wctrans)(const char*);
static wint_t (__cdecl *p_towctrans)(wint_t, wctrans_t);
+static void (__cdecl *p_locale__Locimp__Locimp_Addfac)(locale__Locimp*,locale_facet*,size_t);
#undef __thiscall
#ifdef __i386__
@@ -250,6 +267,8 @@ static BOOL init(void)
SET(p_std_Ctraits_long_double__Isnan, "?_Isnan@?$_Ctraits at O@std@@SA_NO at Z");
if(sizeof(void*) == 8) { /* 64-bit initialization */
+ SET(p_locale__Locimp__Locimp_Addfac,
+ "?_Locimp_Addfac at _Locimp@locale at std@@CAXPEAV123 at PEAVfacet@23 at _K@Z");
SET(p_char_assign, "?assign@?$char_traits at D@std@@SAXAEADAEBD at Z");
SET(p_wchar_assign, "?assign@?$char_traits at _W@std@@SAXAEA_WAEB_W at Z");
SET(p_short_assign, "?assign@?$char_traits at G@std@@SAXAEAGAEBG at Z");
@@ -310,6 +329,8 @@ static BOOL init(void)
SET(p_complex_float_pow_cf,
"??$pow at M@std@@YA?AV?$complex at M@0 at AEBV10@AEBM at Z");
} else {
+ SET(p_locale__Locimp__Locimp_Addfac,
+ "?_Locimp_Addfac at _Locimp@locale at std@@CAXPAV123 at PAVfacet@23 at I@Z");
#ifdef __arm__
SET(p_char_assign, "?assign@?$char_traits at D@std@@SAXAADABD at Z");
SET(p_wchar_assign, "?assign@?$char_traits at _W@std@@SAXAA_WAB_W at Z");
@@ -1050,6 +1071,19 @@ static void test_vbtable_size_exports(void)
}
}
+
+
+static void test_locale__Locimp__Locimp_Addfac(void)
+{
+ locale__Locimp locimp;
+ locale_facet facet;
+
+ memset(&locimp, 0, sizeof(locimp));
+ memset(&facet, 0, sizeof(facet));
+ p_locale__Locimp__Locimp_Addfac(&locimp, &facet, 1);
+ ok(locimp.facet_cnt == 40, "locimp.facet_cnt = %d\n", (int)locimp.facet_cnt);
+}
+
START_TEST(misc)
{
if(!init())
@@ -1068,6 +1102,7 @@ START_TEST(misc)
test_Ctraits_math_functions();
test_complex();
test_vbtable_size_exports();
+ test_locale__Locimp__Locimp_Addfac();
ok(!invalid_parameter, "invalid_parameter_handler was invoked too many times\n");
More information about the wine-cvs
mailing list