winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
March 2023
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
1 participants
910 discussions
Start a n
N
ew thread
Rémi Bernon : dinput: Only set DIPROP_RANGE in SetActionMap if range isn't empty.
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: 8e069f0bf2d9784b66ae863a9894d765e182787f URL:
https://gitlab.winehq.org/wine/wine/-/commit/8e069f0bf2d9784b66ae863a9894d7…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Mon Mar 20 16:18:58 2023 +0100 dinput: Only set DIPROP_RANGE in SetActionMap if range isn't empty. --- dlls/dinput/device.c | 9 ++++++--- dlls/dinput/tests/joystick8.c | 4 ---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c index a17df9aa69d..9dd7a3f478f 100644 --- a/dlls/dinput/device.c +++ b/dlls/dinput/device.c @@ -2084,9 +2084,12 @@ static HRESULT WINAPI dinput_device_SetActionMap( IDirectInputDevice8W *iface, D free( obj_df ); - prop_range.lMin = format->lAxisMin; - prop_range.lMax = format->lAxisMax; - IDirectInputDevice8_SetProperty( iface, DIPROP_RANGE, &prop_range.diph ); + if (format->lAxisMin != format->lAxisMax) + { + prop_range.lMin = format->lAxisMin; + prop_range.lMax = format->lAxisMax; + IDirectInputDevice8_SetProperty( iface, DIPROP_RANGE, &prop_range.diph ); + } prop_buffer.dwData = format->dwBufferSize; IDirectInputDevice8_SetProperty( iface, DIPROP_BUFFERSIZE, &prop_buffer.diph ); diff --git a/dlls/dinput/tests/joystick8.c b/dlls/dinput/tests/joystick8.c index 48e097dcafa..22a83f911bc 100644 --- a/dlls/dinput/tests/joystick8.c +++ b/dlls/dinput/tests/joystick8.c @@ -925,18 +925,14 @@ static void test_action_map( IDirectInputDevice8W *device, HANDLE file, HANDLE e prop_range.diph.dwObj = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( 2 ); hr = IDirectInputDevice8_GetProperty( device, DIPROP_RANGE, &prop_range.diph ); ok( hr == DI_OK, "GetProperty returned %#lx\n", hr ); - todo_wine ok( prop_range.lMin == +1000, "got lMin %+ld\n", prop_range.lMin ); - todo_wine ok( prop_range.lMax == +51000, "got lMax %+ld\n", prop_range.lMax ); prop_range.diph.dwHow = DIPH_BYUSAGE; prop_range.diph.dwObj = MAKELONG(HID_USAGE_GENERIC_X, HID_USAGE_PAGE_GENERIC); hr = IDirectInputDevice8_GetProperty( device, DIPROP_RANGE, &prop_range.diph ); ok( hr == DI_OK, "GetProperty returned %#lx\n", hr ); - todo_wine ok( prop_range.lMin == -14000, "got lMin %+ld\n", prop_range.lMin ); - todo_wine ok( prop_range.lMax == -4000, "got lMax %+ld\n", prop_range.lMax ); hr = IDirectInputDevice8_GetProperty( device, DIPROP_BUFFERSIZE, &prop_dword.diph );
1
0
0
0
Alex Henrie : wldap32: Handle null DN or null attr in ldap_compare* and add tests.
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: e9376fd18e58c6816855a96b51e20dcbeca26021 URL:
https://gitlab.winehq.org/wine/wine/-/commit/e9376fd18e58c6816855a96b51e20d…
Author: Alex Henrie <alexhenrie24(a)gmail.com> Date: Tue Mar 21 23:18:49 2023 -0600 wldap32: Handle null DN or null attr in ldap_compare* and add tests. Wine-Bug:
https://bugs.winehq.org/show_bug.cgi?id=54702
--- dlls/wldap32/compare.c | 16 ++++++---- dlls/wldap32/tests/parse.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 6 deletions(-) diff --git a/dlls/wldap32/compare.c b/dlls/wldap32/compare.c index d23e52ef207..cc51c64ebeb 100644 --- a/dlls/wldap32/compare.c +++ b/dlls/wldap32/compare.c @@ -81,9 +81,10 @@ ULONG CDECL ldap_compare_extA( LDAP *ld, char *dn, char *attr, char *value, stru data, serverctrls, clientctrls, message ); if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR; + if (!attr) return WLDAP32_LDAP_NO_MEMORY; if (dn && !(dnW = strAtoW( dn ))) goto exit; - if (attr && !(attrW = strAtoW( attr ))) goto exit; + if (!(attrW = strAtoW( attr ))) goto exit; if (value && !(valueW = strAtoW( value ))) goto exit; if (serverctrls && !(serverctrlsW = controlarrayAtoW( serverctrls ))) goto exit; if (clientctrls && !(clientctrlsW = controlarrayAtoW( clientctrls ))) goto exit; @@ -116,7 +117,7 @@ ULONG CDECL ldap_compare_extW( LDAP *ld, WCHAR *dn, WCHAR *attr, WCHAR *value, s if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR; if (!attr) return WLDAP32_LDAP_NO_MEMORY; - if (dn && !(dnU = strWtoU( dn ))) goto exit; + if (!(dnU = dn ? strWtoU( dn ) : strdup( "" ))) goto exit; if (!(attrU = strWtoU( attr ))) goto exit; if (!data) { @@ -161,9 +162,10 @@ ULONG CDECL ldap_compare_ext_sA( LDAP *ld, char *dn, char *attr, char *value, st data, serverctrls, clientctrls ); if (!ld) return WLDAP32_LDAP_PARAM_ERROR; + if (!attr) return LDAP_UNDEFINED_TYPE; if (dn && !(dnW = strAtoW( dn ))) goto exit; - if (attr && !(attrW = strAtoW( attr ))) goto exit; + if (!(attrW = strAtoW( attr ))) goto exit; if (value && !(valueW = strAtoW( value ))) goto exit; if (serverctrls && !(serverctrlsW = controlarrayAtoW( serverctrls ))) goto exit; if (clientctrls && !(clientctrlsW = controlarrayAtoW( clientctrls ))) goto exit; @@ -194,9 +196,10 @@ ULONG CDECL ldap_compare_ext_sW( LDAP *ld, WCHAR *dn, WCHAR *attr, WCHAR *value, serverctrls, clientctrls ); if (!ld) return WLDAP32_LDAP_PARAM_ERROR; + if (!attr) return LDAP_UNDEFINED_TYPE; - if (dn && !(dnU = strWtoU( dn ))) goto exit; - if (attr && !(attrU = strWtoU( attr ))) goto exit; + if (!(dnU = dn ? strWtoU( dn ) : strdup( "" ))) goto exit; + if (!(attrU = strWtoU( attr ))) goto exit; if (!data) { if (value) @@ -235,9 +238,10 @@ ULONG CDECL ldap_compare_sA( LDAP *ld, PCHAR dn, PCHAR attr, PCHAR value ) TRACE( "(%p, %s, %s, %s)\n", ld, debugstr_a(dn), debugstr_a(attr), debugstr_a(value) ); if (!ld) return WLDAP32_LDAP_PARAM_ERROR; + if (!attr) return WLDAP32_LDAP_UNDEFINED_TYPE; if (dn && !(dnW = strAtoW( dn ))) goto exit; - if (attr && !(attrW = strAtoW( attr ))) goto exit; + if (!(attrW = strAtoW( attr ))) goto exit; if (value && !(valueW = strAtoW( value ))) goto exit; ret = ldap_compare_sW( ld, dnW, attrW, valueW ); diff --git a/dlls/wldap32/tests/parse.c b/dlls/wldap32/tests/parse.c index 1653b0ef72c..34fcb9a4201 100644 --- a/dlls/wldap32/tests/parse.c +++ b/dlls/wldap32/tests/parse.c @@ -295,6 +295,78 @@ static void test_ldap_modify(void) ldap_unbind( ld ); } +static void test_ldap_compare(void) +{ + struct berval empty_value = { 0 }; + LDAP *ld; + ULONG ret, num; + + ld = ldap_initA( (char *)"
db.debian.org
", 389 ); + ok( ld != NULL, "ldap_init failed\n" ); + + ret = ldap_compareA( NULL, NULL, NULL, NULL ); + ok( ret == (ULONG)-1, "ldap_compareA should fail, got %#lx\n", ret ); + ret = ldap_compareA( NULL, (char *)"", (char *)"", (char *)"" ); + ok( ret == (ULONG)-1, "ldap_compareA should fail, got %#lx\n", ret ); + ret = ldap_compareA( ld, NULL, (char *)"", (char *)"" ); + ok( ret != (ULONG)-1, "ldap_compareA should succeed, got %#lx\n", ret ); + ret = ldap_compareA( ld, (char *)"", NULL, (char *)"" ); + ok( ret == (ULONG)-1, "ldap_compareA should fail, got %#lx\n", ret ); + ret = ldap_compareA( ld, (char *)"", (char *)"", NULL ); + ok( ret != (ULONG)-1, "ldap_compareA should succeed, got %#lx\n", ret ); + ret = ldap_compareA( ld, (char *)"", (char *)"", (char *)"" ); + ok( ret != (ULONG)-1, "ldap_compareA should succeed, got %#lx\n", ret ); + + ret = ldap_compare_sA( NULL, NULL, NULL, NULL ); + ok( ret == LDAP_PARAM_ERROR, "ldap_compare_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_sA( NULL, (char *)"", (char *)"", (char *)"" ); + ok( ret == LDAP_PARAM_ERROR, "ldap_compare_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_sA( ld, NULL, (char *)"", (char *)"" ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_sA( ld, (char *)"", NULL, (char *)"" ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_sA( ld, (char *)"", (char *)"", NULL ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_sA( ld, (char *)"", (char *)"", (char *)"" ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_sA should fail, got %#lx\n", ret ); + + ret = ldap_compare_extA( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ); + ok( ret == LDAP_PARAM_ERROR, "ldap_compare_extA should fail, got %#lx\n", ret ); + ret = ldap_compare_extA( NULL, (char *)"", (char *)"", (char *)"", &empty_value, NULL, NULL, &num ); + ok( ret == LDAP_PARAM_ERROR, "ldap_compare_extA should fail, got %#lx\n", ret ); + ret = ldap_compare_extA( ld, NULL, (char *)"", (char *)"", &empty_value, NULL, NULL, &num ); + ok( !ret, "ldap_compare_extA should succeed, got %#lx\n", ret ); + ret = ldap_compare_extA( ld, (char *)"", NULL, (char *)"", &empty_value, NULL, NULL, &num ); + ok( ret == LDAP_NO_MEMORY, "ldap_compare_extA should fail, got %#lx\n", ret ); + ret = ldap_compare_extA( ld, (char *)"", (char *)"", NULL, &empty_value, NULL, NULL, &num ); + ok( !ret, "ldap_compare_extA should succeed, got %#lx\n", ret ); + ret = ldap_compare_extA( ld, (char *)"", (char *)"", (char *)"", NULL, NULL, NULL, &num ); + ok( !ret, "ldap_compare_extA should succeed, got %#lx\n", ret ); + ret = ldap_compare_extA( ld, (char *)"", (char *)"", (char *)"", &empty_value, NULL, NULL, &num ); + ok( !ret, "ldap_compare_extA should succeed, got %#lx\n", ret ); + ret = ldap_compare_extA( ld, (char *)"", (char *)"", (char *)"", &empty_value, NULL, NULL, NULL ); + ok( ret == LDAP_PARAM_ERROR, "ldap_compare_extA should fail, got %#lx\n", ret ); + ret = ldap_compare_extA( ld, (char *)"", (char *)"", (char *)"", &empty_value, NULL, NULL, &num ); + ok( !ret, "ldap_compare_extA should succeed, got %#lx\n", ret ); + + ret = ldap_compare_ext_sA( NULL, NULL, NULL, NULL, NULL, NULL, NULL ); + ok( ret == LDAP_PARAM_ERROR, "ldap_compare_ext_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_ext_sA( NULL, (char *)"", (char *)"", (char *)"", &empty_value, NULL, NULL ); + ok( ret == LDAP_PARAM_ERROR, "ldap_compare_ext_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_ext_sA( ld, NULL, (char *)"", (char *)"", &empty_value, NULL, NULL ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_ext_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_ext_sA( ld, (char *)"", NULL, (char *)"", &empty_value, NULL, NULL ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_ext_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_ext_sA( ld, (char *)"", (char *)"", NULL, &empty_value, NULL, NULL ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_ext_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_ext_sA( ld, (char *)"", (char *)"", (char *)"", NULL, NULL, NULL ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_ext_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_ext_sA( ld, (char *)"", (char *)"", (char *)"", &empty_value, NULL, NULL ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_ext_sA should fail, got %#lx\n", ret ); + + ldap_unbind( ld ); +} + static void test_ldap_server_control( void ) { /* SEQUENCE { INTEGER :: 0x07 } */ @@ -419,6 +491,7 @@ START_TEST (parse) test_ldap_bind_sA(); test_ldap_add(); test_ldap_modify(); + test_ldap_compare(); ld = ldap_initA( (char *)"
db.debian.org
", 389 ); ok( ld != NULL, "ldap_init failed\n" );
1
0
0
0
Alex Henrie : wldap32: Annotate allocation functions with __WINE_(DEALLOC|MALLOC).
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: e1930443fa5a84c392e5f4dd38fd409e2222c431 URL:
https://gitlab.winehq.org/wine/wine/-/commit/e1930443fa5a84c392e5f4dd38fd40…
Author: Alex Henrie <alexhenrie24(a)gmail.com> Date: Tue Mar 21 18:42:04 2023 -0600 wldap32: Annotate allocation functions with __WINE_(DEALLOC|MALLOC). --- dlls/wldap32/winldap_private.h | 53 ++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/dlls/wldap32/winldap_private.h b/dlls/wldap32/winldap_private.h index 69dca519b0e..aeeffcfcc15 100644 --- a/dlls/wldap32/winldap_private.h +++ b/dlls/wldap32/winldap_private.h @@ -367,20 +367,26 @@ typedef struct ldapsearch #define MSG(entry) (entry->Request) #define BER(ber) ((BerElement *)((ber)->opaque)) -WLDAP32_BerElement * CDECL WLDAP32_ber_alloc_t( int ); -BERVAL * CDECL WLDAP32_ber_bvdup( BERVAL * ); void CDECL WLDAP32_ber_bvecfree( BERVAL ** ); void CDECL WLDAP32_ber_bvfree( BERVAL * ); +void CDECL WLDAP32_ber_free( WLDAP32_BerElement *, int ); +WLDAP32_BerElement * CDECL WLDAP32_ber_alloc_t( int ) __WINE_DEALLOC(WLDAP32_ber_free); +BERVAL * CDECL WLDAP32_ber_bvdup( BERVAL * ) __WINE_DEALLOC(WLDAP32_ber_bvfree); ULONG CDECL WLDAP32_ber_first_element( WLDAP32_BerElement *, ULONG *, char ** ); int CDECL WLDAP32_ber_flatten( WLDAP32_BerElement *, BERVAL ** ); -void CDECL WLDAP32_ber_free( WLDAP32_BerElement *, int ); -WLDAP32_BerElement * CDECL WLDAP32_ber_init( BERVAL * ); +WLDAP32_BerElement * CDECL WLDAP32_ber_init( BERVAL * ) __WINE_DEALLOC(WLDAP32_ber_free); ULONG CDECL WLDAP32_ber_next_element( WLDAP32_BerElement *, ULONG *, char * ); ULONG CDECL WLDAP32_ber_peek_tag( WLDAP32_BerElement *, ULONG * ); ULONG CDECL WLDAP32_ber_skip_tag( WLDAP32_BerElement *, ULONG * ); int WINAPIV WLDAP32_ber_printf( WLDAP32_BerElement *, char *, ... ); ULONG WINAPIV WLDAP32_ber_scanf( WLDAP32_BerElement *, char *, ... ); +void CDECL ldap_memfreeA( char * ); +void CDECL ldap_memfreeW( WCHAR * ); +ULONG CDECL ldap_value_freeA( char ** ); +ULONG CDECL ldap_value_freeW( WCHAR ** ); +ULONG CDECL WLDAP32_ldap_msgfree( WLDAP32_LDAPMessage * ); +ULONG CDECL WLDAP32_ldap_value_free_len(struct WLDAP32_berval **); ULONG CDECL ldap_addA( LDAP *, char *, LDAPModA ** ); ULONG CDECL ldap_addW( LDAP *, WCHAR *, LDAPModW ** ); ULONG CDECL ldap_add_extA( LDAP *, char *, LDAPModA **, LDAPControlA **, LDAPControlA **, ULONG * ); @@ -429,16 +435,12 @@ ULONG CDECL ldap_delete_ext_sA( LDAP *, char *, LDAPControlA **, LDAPControlA ** ULONG CDECL ldap_delete_ext_sW( LDAP *, WCHAR *, LDAPControlW **, LDAPControlW ** ); ULONG CDECL ldap_delete_sA( LDAP *, char * ); ULONG CDECL ldap_delete_sW( LDAP *, WCHAR * ); -char * CDECL ldap_dn2ufnA( char * ); -WCHAR * CDECL ldap_dn2ufnW( WCHAR * ); -void CDECL ldap_memfreeA( char * ); -void CDECL ldap_memfreeW( WCHAR * ); -char ** CDECL ldap_explode_dnA( char *, ULONG ); -WCHAR ** CDECL ldap_explode_dnW( WCHAR *, ULONG ); -ULONG CDECL ldap_value_freeA( char ** ); -ULONG CDECL ldap_value_freeW( WCHAR ** ); -char * CDECL ldap_get_dnA( LDAP *, WLDAP32_LDAPMessage * ); -WCHAR * CDECL ldap_get_dnW( LDAP *, WLDAP32_LDAPMessage * ); +char * CDECL ldap_dn2ufnA( char * ) __WINE_DEALLOC(ldap_memfreeA) __WINE_MALLOC; +WCHAR * CDECL ldap_dn2ufnW( WCHAR * ) __WINE_DEALLOC(ldap_memfreeW) __WINE_MALLOC; +char ** CDECL ldap_explode_dnA( char *, ULONG ) __WINE_DEALLOC(ldap_value_freeA); +WCHAR ** CDECL ldap_explode_dnW( WCHAR *, ULONG ) __WINE_DEALLOC(ldap_value_freeW); +char * CDECL ldap_get_dnA( LDAP *, WLDAP32_LDAPMessage * ) __WINE_DEALLOC(ldap_memfreeA) __WINE_MALLOC; +WCHAR * CDECL ldap_get_dnW( LDAP *, WLDAP32_LDAPMessage * ) __WINE_DEALLOC(ldap_memfreeW) __WINE_MALLOC; ULONG CDECL ldap_ufn2dnA( char *, char ** ); ULONG CDECL ldap_ufn2dnW( WCHAR *, WCHAR ** ); ULONG CDECL ldap_extended_operationA( LDAP *, char *, struct WLDAP32_berval *, LDAPControlA **, LDAPControlA **, @@ -461,11 +463,14 @@ ULONG CDECL ldap_start_tls_sA( LDAP *, ULONG *, WLDAP32_LDAPMessage **, LDAPCont ULONG CDECL ldap_start_tls_sW( LDAP *, ULONG *, WLDAP32_LDAPMessage **, LDAPControlW **, LDAPControlW ** ); ULONG CDECL ldap_check_filterA( LDAP *, char * ); ULONG CDECL ldap_check_filterW( LDAP *, WCHAR * ); -char * CDECL ldap_first_attributeA( LDAP *, WLDAP32_LDAPMessage *, WLDAP32_BerElement ** ); -WCHAR * CDECL ldap_first_attributeW( LDAP *, WLDAP32_LDAPMessage *, WLDAP32_BerElement ** ); -ULONG CDECL WLDAP32_ldap_msgfree( WLDAP32_LDAPMessage * ); -char * CDECL ldap_next_attributeA( LDAP *, WLDAP32_LDAPMessage *, WLDAP32_BerElement * ); -WCHAR * CDECL ldap_next_attributeW( LDAP *, WLDAP32_LDAPMessage *, WLDAP32_BerElement * ); +char * CDECL ldap_first_attributeA( LDAP *, WLDAP32_LDAPMessage *, + WLDAP32_BerElement ** ) __WINE_DEALLOC(ldap_memfreeA) __WINE_MALLOC; +WCHAR * CDECL ldap_first_attributeW( LDAP *, WLDAP32_LDAPMessage *, + WLDAP32_BerElement ** ) __WINE_DEALLOC(ldap_memfreeW) __WINE_MALLOC; +char * CDECL ldap_next_attributeA( LDAP *, WLDAP32_LDAPMessage *, + WLDAP32_BerElement * ) __WINE_DEALLOC(ldap_memfreeA) __WINE_MALLOC; +WCHAR * CDECL ldap_next_attributeW( LDAP *, WLDAP32_LDAPMessage *, + WLDAP32_BerElement * ) __WINE_DEALLOC(ldap_memfreeW) __WINE_MALLOC; ULONG CDECL WLDAP32_ldap_result( LDAP *, ULONG, ULONG, struct l_timeval *, WLDAP32_LDAPMessage ** ); ULONG CDECL ldap_modifyA( LDAP *, char *, LDAPModA ** ); ULONG CDECL ldap_modifyW( LDAP *, WCHAR *, LDAPModW ** ); @@ -528,10 +533,12 @@ ULONG CDECL ldap_search_stA( LDAP *, const PCHAR, ULONG, const PCHAR, char **, U WLDAP32_LDAPMessage ** ); ULONG CDECL ldap_search_stW( LDAP *, const PWCHAR, ULONG, const PWCHAR, WCHAR **, ULONG, struct l_timeval *, WLDAP32_LDAPMessage ** ); -char ** CDECL ldap_get_valuesA( LDAP *, WLDAP32_LDAPMessage *, char * ); -WCHAR ** CDECL ldap_get_valuesW( LDAP *, WLDAP32_LDAPMessage *, WCHAR * ); -struct WLDAP32_berval ** CDECL ldap_get_values_lenA( LDAP *, LDAPMessage *, char * ); -struct WLDAP32_berval ** CDECL ldap_get_values_lenW( LDAP *, LDAPMessage *, WCHAR * ); +char ** CDECL ldap_get_valuesA( LDAP *, WLDAP32_LDAPMessage *, char * ) __WINE_DEALLOC(ldap_value_freeA); +WCHAR ** CDECL ldap_get_valuesW( LDAP *, WLDAP32_LDAPMessage *, WCHAR * ) __WINE_DEALLOC(ldap_value_freeW); +struct WLDAP32_berval ** CDECL ldap_get_values_lenA( LDAP *, LDAPMessage *, + char * ) __WINE_DEALLOC(WLDAP32_ldap_value_free_len); +struct WLDAP32_berval ** CDECL ldap_get_values_lenW( LDAP *, LDAPMessage *, + WCHAR * ) __WINE_DEALLOC(WLDAP32_ldap_value_free_len); ULONG map_error( int ) DECLSPEC_HIDDEN;
1
0
0
0
Alex Henrie : include: Annotate ldap_(*_attribute|get_dn)* with __WINE_(DEALLOC|MALLOC).
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: 151211284125da527eefa6e053031ef6696ee9c4 URL:
https://gitlab.winehq.org/wine/wine/-/commit/151211284125da527eefa6e053031e…
Author: Alex Henrie <alexhenrie24(a)gmail.com> Date: Tue Mar 21 18:33:57 2023 -0600 include: Annotate ldap_(*_attribute|get_dn)* with __WINE_(DEALLOC|MALLOC). --- include/winldap.h | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/include/winldap.h b/include/winldap.h index 0b4037f133e..825d3f63b1e 100644 --- a/include/winldap.h +++ b/include/winldap.h @@ -499,16 +499,18 @@ ULONG CDECL ldap_extended_operationW(LDAP*,PWCHAR,struct berval*,PLDAPControlW*, ULONG CDECL ldap_extended_operation_sA(LDAP*,PCHAR,struct berval*,PLDAPControlA*,PLDAPControlA*,PCHAR*,struct berval**); ULONG CDECL ldap_extended_operation_sW(LDAP*,PWCHAR,struct berval*,PLDAPControlW*,PLDAPControlW*,PWCHAR*,struct berval**); #define ldap_extended_operation_s WINELIB_NAME_AW(ldap_extended_operation_s) -PCHAR CDECL ldap_first_attributeA(LDAP*,LDAPMessage*,BerElement**); -PWCHAR CDECL ldap_first_attributeW(LDAP*,LDAPMessage*,BerElement**); +char* CDECL ldap_first_attributeA(LDAP*,LDAPMessage*,BerElement**) + __WINE_DEALLOC(ldap_memfreeA) __WINE_MALLOC; +WCHAR* CDECL ldap_first_attributeW(LDAP*,LDAPMessage*,BerElement**) + __WINE_DEALLOC(ldap_memfreeW) __WINE_MALLOC; #define ldap_first_attribute WINELIB_NAME_AW(ldap_first_attribute) LDAPMessage* CDECL ldap_first_entry(LDAP*,LDAPMessage*); LDAPMessage* CDECL ldap_first_reference(LDAP*,LDAPMessage*); ULONG CDECL ldap_free_controlsA(LDAPControlA**); ULONG CDECL ldap_free_controlsW(LDAPControlW**); #define ldap_free_controls WINELIB_NAME_AW(ldap_free_controls) -PCHAR CDECL ldap_get_dnA(LDAP*,LDAPMessage*); -PWCHAR CDECL ldap_get_dnW(LDAP*,LDAPMessage*); +char* CDECL ldap_get_dnA(LDAP*,LDAPMessage*) __WINE_DEALLOC(ldap_memfreeA) __WINE_MALLOC; +WCHAR* CDECL ldap_get_dnW(LDAP*,LDAPMessage*) __WINE_DEALLOC(ldap_memfreeW) __WINE_MALLOC; #define ldap_get_dn WINELIB_NAME_AW(ldap_get_dn) ULONG CDECL ldap_get_next_page(PLDAP,PLDAPSearch,ULONG,ULONG*); ULONG CDECL ldap_get_next_page_s(PLDAP,PLDAPSearch,struct l_timeval*,ULONG,ULONG*,LDAPMessage**); @@ -552,8 +554,10 @@ ULONG CDECL ldap_modrdn_sA(LDAP*,PCHAR,PCHAR); ULONG CDECL ldap_modrdn_sW(LDAP*,PWCHAR,PWCHAR); #define ldap_modrdn_s WINELIB_NAME_AW(ldap_modrdn_s) ULONG CDECL ldap_msgfree(LDAPMessage*); -PCHAR CDECL ldap_next_attributeA(LDAP*,LDAPMessage*,BerElement*); -PWCHAR CDECL ldap_next_attributeW(LDAP*,LDAPMessage*,BerElement*); +char* CDECL ldap_next_attributeA(LDAP*,LDAPMessage*,BerElement*) + __WINE_DEALLOC(ldap_memfreeA) __WINE_MALLOC; +WCHAR* CDECL ldap_next_attributeW(LDAP*,LDAPMessage*,BerElement*) + __WINE_DEALLOC(ldap_memfreeW) __WINE_MALLOC; #define ldap_next_attribute WINELIB_NAME_AW(ldap_next_attribute) LDAPMessage * CDECL ldap_next_entry(LDAP*,LDAPMessage*); LDAP * CDECL ldap_openA(PCHAR,ULONG);
1
0
0
0
Brendan Shanks : winemac: Fix memory leak in UpdateDisplayDevices.
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: 644c54b1036dec4266e723319a362070f8e3ba8f URL:
https://gitlab.winehq.org/wine/wine/-/commit/644c54b1036dec4266e723319a3620…
Author: Brendan Shanks <bshanks(a)codeweavers.com> Date: Tue Mar 21 14:42:30 2023 -0700 winemac: Fix memory leak in UpdateDisplayDevices. --- dlls/winemac.drv/display.c | 1 + 1 file changed, 1 insertion(+) diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index 19ff72a7130..6a798994e47 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -1208,6 +1208,7 @@ BOOL macdrv_UpdateDisplayDevices( const struct gdi_device_manager *device_manage device_manager->add_mode( mode, param ); } + free(modes); macdrv_free_monitors(monitors); }
1
0
0
0
Alistair Leslie-Hughes : msado15: Store all data from provider.
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: 49f70597454310c0ee9374cd17960c93e1408ad3 URL:
https://gitlab.winehq.org/wine/wine/-/commit/49f70597454310c0ee9374cd17960c…
Author: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com> Date: Sun Mar 19 15:27:36 2023 +1100 msado15: Store all data from provider. --- dlls/msado15/recordset.c | 239 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 238 insertions(+), 1 deletion(-)
1
0
0
0
Alistair Leslie-Hughes : msado15: Bind fields in _Recordset Open.
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: 4ae5d2537be4f46da33abaddb01782affaf2f041 URL:
https://gitlab.winehq.org/wine/wine/-/commit/4ae5d2537be4f46da33abaddb01782…
Author: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com> Date: Wed Mar 3 12:23:23 2021 +1100 msado15: Bind fields in _Recordset Open. --- dlls/msado15/recordset.c | 137 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index 54625158ac9..c263afe55ab 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -24,6 +24,7 @@ #include "objbase.h" #include "msado15_backcompat.h" #include "oledb.h" +#include "sqlucode.h" #include "wine/debug.h" @@ -49,6 +50,8 @@ struct recordset IRowset *row_set; EditModeEnum editmode; VARIANT filter; + + DBTYPE *columntypes; }; struct fields @@ -1210,12 +1213,15 @@ static void close_recordset( struct recordset *recordset ) if (!recordset->fields) return; col_count = get_column_count( recordset ); + free(recordset->columntypes); + for (i = 0; i < col_count; i++) { struct field *field = impl_from_Field( recordset->fields->field[i] ); field->recordset = NULL; Field_Release(&field->Field_iface); } + recordset->fields->count = 0; Fields_Release( &recordset->fields->Fields_iface ); recordset->fields = NULL; @@ -1672,6 +1678,111 @@ static HRESULT create_command_text(IUnknown *session, BSTR command, ICommandText return S_OK; } +#define ROUND_SIZE(size) (((size) + sizeof(void *) - 1) & ~(sizeof(void *) - 1)) + +DEFINE_GUID(DBPROPSET_ROWSET, 0xc8b522be, 0x5cf3, 0x11ce, 0xad, 0xe5, 0x00, 0xaa, 0x00, 0x44, 0x77, 0x3d); + +static HRESULT create_bindings(IUnknown *rowset, struct recordset *recordset, DBBINDING **bind, DBBYTEOFFSET *size) +{ + HRESULT hr; + IColumnsInfo *columninfo; + DBORDINAL columns; + DBCOLUMNINFO *colinfo; + OLECHAR *stringsbuffer; + DBBINDING *bindings; + DBBYTEOFFSET offset; + + *size = 0; + + hr = IUnknown_QueryInterface(rowset, &IID_IColumnsInfo, (void**)&columninfo); + if (FAILED(hr)) + return hr; + + hr = IColumnsInfo_GetColumnInfo(columninfo, &columns, &colinfo, &stringsbuffer); + if (SUCCEEDED(hr)) + { + ULONG i; + DBOBJECT *dbobj; + offset = 1; + + recordset->columntypes = malloc(sizeof(DBTYPE) * columns); + + /* Do one allocation for the bindings and append the DBOBJECTS to the end. + * This is to save on multiple allocations vs a little bit of extra memory. + */ + bindings = CoTaskMemAlloc( (sizeof(DBBINDING) + sizeof(DBOBJECT)) * columns); + dbobj = (DBOBJECT *)((char*)bindings + (sizeof(DBBINDING) * columns)); + + for (i=0; i < columns; i++) + { + TRACE("Column %lu, pwszName: %s, pTypeInfo %p, iOrdinal %Iu, dwFlags 0x%08lx, " + "ulColumnSize %Iu, wType %d, bPrecision %d, bScale %d\n", + i, debugstr_w(colinfo[i].pwszName), colinfo[i].pTypeInfo, colinfo[i].iOrdinal, + colinfo[i].dwFlags, colinfo[i].ulColumnSize, colinfo[i].wType, + colinfo[i].bPrecision, colinfo[i].bScale); + + hr = append_field(recordset->fields, colinfo[i].pwszName, colinfo[i].wType, colinfo[i].ulColumnSize, + colinfo[i].dwFlags, NULL); + + bindings[i].iOrdinal = colinfo[i].iOrdinal; + bindings[i].obValue = offset; + bindings[i].pTypeInfo = NULL; + /* Always assigned the pObject even if it's not used. */ + bindings[i].pObject = &dbobj[i]; + bindings[i].pObject->dwFlags = 0; + bindings[i].pObject->iid = IID_ISequentialStream; + bindings[i].pBindExt = NULL; + bindings[i].dwPart = DBPART_VALUE | DBPART_LENGTH | DBPART_STATUS; + bindings[i].dwMemOwner = DBMEMOWNER_CLIENTOWNED; + bindings[i].eParamIO = 0; + + recordset->columntypes[i] = colinfo[i].wType; + if (colinfo[i].dwFlags & DBCOLUMNFLAGS_ISLONG) + { + colinfo[i].wType = DBTYPE_IUNKNOWN; + + bindings[i].cbMaxLen = (colinfo[i].ulColumnSize + 1) * sizeof(WCHAR); + offset += sizeof(ISequentialStream*); + } + else if(colinfo[i].wType == DBTYPE_WSTR) + { + /* ulColumnSize is the number of characters in the string not the actual buffer size */ + bindings[i].cbMaxLen = colinfo[i].ulColumnSize * sizeof(WCHAR); + offset += bindings[i].cbMaxLen; + } + else + { + bindings[i].cbMaxLen = colinfo[i].ulColumnSize; + offset += bindings[i].cbMaxLen; + } + + bindings[i].dwFlags = 0; + bindings[i].wType = colinfo[i].wType; + bindings[i].bPrecision = colinfo[i].bPrecision; + bindings[i].bScale = colinfo[i].bScale; + } + + offset = ROUND_SIZE(offset); + for (i=0; i < columns; i++) + { + bindings[i].obLength = offset; + bindings[i].obStatus = offset + sizeof(DBBYTEOFFSET); + + offset += sizeof(DBBYTEOFFSET) + sizeof(DBBYTEOFFSET); + } + + *size = offset; + *bind = bindings; + + CoTaskMemFree(colinfo); + CoTaskMemFree(stringsbuffer); + } + + IColumnsInfo_Release(columninfo); + + return hr; +} + static HRESULT WINAPI recordset_Open( _Recordset *iface, VARIANT source, VARIANT active_connection, CursorTypeEnum cursor_type, LockTypeEnum lock_type, LONG options ) { @@ -1682,6 +1793,8 @@ static HRESULT WINAPI recordset_Open( _Recordset *iface, VARIANT source, VARIANT DBROWCOUNT affected; IUnknown *rowset; HRESULT hr; + DBBINDING *bindings; + DBBYTEOFFSET datasize; FIXME( "%p, %s, %s, %d, %d, %ld Semi-stub\n", recordset, debugstr_variant(&source), debugstr_variant(&active_connection), cursor_type, lock_type, options ); @@ -1726,6 +1839,29 @@ static HRESULT WINAPI recordset_Open( _Recordset *iface, VARIANT source, VARIANT if (FAILED(hr) || !rowset) return hr; + /* We want to create the field member variable without mapping the rowset fields, this will + * save quering the fields twice. Fields will be added while we create the bindings + */ + hr = fields_create( recordset, &recordset->fields ); + if (FAILED(hr)) + { + IUnknown_Release(rowset); + return hr; + } + + hr = create_bindings(rowset, recordset, &bindings, &datasize); + if (FAILED(hr)) + { + WARN("Failed to load bindings (%lx)\n", hr); + IUnknown_Release(rowset); + return hr; + } + + recordset->count = affected; + recordset->index = affected ? 0 : -1; + + CoTaskMemFree(bindings); + ADORecordsetConstruction_put_Rowset(&recordset->ADORecordsetConstruction_iface, rowset); recordset->cursor_type = cursor_type; recordset->state = adStateOpen; @@ -2339,6 +2475,7 @@ HRESULT Recordset_create( void **obj ) recordset->row_set = NULL; recordset->editmode = adEditNone; VariantInit( &recordset->filter ); + recordset->columntypes = NULL; *obj = &recordset->Recordset_iface; TRACE( "returning iface %p\n", *obj );
1
0
0
0
Nikolay Sivov : d3dcompiler: Fix bytecode buffer leaks in D3DCompile2().
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: 699b52dc46c44f08873d6952b6cebdf9534c1802 URL:
https://gitlab.winehq.org/wine/wine/-/commit/699b52dc46c44f08873d6952b6cebd…
Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Tue Mar 21 20:00:29 2023 +0100 d3dcompiler: Fix bytecode buffer leaks in D3DCompile2(). --- dlls/d3dcompiler_43/compiler.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/dlls/d3dcompiler_43/compiler.c b/dlls/d3dcompiler_43/compiler.c index 3f302f23503..a7926785184 100644 --- a/dlls/d3dcompiler_43/compiler.c +++ b/dlls/d3dcompiler_43/compiler.c @@ -556,17 +556,21 @@ HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filen vkd3d_shader_free_messages(messages); } - if (!ret && shader_blob) + if (ret) + return hresult_from_vkd3d_result(ret); + + if (!shader_blob) { - if (FAILED(hr = D3DCreateBlob(byte_code.size, shader_blob))) - { - vkd3d_shader_free_shader_code(&byte_code); - return hr; - } - memcpy(ID3D10Blob_GetBufferPointer(*shader_blob), byte_code.code, byte_code.size); + vkd3d_shader_free_shader_code(&byte_code); + return S_OK; } - return hresult_from_vkd3d_result(ret); + if (SUCCEEDED(hr = D3DCreateBlob(byte_code.size, shader_blob))) + memcpy(ID3D10Blob_GetBufferPointer(*shader_blob), byte_code.code, byte_code.size); + + vkd3d_shader_free_shader_code(&byte_code); + + return hr; } HRESULT WINAPI D3DCompile(const void *data, SIZE_T data_size, const char *filename,
1
0
0
0
Nikolay Sivov : d3dcompiler: Always free messages string in D3DCompile2().
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: 929615fa13f7138b937602b68bbdda1f276a7d1d URL:
https://gitlab.winehq.org/wine/wine/-/commit/929615fa13f7138b937602b68bbdda…
Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Tue Mar 21 19:45:06 2023 +0100 d3dcompiler: Always free messages string in D3DCompile2(). --- dlls/d3dcompiler_43/compiler.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/d3dcompiler_43/compiler.c b/dlls/d3dcompiler_43/compiler.c index a3c7b22581f..3f302f23503 100644 --- a/dlls/d3dcompiler_43/compiler.c +++ b/dlls/d3dcompiler_43/compiler.c @@ -552,8 +552,8 @@ HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filen } memcpy(ID3D10Blob_GetBufferPointer(*messages_blob), messages, size); } - else - vkd3d_shader_free_messages(messages); + + vkd3d_shader_free_messages(messages); } if (!ret && shader_blob)
1
0
0
0
Nikolay Sivov : d3dcompiler: Allow D3DCompile2() to succeed with null output shader blob pointer.
by Alexandre Julliard
22 Mar '23
22 Mar '23
Module: wine Branch: master Commit: 5231c8c8bba49c5074b5876e44ef198d53c7845c URL:
https://gitlab.winehq.org/wine/wine/-/commit/5231c8c8bba49c5074b5876e44ef19…
Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Sat Mar 18 18:51:19 2023 +0100 d3dcompiler: Allow D3DCompile2() to succeed with null output shader blob pointer. --- dlls/d3dcompiler_43/compiler.c | 2 +- dlls/d3dcompiler_43/tests/hlsl_d3d9.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/dlls/d3dcompiler_43/compiler.c b/dlls/d3dcompiler_43/compiler.c index d3c7b81df12..a3c7b22581f 100644 --- a/dlls/d3dcompiler_43/compiler.c +++ b/dlls/d3dcompiler_43/compiler.c @@ -556,7 +556,7 @@ HRESULT WINAPI D3DCompile2(const void *data, SIZE_T data_size, const char *filen vkd3d_shader_free_messages(messages); } - if (!ret) + if (!ret && shader_blob) { if (FAILED(hr = D3DCreateBlob(byte_code.size, shader_blob))) { diff --git a/dlls/d3dcompiler_43/tests/hlsl_d3d9.c b/dlls/d3dcompiler_43/tests/hlsl_d3d9.c index 15af598c90d..b52b840f3bf 100644 --- a/dlls/d3dcompiler_43/tests/hlsl_d3d9.c +++ b/dlls/d3dcompiler_43/tests/hlsl_d3d9.c @@ -1742,6 +1742,22 @@ static void test_include(void) delete_directory(L"include"); } +static void test_no_output_blob(void) +{ + static const char vs_source[] = + "float4 main(float4 pos : POSITION, inout float2 texcoord : TEXCOORD0) : POSITION\n" + "{\n" + " return pos;\n" + "}"; + ID3D10Blob *errors; + HRESULT hr; + + errors = (void *)0xdeadbeef; + hr = D3DCompile(vs_source, strlen(vs_source), NULL, NULL, NULL, "main", "vs_2_0", 0, 0, NULL, &errors); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!errors, "Unexpected errors blob.\n"); +} + START_TEST(hlsl_d3d9) { HMODULE mod; @@ -1770,4 +1786,5 @@ START_TEST(hlsl_d3d9) test_constant_table(); test_fail(); test_include(); + test_no_output_blob(); }
1
0
0
0
← Newer
1
...
39
40
41
42
43
44
45
...
91
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
Results per page:
10
25
50
100
200