Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2a8ef68

Browse files
committed
Issue #22733: MSVC ffi_prep_args doesn't handle 64-bit arguments properly
1 parent 64c8914 commit 2a8ef68

1 file changed

Lines changed: 28 additions & 9 deletions

File tree

  • Modules/_ctypes/libffi_msvc

Modules/_ctypes/libffi_msvc/ffi.c

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,37 +65,56 @@ void ffi_prep_args(char *stack, extended_cif *ecif)
6565
argp = (char *) ALIGN(argp, sizeof(void *));
6666

6767
z = (*p_arg)->size;
68-
if (z < sizeof(int))
68+
if (z < sizeof(intptr_t))
6969
{
70-
z = sizeof(int);
70+
z = sizeof(intptr_t);
7171
switch ((*p_arg)->type)
7272
{
7373
case FFI_TYPE_SINT8:
74-
*(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
74+
*(intptr_t *) argp = (intptr_t)*(SINT8 *)(* p_argv);
7575
break;
7676

7777
case FFI_TYPE_UINT8:
78-
*(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
78+
*(uintptr_t *) argp = (uintptr_t)*(UINT8 *)(* p_argv);
7979
break;
8080

8181
case FFI_TYPE_SINT16:
82-
*(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
82+
*(intptr_t *) argp = (intptr_t)*(SINT16 *)(* p_argv);
8383
break;
8484

8585
case FFI_TYPE_UINT16:
86-
*(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
86+
*(uintptr_t *) argp = (uintptr_t)*(UINT16 *)(* p_argv);
8787
break;
8888

8989
case FFI_TYPE_SINT32:
90-
*(signed int *) argp = (signed int)*(SINT32 *)(* p_argv);
90+
*(intptr_t *) argp = (intptr_t)*(SINT32 *)(* p_argv);
9191
break;
9292

9393
case FFI_TYPE_UINT32:
94-
*(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
94+
*(uintptr_t *) argp = (uintptr_t)*(UINT32 *)(* p_argv);
95+
break;
96+
97+
case FFI_TYPE_FLOAT:
98+
*(uintptr_t *) argp = 0;
99+
*(float *) argp = *(float *)(* p_argv);
100+
break;
101+
102+
// 64-bit value cases should never be used for x86 and AMD64 builds
103+
case FFI_TYPE_SINT64:
104+
*(intptr_t *) argp = (intptr_t)*(SINT64 *)(* p_argv);
105+
break;
106+
107+
case FFI_TYPE_UINT64:
108+
*(uintptr_t *) argp = (uintptr_t)*(UINT64 *)(* p_argv);
95109
break;
96110

97111
case FFI_TYPE_STRUCT:
98-
*(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
112+
*(uintptr_t *) argp = (uintptr_t)*(UINT32 *)(* p_argv);
113+
break;
114+
115+
case FFI_TYPE_DOUBLE:
116+
*(uintptr_t *) argp = 0;
117+
*(double *) argp = *(double *)(* p_argv);
99118
break;
100119

101120
default:

0 commit comments

Comments
 (0)