dinput: Zero the out buffer.
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index 54fefbe..7d9f728 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -265,11 +265,13 @@
}
/* Conversion between internal data buffer and external data buffer */
-void fill_DataFormat(void *out, const void *in, const DataFormat *df) {
+void fill_DataFormat(void *out, DWORD size, const void *in, const DataFormat *df)
+{
int i;
const char *in_c = in;
char *out_c = (char *) out;
+ memset(out, 0, size);
if (df->dt == NULL) {
/* This means that the app uses Wine's internal data format */
memcpy(out, in, df->internal_format_size);
diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h
index 9321250..7b62a50 100644
--- a/dlls/dinput/device_private.h
+++ b/dlls/dinput/device_private.h
@@ -76,7 +76,7 @@
extern DWORD get_config_key(HKEY, HKEY, const char*, char*, DWORD);
/* Routines to do DataFormat / WineFormat conversions */
-extern void fill_DataFormat(void *out, const void *in, const DataFormat *df) ;
+extern void fill_DataFormat(void *out, DWORD size, const void *in, const DataFormat *df) ;
extern HRESULT create_DataFormat(LPCDIDATAFORMAT asked_format, DataFormat *format);
extern void release_DataFormat(DataFormat *df) ;
extern void queue_event(LPDIRECTINPUTDEVICE8A iface, int ofs, DWORD data, DWORD time, DWORD seq);
diff --git a/dlls/dinput/joystick_linux.c b/dlls/dinput/joystick_linux.c
index 9dead0a..bcac66a 100644
--- a/dlls/dinput/joystick_linux.c
+++ b/dlls/dinput/joystick_linux.c
@@ -767,7 +767,7 @@
joy_polldev(This);
/* convert and copy data to user supplied buffer */
- fill_DataFormat(ptr, &This->js, &This->base.data_format);
+ fill_DataFormat(ptr, len, &This->js, &This->base.data_format);
return DI_OK;
}
diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c
index d3f7dc0..a7c9c63 100644
--- a/dlls/dinput/joystick_linuxinput.c
+++ b/dlls/dinput/joystick_linuxinput.c
@@ -802,7 +802,7 @@
joy_polldev(This);
/* convert and copy data to user supplied buffer */
- fill_DataFormat(ptr, &This->js, &This->base.data_format);
+ fill_DataFormat(ptr, len, &This->js, &This->base.data_format);
return DI_OK;
}
diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c
index cb290f6..b2c4942 100644
--- a/dlls/dinput/keyboard.c
+++ b/dlls/dinput/keyboard.c
@@ -283,7 +283,7 @@
}
}
- fill_DataFormat(ptr, This->DInputKeyState, &This->base.data_format);
+ fill_DataFormat(ptr, len, This->DInputKeyState, &This->base.data_format);
LeaveCriticalSection(&This->base.crit);
return DI_OK;
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index 1dc6a03..a361057 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -490,7 +490,7 @@
EnterCriticalSection(&This->base.crit);
/* Copy the current mouse state */
- fill_DataFormat(ptr, &(This->m_state), &This->base.data_format);
+ fill_DataFormat(ptr, len, &This->m_state, &This->base.data_format);
/* Initialize the buffer when in relative mode */
if (!(This->base.data_format.user_df->dwFlags & DIDF_ABSAXIS))
diff --git a/dlls/dinput/tests/keyboard.c b/dlls/dinput/tests/keyboard.c
index d427e65..de55d32 100644
--- a/dlls/dinput/tests/keyboard.c
+++ b/dlls/dinput/tests/keyboard.c
@@ -70,20 +70,21 @@
HRESULT hr;
LPDIRECTINPUTDEVICE pKeyboard;
BYTE kbd_state[256];
- BYTE custom_state[4];
+ LONG custom_state[6];
+ int i;
DIOBJECTDATAFORMAT dodf[] =
{
- { &GUID_Key, 0, DIDFT_MAKEINSTANCE(DIK_Q)|DIDFT_BUTTON, 0 },
- { &GUID_Key, 1, DIDFT_MAKEINSTANCE(DIK_W)|DIDFT_BUTTON, 0 },
- { &GUID_Key, 2, DIDFT_MAKEINSTANCE(DIK_E)|DIDFT_BUTTON, 0 },
- { &GUID_Key, 3, DIDFT_MAKEINSTANCE(DIK_R)|DIDFT_BUTTON, 0 },
+ { &GUID_Key, sizeof(LONG) * 0, DIDFT_MAKEINSTANCE(DIK_Q)|DIDFT_BUTTON, 0 },
+ { &GUID_Key, sizeof(LONG) * 1, DIDFT_MAKEINSTANCE(DIK_W)|DIDFT_BUTTON, 0 },
+ { &GUID_Key, sizeof(LONG) * 2, DIDFT_MAKEINSTANCE(DIK_E)|DIDFT_BUTTON, 0 },
+ { &GUID_Key, sizeof(LONG) * 4, DIDFT_MAKEINSTANCE(DIK_R)|DIDFT_BUTTON, 0 },
};
DIDATAFORMAT df;
df.dwSize = sizeof( df );
df.dwObjSize = sizeof( DIOBJECTDATAFORMAT );
df.dwFlags = DIDF_RELAXIS;
- df.dwDataSize = sizeof( dodf )/sizeof( dodf[0] );
+ df.dwDataSize = sizeof( custom_state );
df.dwNumObjs = sizeof( dodf )/sizeof( dodf[0] );
df.rgodf = dodf;
@@ -120,6 +121,11 @@
hr = IDirectInputDevice_GetDeviceState(pKeyboard, sizeof(kbd_state), kbd_state);
ok(hr == DIERR_INVALIDPARAM, "IDirectInputDevice_GetDeviceState(256,) should have failed: %08x\n", hr);
+ memset(custom_state, 0x56, sizeof(custom_state));
+ IDirectInputDevice_GetDeviceState(pKeyboard, sizeof(custom_state), custom_state);
+ for (i = 0; i < sizeof(custom_state) / sizeof(custom_state[0]); i++)
+ ok(custom_state[i] == 0, "Should be zeroed, got 0x%08x\n", custom_state[i]);
+
if (pKeyboard) IUnknown_Release(pKeyboard);
}