Skip to content

Commit 86c6a4e

Browse files
committed
[MSVCRT] Fix wine's broken _LDOUBLE stuff
1 parent 1106678 commit 86c6a4e

2 files changed

Lines changed: 28 additions & 0 deletions

File tree

dll/win32/msvcrt/msvcrt.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,13 @@ void __cdecl terminate(void);
7979

8080
typedef void (__cdecl *MSVCRT_security_error_handler)(int, void *);
8181

82+
#ifdef __REACTOS__
83+
// The wine version is wrong and causes buffer overruns in the test!
84+
typedef struct {UCHAR ld[10];} MSVCRT__LDOUBLE; /* Intel 80 bit FP format has sizeof() 10! The structure is documented!!! */
85+
typedef struct {ULONG x80[3];} WINE_BROKEN_LDOUBLE; /* Wine devs making up their own crap */
86+
#else
8287
typedef struct {ULONG x80[3];} MSVCRT__LDOUBLE; /* Intel 80 bit FP format has sizeof() 12 */
88+
#endif
8389

8490
typedef struct __lc_time_data {
8591
union {

dll/win32/msvcrt/string.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,11 @@ int fpnum_double(struct fpnum *fp, double *d)
478478

479479
#define LDBL_EXP_BITS 15
480480
#define LDBL_MANT_BITS 64
481+
#ifdef __REACTOS__
482+
int fpnum_ldouble(struct fpnum *fp, WINE_BROKEN_LDOUBLE *d)
483+
#else
481484
int fpnum_ldouble(struct fpnum *fp, MSVCRT__LDOUBLE *d)
485+
#endif
482486
{
483487
if (fp->mod == FP_VAL_INFINITY)
484488
{
@@ -1513,9 +1517,16 @@ size_t CDECL strxfrm( char *dest, const char *src, size_t len )
15131517
/********************************************************************
15141518
* __STRINGTOLD_L (MSVCR80.@)
15151519
*/
1520+
#ifdef __REACTOS__
1521+
int CDECL __STRINGTOLD_L( MSVCRT__LDOUBLE *value_, char **endptr,
1522+
#else
15161523
int CDECL __STRINGTOLD_L( MSVCRT__LDOUBLE *value, char **endptr,
1524+
#endif
15171525
const char *str, int flags, _locale_t locale )
15181526
{
1527+
#ifdef __REACTOS__
1528+
WINE_BROKEN_LDOUBLE value[1];
1529+
#endif
15191530
pthreadlocinfo locinfo;
15201531
const char *beg, *p;
15211532
int err, ret = 0;
@@ -1539,6 +1550,9 @@ int CDECL __STRINGTOLD_L( MSVCRT__LDOUBLE *value, char **endptr,
15391550

15401551
err = fpnum_ldouble(&fp, value);
15411552
if (err) ret = (value->x80[2] & 0x7fff ? 2 : 1);
1553+
#ifdef __REACTOS__
1554+
memcpy(value_, value, sizeof(*value_));
1555+
#endif
15421556
return ret;
15431557
}
15441558

@@ -2670,8 +2684,16 @@ struct _I10_OUTPUT_DATA {
26702684
* Native sets last byte of data->str to '0' or '9', I don't know what
26712685
* it means. Current implementation sets it always to '0'.
26722686
*/
2687+
#ifdef __REACTOS__
2688+
int CDECL I10_OUTPUT(MSVCRT__LDOUBLE ld80_, int prec, int flag, struct _I10_OUTPUT_DATA *data)
2689+
#else
26732690
int CDECL I10_OUTPUT(MSVCRT__LDOUBLE ld80, int prec, int flag, struct _I10_OUTPUT_DATA *data)
2691+
#endif
26742692
{
2693+
#ifdef __REACTOS__
2694+
WINE_BROKEN_LDOUBLE ld80 = { 0 };
2695+
memcpy(&ld80, &ld80_, sizeof(ld80_));
2696+
#endif
26752697
struct fpnum num;
26762698
double d;
26772699
char format[8];

0 commit comments

Comments
 (0)