Alexandre Julliard : user32: Add an exception handler around LB_GETTEXT to hide a Delphi bug.
Alexandre Julliard
julliard at winehq.org
Fri May 2 07:06:34 CDT 2008
Module: wine
Branch: master
Commit: f39d39e35f2d2c04bb3fecc48f27046d2ae502f0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f39d39e35f2d2c04bb3fecc48f27046d2ae502f0
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri May 2 11:39:42 2008 +0200
user32: Add an exception handler around LB_GETTEXT to hide a Delphi bug.
---
dlls/user32/listbox.c | 29 ++++++++++++++++++++++-------
1 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/dlls/user32/listbox.c b/dlls/user32/listbox.c
index 80ff0ac..ee326c6 100644
--- a/dlls/user32/listbox.c
+++ b/dlls/user32/listbox.c
@@ -43,6 +43,7 @@
#include "wine/unicode.h"
#include "user_private.h"
#include "controls.h"
+#include "wine/exception.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(listbox);
@@ -799,6 +800,8 @@ static BOOL LISTBOX_SetTabStops( LB_DESCR *descr, INT count, LPINT tabs, BOOL sh
*/
static LRESULT LISTBOX_GetText( LB_DESCR *descr, INT index, LPWSTR buffer, BOOL unicode )
{
+ DWORD len;
+
if ((index < 0) || (index >= descr->nb_items))
{
SetLastError(ERROR_INVALID_INDEX);
@@ -808,7 +811,7 @@ static LRESULT LISTBOX_GetText( LB_DESCR *descr, INT index, LPWSTR buffer, BOOL
{
if (!buffer)
{
- DWORD len = strlenW(descr->items[index].str);
+ len = strlenW(descr->items[index].str);
if( unicode )
return len;
return WideCharToMultiByte( CP_ACP, 0, descr->items[index].str, len,
@@ -817,20 +820,32 @@ static LRESULT LISTBOX_GetText( LB_DESCR *descr, INT index, LPWSTR buffer, BOOL
TRACE("index %d (0x%04x) %s\n", index, index, debugstr_w(descr->items[index].str));
- if(unicode)
+ __TRY /* hide a Delphi bug that passes a read-only buffer */
{
- strcpyW( buffer, descr->items[index].str );
- return strlenW(buffer);
+ if(unicode)
+ {
+ strcpyW( buffer, descr->items[index].str );
+ len = strlenW(buffer);
+ }
+ else
+ {
+ len = WideCharToMultiByte(CP_ACP, 0, descr->items[index].str, -1,
+ (LPSTR)buffer, 0x7FFFFFFF, NULL, NULL) - 1;
+ }
}
- else
+ __EXCEPT_PAGE_FAULT
{
- return WideCharToMultiByte(CP_ACP, 0, descr->items[index].str, -1, (LPSTR)buffer, 0x7FFFFFFF, NULL, NULL) - 1;
+ WARN( "got an invalid buffer (Delphi bug?)\n" );
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return LB_ERR;
}
+ __ENDTRY
} else {
if (buffer)
*((LPDWORD)buffer)=*(LPDWORD)(&descr->items[index].data);
- return sizeof(DWORD);
+ len = sizeof(DWORD);
}
+ return len;
}
static inline INT LISTBOX_lstrcmpiW( LCID lcid, LPCWSTR str1, LPCWSTR str2 )
More information about the wine-cvs
mailing list