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
April 2022
----- 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
2 participants
1024 discussions
Start a n
N
ew thread
Nikolay Sivov : dwrite: Remove already defined macros.
by Alexandre Julliard
25 Apr '22
25 Apr '22
Module: wine Branch: master Commit: fd56f8e31c633c34c3c9c5c1433bba2fd0815f6a URL:
https://source.winehq.org/git/wine.git/?a=commit;h=fd56f8e31c633c34c3c9c5c1…
Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Mon Apr 25 13:31:43 2022 +0300 dwrite: Remove already defined macros. Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/dwrite/font.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 93adb65ec76..c663ed77b96 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -415,11 +415,6 @@ struct dwrite_colorglyphenum struct dwrite_fonttable colr; /* used to access layers */ }; -#define GLYPH_BLOCK_SHIFT 8 -#define GLYPH_BLOCK_SIZE (1UL << GLYPH_BLOCK_SHIFT) -#define GLYPH_BLOCK_MASK (GLYPH_BLOCK_SIZE - 1) -#define GLYPH_MAX 65536 - struct dwrite_fontfile { IDWriteFontFile IDWriteFontFile_iface;
1
0
0
0
Nikolay Sivov : dwrite/tests: Use table access helpers for CBLC tests.
by Alexandre Julliard
25 Apr '22
25 Apr '22
Module: wine Branch: master Commit: 58ea0d81e532a35eb14a7c67dcec65172666ffd4 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=58ea0d81e532a35eb14a7c67…
Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Mon Apr 25 13:31:42 2022 +0300 dwrite/tests: Use table access helpers for CBLC tests. Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/dwrite/tests/font.c | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c index af88c716ad8..3d4c4caad98 100644 --- a/dlls/dwrite/tests/font.c +++ b/dlls/dwrite/tests/font.c @@ -321,11 +321,12 @@ typedef struct { BYTE data[1]; } sbix_glyph_data; -typedef struct { +struct cblc_header +{ WORD majorVersion; WORD minorVersion; DWORD numSizes; -} CBLCHeader; +}; typedef struct { BYTE res[12]; @@ -3526,6 +3527,14 @@ struct dwrite_fonttable UINT32 size; }; +static const void *table_read_ensure(const struct dwrite_fonttable *table, unsigned int offset, unsigned int size) +{ + if (size > table->size || offset > table->size - size) + return NULL; + + return table->data + offset; +} + static WORD table_read_be_word(const struct dwrite_fonttable *table, void *ptr, DWORD offset) { if (!ptr) @@ -9303,34 +9312,40 @@ static DWORD get_sbix_formats(IDWriteFontFace4 *fontface) static DWORD get_cblc_formats(IDWriteFontFace4 *fontface) { - CBLCBitmapSizeTable *sizes; - UINT32 num_sizes, size, s; + const CBLCBitmapSizeTable *sizes; + struct dwrite_fonttable cblc; + unsigned int i, num_sizes; BOOL exists = FALSE; - CBLCHeader *header; DWORD ret = 0; - void *context; HRESULT hr; - hr = IDWriteFontFace4_TryGetFontTable(fontface, MS_CBLC_TAG, (const void **)&header, &size, &context, &exists); - ok(hr == S_OK, "TryGetFontTable() failed, %#lx\n", hr); - ok(exists, "Expected CBLC table\n"); + hr = IDWriteFontFace4_TryGetFontTable(fontface, MS_CBLC_TAG, (const void **)&cblc.data, &cblc.size, &cblc.context, &exists); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(exists, "Expected CBLC table.\n"); if (!exists) return 0; - num_sizes = GET_BE_DWORD(header->numSizes); - sizes = (CBLCBitmapSizeTable *)(header + 1); - - for (s = 0; s < num_sizes; s++) { - BYTE bpp = sizes[s].bitDepth; + num_sizes = table_read_be_dword(&cblc, NULL, FIELD_OFFSET(struct cblc_header, numSizes)); + if (!(sizes = table_read_ensure(&cblc, sizeof(struct cblc_header), num_sizes * sizeof(*sizes)))) + { + skip("Malformed CBLC table.\n"); + num_sizes = 0; + } + for (i = 0; i < num_sizes; ++i) + { + BYTE bpp = sizes[i].bitDepth; if (bpp == 1 || bpp == 2 || bpp == 4 || bpp == 8) ret |= DWRITE_GLYPH_IMAGE_FORMATS_PNG; else if (bpp == 32) ret |= DWRITE_GLYPH_IMAGE_FORMATS_PREMULTIPLIED_B8G8R8A8; + + if (ret == (DWRITE_GLYPH_IMAGE_FORMATS_PNG | DWRITE_GLYPH_IMAGE_FORMATS_PREMULTIPLIED_B8G8R8A8)) + break; } - IDWriteFontFace4_ReleaseFontTable(fontface, context); + IDWriteFontFace4_ReleaseFontTable(fontface, cblc.context); return ret; }
1
0
0
0
Nikolay Sivov : dwrite/tests: Add a test for unset axis for references created with IDWriteFactory3.
by Alexandre Julliard
25 Apr '22
25 Apr '22
Module: wine Branch: master Commit: 76a4039e270fae98991d782babf15b0cc9644999 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=76a4039e270fae98991d782b…
Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Mon Apr 25 13:31:41 2022 +0300 dwrite/tests: Add a test for unset axis for references created with IDWriteFactory3. Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/dwrite/tests/font.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c index 38eb1aeeb7d..af88c716ad8 100644 --- a/dlls/dwrite/tests/font.c +++ b/dlls/dwrite/tests/font.c @@ -7982,9 +7982,10 @@ static void test_CreateFontFaceReference(void) IDWriteFontFace3 *fontface, *fontface1; DWRITE_FONT_AXIS_VALUE axis_values[16]; IDWriteFontCollection1 *collection; + UINT32 axis_count, index, count, i; + IDWriteFontFaceReference1 *ref2; IDWriteFontFile *file, *file1; IDWriteFactory3 *factory; - UINT32 index, count, i; IDWriteFont3 *font3; ULONG refcount; WCHAR *path; @@ -8091,6 +8092,13 @@ static void test_CreateFontFaceReference(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(file != file1, "got %p, previous file %p\n", file1, file); + if (SUCCEEDED(IDWriteFontFaceReference_QueryInterface(ref, &IID_IDWriteFontFaceReference1, (void **)&ref2))) + { + axis_count = IDWriteFontFaceReference1_GetFontAxisValueCount(ref2); + ok(!axis_count, "Unexpected axis value count.\n"); + IDWriteFontFaceReference1_Release(ref2); + } + IDWriteFontFaceReference_Release(ref); IDWriteFontFile_Release(file); IDWriteFontFile_Release(file1); @@ -8112,8 +8120,6 @@ static void test_CreateFontFaceReference(void) for (j = 0; j < font_count; j++) { - IDWriteFontFaceReference1 *ref2; - hr = IDWriteFontFamily1_GetFont(family, j, &font3); ok(hr == S_OK, "Failed to get font, hr %#lx.\n", hr); @@ -8132,7 +8138,7 @@ static void test_CreateFontFaceReference(void) if (SUCCEEDED(hr = IDWriteFontFaceReference_QueryInterface(ref, &IID_IDWriteFontFaceReference1, (void **)&ref2))) { - UINT32 axis_count = IDWriteFontFaceReference1_GetFontAxisValueCount(ref2); + axis_count = IDWriteFontFaceReference1_GetFontAxisValueCount(ref2); todo_wine ok(axis_count >= 4, "Unexpected axis value count.\n");
1
0
0
0
Alexandre Julliard : server: Return the full token group for TokenLogonSid.
by Alexandre Julliard
25 Apr '22
25 Apr '22
Module: wine Branch: master Commit: dd99319cdebe783c9c3def3a39c8b6ab73689c5f URL:
https://source.winehq.org/git/wine.git/?a=commit;h=dd99319cdebe783c9c3def3a…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Mon Apr 25 13:23:28 2022 +0200 server: Return the full token group for TokenLogonSid. Based on a patch by Fabian Maurer. Wine-Bug:
https://bugs.winehq.org/show_bug.cgi?id=52845
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/advapi32/tests/security.c | 3 +++ dlls/ntdll/unix/security.c | 24 ++---------------------- include/wine/server_protocol.h | 4 +++- server/protocol.def | 1 + server/request.h | 3 ++- server/token.c | 8 +++----- server/trace.c | 1 + 7 files changed, 15 insertions(+), 29 deletions(-) diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c index 135a45f7727..ed91ccc39d3 100644 --- a/dlls/advapi32/tests/security.c +++ b/dlls/advapi32/tests/security.c @@ -1898,6 +1898,9 @@ static void test_token_attr(void) /* S-1-5-5-0-XXXXXX */ ret = IsWellKnownSid(Groups->Groups[0].Sid, WinLogonIdsSid); ok(ret, "Unknown SID\n"); + + ok(Groups->Groups[0].Attributes == (SE_GROUP_MANDATORY | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_ENABLED | SE_GROUP_LOGON_ID), + "got %lx\n", Groups->Groups[0].Attributes); } } diff --git a/dlls/ntdll/unix/security.c b/dlls/ntdll/unix/security.c index 2955355353e..7b401c8bd70 100644 --- a/dlls/ntdll/unix/security.c +++ b/dlls/ntdll/unix/security.c @@ -230,6 +230,7 @@ NTSTATUS WINAPI NtQueryInformationToken( HANDLE token, TOKEN_INFORMATION_CLASS c break; case TokenGroups: + case TokenLogonSid: { /* reply buffer is always shorter than output one */ void *buffer = malloc( length ); @@ -239,6 +240,7 @@ NTSTATUS WINAPI NtQueryInformationToken( HANDLE token, TOKEN_INFORMATION_CLASS c SERVER_START_REQ( get_token_groups ) { req->handle = wine_server_obj_handle( token ); + req->attr_mask = (class == TokenLogonSid) ? SE_GROUP_LOGON_ID : 0; wine_server_set_reply( req, buffer, length ); status = wine_server_call( req ); @@ -464,28 +466,6 @@ NTSTATUS WINAPI NtQueryInformationToken( HANDLE token, TOKEN_INFORMATION_CLASS c break; } - case TokenLogonSid: - SERVER_START_REQ( get_token_sid ) - { - TOKEN_GROUPS * groups = info; - PSID sid = groups + 1; - DWORD sid_len = length < sizeof(TOKEN_GROUPS) ? 0 : length - sizeof(TOKEN_GROUPS); - - req->handle = wine_server_obj_handle( token ); - req->which_sid = class; - wine_server_set_reply( req, sid, sid_len ); - status = wine_server_call( req ); - if (retlen) *retlen = reply->sid_len + sizeof(TOKEN_GROUPS); - if (status == STATUS_SUCCESS) - { - groups->GroupCount = 1; - groups->Groups[0].Sid = sid; - groups->Groups[0].Attributes = 0; - } - } - SERVER_END_REQ; - break; - case TokenLinkedToken: SERVER_START_REQ( create_linked_token ) { diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 8f883b2d97e..868add58abf 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -4479,6 +4479,8 @@ struct get_token_groups_request { struct request_header __header; obj_handle_t handle; + unsigned int attr_mask; + char __pad_20[4]; }; struct get_token_groups_reply { @@ -6286,7 +6288,7 @@ union generic_reply /* ### protocol_version begin ### */ -#define SERVER_PROTOCOL_VERSION 750 +#define SERVER_PROTOCOL_VERSION 751 /* ### protocol_version end ### */ diff --git a/server/protocol.def b/server/protocol.def index 9b7b99ae86a..2be1658fca2 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -3176,6 +3176,7 @@ enum caret_state @REQ(get_token_groups) obj_handle_t handle; /* handle to the token */ + unsigned int attr_mask; /* mask for wanted attributes */ @REPLY data_size_t attr_len; /* length needed to store attrs */ data_size_t sid_len; /* length needed to store sids */ diff --git a/server/request.h b/server/request.h index 9ed2f898e6d..7fd63905e0e 100644 --- a/server/request.h +++ b/server/request.h @@ -1964,7 +1964,8 @@ C_ASSERT( sizeof(struct get_token_sid_request) == 24 ); C_ASSERT( FIELD_OFFSET(struct get_token_sid_reply, sid_len) == 8 ); C_ASSERT( sizeof(struct get_token_sid_reply) == 16 ); C_ASSERT( FIELD_OFFSET(struct get_token_groups_request, handle) == 12 ); -C_ASSERT( sizeof(struct get_token_groups_request) == 16 ); +C_ASSERT( FIELD_OFFSET(struct get_token_groups_request, attr_mask) == 16 ); +C_ASSERT( sizeof(struct get_token_groups_request) == 24 ); C_ASSERT( FIELD_OFFSET(struct get_token_groups_reply, attr_len) == 8 ); C_ASSERT( FIELD_OFFSET(struct get_token_groups_reply, sid_len) == 12 ); C_ASSERT( sizeof(struct get_token_groups_reply) == 16 ); diff --git a/server/token.c b/server/token.c index 4aca1ea133a..f817c1114f8 100644 --- a/server/token.c +++ b/server/token.c @@ -82,7 +82,6 @@ static const struct sid local_sid = { SID_REVISION, 1, SECURITY_LOCAL_SID_AUTHOR static const struct sid interactive_sid = { SID_REVISION, 1, SECURITY_NT_AUTHORITY, { SECURITY_INTERACTIVE_RID } }; static const struct sid anonymous_logon_sid = { SID_REVISION, 1, SECURITY_NT_AUTHORITY, { SECURITY_ANONYMOUS_LOGON_RID } }; static const struct sid authenticated_user_sid = { SID_REVISION, 1, SECURITY_NT_AUTHORITY, { SECURITY_AUTHENTICATED_USER_RID } }; -static const struct sid builtin_logon_sid = { SID_REVISION, 3, SECURITY_NT_AUTHORITY, { SECURITY_LOGON_IDS_RID, 0, 0 } }; static struct luid prev_luid_value = { 1000, 0 }; @@ -731,7 +730,7 @@ struct token *token_create_admin( unsigned primary, int impersonation_level, int struct sid alias_admins_sid = { SID_REVISION, 2, SECURITY_NT_AUTHORITY, { SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS }}; struct sid alias_users_sid = { SID_REVISION, 2, SECURITY_NT_AUTHORITY, { SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_USERS }}; /* on Windows, this value changes every time the user logs on */ - struct sid logon_sid = { SID_REVISION, 3, SECURITY_NT_AUTHORITY, { SECURITY_LOGON_IDS_RID, 0, 1 /* FIXME: should be randomly generated when tokens are inherited by new processes */ }}; + struct sid logon_sid = { SID_REVISION, 3, SECURITY_NT_AUTHORITY, { SECURITY_LOGON_IDS_RID, 0, 0 /* FIXME: should be randomly generated when tokens are inherited by new processes */ }}; const struct sid *user_sid = security_unix_uid_to_sid( getuid() ); struct acl *default_dacl = create_default_dacl( user_sid ); const struct luid_attr admin_privs[] = @@ -1354,9 +1353,6 @@ DECL_HANDLER(get_token_sid) case TokenOwner: sid = token->owner; break; - case TokenLogonSid: - sid = &builtin_logon_sid; - break; default: set_error( STATUS_INVALID_PARAMETER ); break; @@ -1384,6 +1380,7 @@ DECL_HANDLER(get_token_groups) LIST_FOR_EACH_ENTRY( group, &token->groups, const struct group, entry ) { + if (req->attr_mask && !(group->attrs & req->attr_mask)) continue; group_count++; reply->sid_len += sid_len( &group->sid ); } @@ -1398,6 +1395,7 @@ DECL_HANDLER(get_token_groups) { LIST_FOR_EACH_ENTRY( group, &token->groups, const struct group, entry ) { + if (req->attr_mask && !(group->attrs & req->attr_mask)) continue; sid = copy_sid( sid, &group->sid ); *attr_ptr++ = group->attrs; } diff --git a/server/trace.c b/server/trace.c index d71561e1247..15ca4e7d71e 100644 --- a/server/trace.c +++ b/server/trace.c @@ -3864,6 +3864,7 @@ static void dump_get_token_sid_reply( const struct get_token_sid_reply *req ) static void dump_get_token_groups_request( const struct get_token_groups_request *req ) { fprintf( stderr, " handle=%04x", req->handle ); + fprintf( stderr, ", attr_mask=%08x", req->attr_mask ); } static void dump_get_token_groups_reply( const struct get_token_groups_reply *req )
1
0
0
0
Alexandre Julliard : server: Store the full group attributes.
by Alexandre Julliard
25 Apr '22
25 Apr '22
Module: wine Branch: master Commit: 1a0f082682ceeb099086711f43a668bf9adac029 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=1a0f082682ceeb099086711f…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Mon Apr 25 12:53:19 2022 +0200 server: Store the full group attributes. Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- server/token.c | 41 ++++++++++------------------------------- 1 file changed, 10 insertions(+), 31 deletions(-) diff --git a/server/token.c b/server/token.c index dcb2a879ba6..4aca1ea133a 100644 --- a/server/token.c +++ b/server/token.c @@ -128,15 +128,9 @@ struct privilege struct group { - struct list entry; - unsigned enabled : 1; /* is the sid currently enabled? */ - unsigned def : 1; /* is the sid enabled by default? */ - unsigned logon : 1; /* is this a logon sid? */ - unsigned mandatory: 1; /* is this sid always enabled? */ - unsigned owner : 1; /* can this sid be an owner of an object? */ - unsigned resource : 1; /* is this a domain-local group? */ - unsigned deny_only: 1; /* is this a sid that should be use for denying only? */ - struct sid sid; + struct list entry; + unsigned int attrs; + struct sid sid; }; static void token_dump( struct object *obj, int verbose ); @@ -523,17 +517,11 @@ static struct token *create_token( unsigned int primary, unsigned int session_id release_object( token ); return NULL; } + group->attrs = groups[i].attrs; copy_sid( &group->sid, groups[i].sid ); - group->enabled = TRUE; - group->def = TRUE; - group->logon = (groups[i].attrs & SE_GROUP_LOGON_ID) != 0; - group->mandatory = (groups[i].attrs & SE_GROUP_MANDATORY) != 0; - group->owner = (groups[i].attrs & SE_GROUP_OWNER) != 0; - group->resource = FALSE; - group->deny_only = FALSE; list_add_tail( &token->groups, &group->entry ); /* Use first owner capable group as owner and primary group */ - if (!token->primary_group && group->owner) + if (!token->primary_group && (group->attrs & SE_GROUP_OWNER)) { token->owner = &group->sid; token->primary_group = &group->sid; @@ -628,9 +616,8 @@ struct token *token_duplicate( struct token *src_token, unsigned primary, memcpy( newgroup, group, size ); if (filter_group( group, remove_groups, remove_group_count )) { - newgroup->enabled = 0; - newgroup->def = 0; - newgroup->deny_only = 1; + newgroup->attrs &= ~(SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT); + newgroup->attrs |= SE_GROUP_USE_FOR_DENY_ONLY; } list_add_tail( &token->groups, &newgroup->entry ); if (src_token->primary_group == &group->sid) @@ -888,8 +875,8 @@ int token_sid_present( struct token *token, const struct sid *sid, int deny ) LIST_FOR_EACH_ENTRY( group, &token->groups, struct group, entry ) { - if (!group->enabled) continue; - if (group->deny_only && !deny) continue; + if (!(group->attrs & SE_GROUP_ENABLED)) continue; + if (!deny && (group->attrs & SE_GROUP_USE_FOR_DENY_ONLY)) continue; if (equal_sid( &group->sid, sid )) return TRUE; } @@ -1411,16 +1398,8 @@ DECL_HANDLER(get_token_groups) { LIST_FOR_EACH_ENTRY( group, &token->groups, const struct group, entry ) { - *attr_ptr = 0; - if (group->mandatory) *attr_ptr |= SE_GROUP_MANDATORY; - if (group->def) *attr_ptr |= SE_GROUP_ENABLED_BY_DEFAULT; - if (group->enabled) *attr_ptr |= SE_GROUP_ENABLED; - if (group->owner) *attr_ptr |= SE_GROUP_OWNER; - if (group->deny_only) *attr_ptr |= SE_GROUP_USE_FOR_DENY_ONLY; - if (group->resource) *attr_ptr |= SE_GROUP_RESOURCE; - if (group->logon) *attr_ptr |= SE_GROUP_LOGON_ID; sid = copy_sid( sid, &group->sid ); - attr_ptr++; + *attr_ptr++ = group->attrs; } } }
1
0
0
0
Paul Gofman : winex11.drv: Treat invalid icon as no icon in fetch_icon_data().
by Alexandre Julliard
25 Apr '22
25 Apr '22
Module: wine Branch: master Commit: 3eb944c0a7a1b4857cb0b74d04a8450b636c98de URL:
https://source.winehq.org/git/wine.git/?a=commit;h=3eb944c0a7a1b4857cb0b74d…
Author: Paul Gofman <pgofman(a)codeweavers.com> Date: Fri Apr 22 18:53:56 2022 +0300 winex11.drv: Treat invalid icon as no icon in fetch_icon_data(). Signed-off-by: Paul Gofman <pgofman(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winex11.drv/window.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 48500284b68..4cf771a998f 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -598,6 +598,11 @@ failed: } +static HICON get_icon_info( HICON icon, ICONINFO *ii ) +{ + return icon && NtUserGetIconInfo( icon, ii, NULL, NULL, NULL, 0 ) ? icon : NULL; +} + /*********************************************************************** * fetch_icon_data */ @@ -612,21 +617,24 @@ static void fetch_icon_data( HWND hwnd, HICON icon_big, HICON icon_small ) if (!icon_big) { - icon_big = (HICON)send_message( hwnd, WM_GETICON, ICON_BIG, 0 ); - if (!icon_big) icon_big = (HICON)NtUserGetClassLongPtrW( hwnd, GCLP_HICON ); - if (!icon_big) icon_big = LoadIconW( 0, (LPWSTR)IDI_WINLOGO ); + icon_big = get_icon_info( (HICON)send_message( hwnd, WM_GETICON, ICON_BIG, 0 ), &ii ); + if (!icon_big) + icon_big = get_icon_info( (HICON)NtUserGetClassLongPtrW( hwnd, GCLP_HICON ), &ii ); + if (!icon_big) + icon_big = get_icon_info( LoadIconW( 0, (LPWSTR)IDI_WINLOGO ), &ii); } if (!icon_small) { - icon_small = (HICON)send_message( hwnd, WM_GETICON, ICON_SMALL, 0 ); - if (!icon_small) icon_small = (HICON)NtUserGetClassLongPtrW( hwnd, GCLP_HICONSM ); + icon_small = get_icon_info( (HICON)send_message( hwnd, WM_GETICON, ICON_SMALL, 0 ), &ii_small ); + if (!icon_small) + icon_small = get_icon_info( (HICON)NtUserGetClassLongPtrW( hwnd, GCLP_HICONSM ), &ii_small ); } - if (!NtUserGetIconInfo( icon_big, &ii, NULL, NULL, NULL, 0 )) return; + if (!icon_big) return; hDC = NtGdiCreateCompatibleDC(0); bits = get_bitmap_argb( hDC, ii.hbmColor, ii.hbmMask, &size ); - if (bits && NtUserGetIconInfo( icon_small, &ii_small, NULL, NULL, NULL, 0 )) + if (bits && icon_small) { unsigned int size_small; unsigned long *bits_small, *new;
1
0
0
0
Rémi Bernon : kernel32/tests: Add some RtlGetUserInfoHeap tests.
by Alexandre Julliard
25 Apr '22
25 Apr '22
Module: wine Branch: master Commit: 39153c98512d7ccbb07ff66441f03cb3f8da11c5 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=39153c98512d7ccbb07ff664…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Wed Apr 20 12:08:01 2022 +0200 kernel32/tests: Add some RtlGetUserInfoHeap tests. And corresponding RtlSetUserValueHeap and RtlSetUserFlagsHeap tests. Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/kernel32/tests/heap.c | 136 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 135 insertions(+), 1 deletion(-) diff --git a/dlls/kernel32/tests/heap.c b/dlls/kernel32/tests/heap.c index 302c0542f90..e3c75fbfe0a 100644 --- a/dlls/kernel32/tests/heap.c +++ b/dlls/kernel32/tests/heap.c @@ -31,6 +31,7 @@ #include "wine/test.h" /* some undocumented flags (names are made up) */ +#define HEAP_ADD_USER_INFO 0x00000100 #define HEAP_PRIVATE 0x00001000 #define HEAP_PAGE_ALLOCS 0x01000000 #define HEAP_VALIDATE 0x10000000 @@ -44,6 +45,9 @@ static LPVOID (WINAPI *pHeapAlloc)(HANDLE,DWORD,SIZE_T); static LPVOID (WINAPI *pHeapReAlloc)(HANDLE,DWORD,LPVOID,SIZE_T); static BOOL (WINAPI *pGetPhysicallyInstalledSystemMemory)( ULONGLONG * ); +static BOOLEAN (WINAPI *pRtlGetUserInfoHeap)(HANDLE,ULONG,void*,void**,ULONG*); +static BOOLEAN (WINAPI *pRtlSetUserValueHeap)(HANDLE,ULONG,void*,void*); +static BOOLEAN (WINAPI *pRtlSetUserFlagsHeap)(HANDLE,ULONG,void*,ULONG,ULONG); #define MAKE_FUNC(f) static typeof(f) *p ## f MAKE_FUNC( HeapQueryInformation ); @@ -65,6 +69,9 @@ static void load_functions(void) LOAD_FUNC( kernel32, GetPhysicallyInstalledSystemMemory ); LOAD_FUNC( kernel32, GlobalFlags ); LOAD_FUNC( ntdll, RtlGetNtGlobalFlags ); + LOAD_FUNC( ntdll, RtlGetUserInfoHeap ); + LOAD_FUNC( ntdll, RtlSetUserValueHeap ); + LOAD_FUNC( ntdll, RtlSetUserFlagsHeap ); #undef LOAD_FUNC } @@ -910,6 +917,7 @@ static void test_GlobalAlloc(void) SIZE_T size, alloc_size; HGLOBAL mem, tmp_mem; BYTE *ptr, *tmp_ptr; + ULONG tmp_flags; UINT i, flags; BOOL ret; @@ -1029,6 +1037,25 @@ static void test_GlobalAlloc(void) todo_wine ok( size == alloc_size, "HeapSize returned %Iu\n", size ); + tmp_mem = invalid_mem; + tmp_flags = 0xdeadbeef; + ret = pRtlGetUserInfoHeap( GetProcessHeap(), 0, entry->ptr, (void **)&tmp_mem, &tmp_flags ); + ok( ret, "RtlGetUserInfoHeap failed, error %lu\n", GetLastError() ); + todo_wine + ok( tmp_mem == mem, "got user ptr %p\n", tmp_mem ); + todo_wine + ok( tmp_flags == 0x200, "got user flags %#lx\n", tmp_flags ); + + ret = pRtlSetUserValueHeap( GetProcessHeap(), 0, entry->ptr, invalid_mem ); + todo_wine + ok( ret, "RtlSetUserValueHeap failed, error %lu\n", GetLastError() ); + tmp_mem = GlobalHandle( entry->ptr ); + todo_wine + ok( tmp_mem == invalid_mem, "GlobalHandle returned unexpected handle\n" ); + ret = pRtlSetUserValueHeap( GetProcessHeap(), 0, entry->ptr, mem ); + todo_wine + ok( ret, "RtlSetUserValueHeap failed, error %lu\n", GetLastError() ); + ptr = GlobalLock( mem ); ok( !!ptr, "GlobalLock failed, error %lu\n", GetLastError() ); ok( ptr != mem, "got unexpected ptr %p\n", ptr ); @@ -1737,7 +1764,9 @@ static void test_block_layout( HANDLE heap, DWORD global_flags, DWORD heap_flags DWORD padd_flags = HEAP_VALIDATE | HEAP_VALIDATE_ALL | HEAP_VALIDATE_PARAMS; SIZE_T expect_size, alloc_size, extra_size, tail_size = 0; unsigned char *ptr0, *ptr1, *ptr2; - char tail_buf[64]; + char tail_buf[64], padd_buf[64]; + void *tmp_ptr, **user_ptr; + ULONG tmp_flags; BOOL ret; if (global_flags & (FLG_HEAP_DISABLE_COALESCING|FLG_HEAP_PAGE_ALLOCS|FLG_POOL_ENABLE_TAGGING| @@ -1754,6 +1783,7 @@ static void test_block_layout( HANDLE heap, DWORD global_flags, DWORD heap_flags if ((heap_flags & HEAP_TAIL_CHECKING_ENABLED)) tail_size = 2 * sizeof(void *); memset( tail_buf, 0xab, sizeof(tail_buf) ); + memset( padd_buf, 0, sizeof(padd_buf) ); for (alloc_size = 0x20000 * sizeof(void *) - 0x3000; alloc_size > 0; alloc_size >>= 1) { @@ -1846,7 +1876,111 @@ static void test_block_layout( HANDLE heap, DWORD global_flags, DWORD heap_flags ok( ret, "HeapFree failed, error %lu\n", GetLastError() ); ret = HeapFree( heap, 0, ptr0 ); ok( ret, "HeapFree failed, error %lu\n", GetLastError() ); + winetest_pop_context(); + } + + /* Undocumented HEAP_ADD_USER_INFO flag can be used to force an additional padding + * on small block sizes. Small block use it to store user info, larger blocks + * store them in their block header instead. + * + * RtlGetUserInfoHeap also requires the flag to work consistently, and otherwise + * causes crashes when heap flags are used, or on 32-bit. + */ + if (!(heap_flags & padd_flags)) + { + alloc_size = 0x1000; + winetest_push_context( "size %#Ix", alloc_size ); + ptr0 = pHeapAlloc( heap, 0xc00|HEAP_ADD_USER_INFO, alloc_size ); + ok( !!ptr0, "HeapAlloc failed, error %lu\n", GetLastError() ); + ptr1 = HeapAlloc( heap, 0x200|HEAP_ADD_USER_INFO, alloc_size ); + ok( !!ptr1, "HeapAlloc failed, error %lu\n", GetLastError() ); + ptr2 = HeapAlloc( heap, HEAP_ADD_USER_INFO, alloc_size ); + ok( !!ptr2, "HeapAlloc failed, error %lu\n", GetLastError() ); + + expect_size = max( alloc_size, 2 * sizeof(void *) ); + expect_size = ALIGN_BLOCK_SIZE( expect_size + extra_size + 2 * sizeof(void *) ); + todo_wine_if( heap_flags & (HEAP_VALIDATE_PARAMS|HEAP_VALIDATE_ALL) || + (ptr2 - ptr1 != expect_size && ptr1 - ptr0 != expect_size) ) + ok( ptr2 - ptr1 == expect_size || ptr1 - ptr0 == expect_size, + "got diff %#Ix %#Ix\n", ptr2 - ptr1, ptr1 - ptr0 ); + + ok( !memcmp( ptr0 + alloc_size, tail_buf, tail_size ), "missing block tail\n" ); + ok( !memcmp( ptr1 + alloc_size, tail_buf, tail_size ), "missing block tail\n" ); + ok( !memcmp( ptr2 + alloc_size, tail_buf, tail_size ), "missing block tail\n" ); + + todo_wine + ok( !memcmp( ptr0 + alloc_size + tail_size, padd_buf, 2 * sizeof(void *) ), "unexpected padding\n" ); + + tmp_ptr = (void *)0xdeadbeef; + tmp_flags = 0xdeadbeef; + ret = pRtlGetUserInfoHeap( heap, 0, ptr0, (void **)&tmp_ptr, &tmp_flags ); + ok( ret, "RtlGetUserInfoHeap failed, error %lu\n", GetLastError() ); + ok( tmp_ptr == (void *)NULL, "got ptr %p\n", tmp_ptr ); + todo_wine + ok( tmp_flags == 0xc00, "got flags %#lx\n", tmp_flags ); + tmp_ptr = (void *)0xdeadbeef; + tmp_flags = 0xdeadbeef; + ret = pRtlGetUserInfoHeap( heap, 0, ptr1, (void **)&tmp_ptr, &tmp_flags ); + ok( ret, "RtlGetUserInfoHeap failed, error %lu\n", GetLastError() ); + ok( tmp_ptr == (void *)NULL, "got ptr %p\n", tmp_ptr ); + todo_wine + ok( tmp_flags == 0x200, "got flags %#lx\n", tmp_flags ); + + ret = pRtlSetUserValueHeap( heap, 0, ptr0, (void *)0xdeadbeef ); + todo_wine + ok( ret, "RtlSetUserValueHeap failed, error %lu\n", GetLastError() ); + SetLastError( 0xdeadbeef ); + ret = pRtlSetUserFlagsHeap( heap, 0, ptr0, 0, 0x1000 ); + ok( !ret, "RtlSetUserFlagsHeap succeeded\n" ); + todo_wine + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + SetLastError( 0xdeadbeef ); + ret = pRtlSetUserFlagsHeap( heap, 0, ptr0, 0x100, 0 ); + ok( !ret, "RtlSetUserFlagsHeap succeeded\n" ); + todo_wine + ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() ); + ret = pRtlSetUserFlagsHeap( heap, 0, ptr0, 0x400, 0x200 ); + todo_wine + ok( ret, "RtlSetUserFlagsHeap failed, error %lu\n", GetLastError() ); + + tmp_ptr = NULL; + tmp_flags = 0; + ret = pRtlGetUserInfoHeap( heap, 0, ptr0, (void **)&tmp_ptr, &tmp_flags ); + ok( ret, "RtlGetUserInfoHeap failed, error %lu\n", GetLastError() ); + todo_wine + ok( tmp_ptr == (void *)0xdeadbeef, "got ptr %p\n", tmp_ptr ); + todo_wine + ok( tmp_flags == 0xa00 || broken(tmp_flags == 0xc00) /* w1064v1507 */, + "got flags %#lx\n", tmp_flags ); + + user_ptr = (void **)(ptr0 + alloc_size + tail_size); + todo_wine + ok( user_ptr[0] == 0, "unexpected padding\n" ); + todo_wine + ok( user_ptr[1] == (void *)0xdeadbeef, "unexpected user value\n" ); + if (user_ptr[1] == (void *)0xdeadbeef) + { + user_ptr[0] = (void *)0xdeadbeef; + user_ptr[1] = (void *)0xdeadbee0; + } + + tmp_ptr = NULL; + tmp_flags = 0; + ret = pRtlGetUserInfoHeap( heap, 0, ptr0, (void **)&tmp_ptr, &tmp_flags ); + ok( ret, "RtlGetUserInfoHeap failed, error %lu\n", GetLastError() ); + todo_wine + ok( tmp_ptr == (void *)0xdeadbee0, "got ptr %p\n", tmp_ptr ); + todo_wine + ok( tmp_flags == 0xa00 || broken(tmp_flags == 0xc00) /* w1064v1507 */, + "got flags %#lx\n", tmp_flags ); + + ret = HeapFree( heap, 0, ptr2 ); + ok( ret, "HeapFree failed, error %lu\n", GetLastError() ); + ret = HeapFree( heap, 0, ptr1 ); + ok( ret, "HeapFree failed, error %lu\n", GetLastError() ); + ret = HeapFree( heap, 0, ptr0 ); + ok( ret, "HeapFree failed, error %lu\n", GetLastError() ); winetest_pop_context(); } }
1
0
0
0
Rémi Bernon : ntdll: Stub RtlGetUserInfoHeap and RtlSetUser(Value|Flags)Heap.
by Alexandre Julliard
25 Apr '22
25 Apr '22
Module: wine Branch: master Commit: 94051290f66d8d13a8ab736d628d291661f901f1 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=94051290f66d8d13a8ab736d…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Wed Apr 20 12:08:00 2022 +0200 ntdll: Stub RtlGetUserInfoHeap and RtlSetUser(Value|Flags)Heap. Returning TRUE from RtlGetUserInfoHeap as tests in next patch suggest it always does. Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/heap.c | 30 ++++++++++++++++++++++++++++++ dlls/ntdll/ntdll.spec | 6 +++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/dlls/ntdll/heap.c b/dlls/ntdll/heap.c index 298c39f24ff..7f41088347d 100644 --- a/dlls/ntdll/heap.c +++ b/dlls/ntdll/heap.c @@ -2273,3 +2273,33 @@ NTSTATUS WINAPI RtlSetHeapInformation( HANDLE heap, HEAP_INFORMATION_CLASS info_ FIXME("%p %d %p %ld stub\n", heap, info_class, info, size); return STATUS_SUCCESS; } + +/*********************************************************************** + * RtlGetUserInfoHeap (NTDLL.@) + */ +BOOLEAN WINAPI RtlGetUserInfoHeap( HANDLE heap, ULONG flags, void *ptr, void **user_value, ULONG *user_flags ) +{ + FIXME( "heap %p, flags %#x, ptr %p, user_value %p, user_flags %p semi-stub!\n", + heap, flags, ptr, user_value, user_flags ); + *user_value = NULL; + *user_flags = 0; + return TRUE; +} + +/*********************************************************************** + * RtlSetUserValueHeap (NTDLL.@) + */ +BOOLEAN WINAPI RtlSetUserValueHeap( HANDLE heap, ULONG flags, void *ptr, void *user_value ) +{ + FIXME( "heap %p, flags %#x, ptr %p, user_value %p stub!\n", heap, flags, ptr, user_value ); + return FALSE; +} + +/*********************************************************************** + * RtlSetUserFlagsHeap (NTDLL.@) + */ +BOOLEAN WINAPI RtlSetUserFlagsHeap( HANDLE heap, ULONG flags, void *ptr, ULONG clear, ULONG set ) +{ + FIXME( "heap %p, flags %#x, ptr %p, clear %#x, set %#x stub!\n", heap, flags, ptr, clear, set ); + return FALSE; +} diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 311f99be054..ba29b21d61d 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -748,7 +748,7 @@ @ stdcall RtlGetThreadPreferredUILanguages(long ptr ptr ptr) @ stdcall RtlGetUnloadEventTrace() @ stdcall RtlGetUnloadEventTraceEx(ptr ptr ptr) -@ stub RtlGetUserInfoHeap +@ stdcall RtlGetUserInfoHeap(ptr long ptr ptr ptr) @ stdcall RtlGetUserPreferredUILanguages(long long ptr ptr ptr) @ stdcall RtlGetVersion(ptr) @ stdcall -arch=arm,arm64,x86_64 RtlGrowFunctionTable(ptr long) @@ -1001,8 +1001,8 @@ # @ stub RtlSetTimer @ stdcall RtlSetUnhandledExceptionFilter(ptr) @ stub RtlSetUnicodeCallouts -@ stub RtlSetUserFlagsHeap -@ stub RtlSetUserValueHeap +@ stdcall RtlSetUserFlagsHeap(ptr long ptr long long) +@ stdcall RtlSetUserValueHeap(ptr long ptr ptr) @ stdcall RtlSizeHeap(long long ptr) @ stdcall RtlSleepConditionVariableCS(ptr ptr ptr) @ stdcall RtlSleepConditionVariableSRW(ptr ptr ptr long)
1
0
0
0
Rémi Bernon : kernel32/tests: Add some heap block layout tests.
by Alexandre Julliard
25 Apr '22
25 Apr '22
Module: wine Branch: master Commit: 3757a8f1ab78955dc328f4a79231eba913ed4573 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=3757a8f1ab78955dc328f4a7…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Wed Apr 20 12:07:59 2022 +0200 kernel32/tests: Add some heap block layout tests. Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/kernel32/tests/heap.c | 123 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/dlls/kernel32/tests/heap.c b/dlls/kernel32/tests/heap.c index 104eced3bf4..302c0542f90 100644 --- a/dlls/kernel32/tests/heap.c +++ b/dlls/kernel32/tests/heap.c @@ -37,6 +37,9 @@ #define HEAP_VALIDATE_ALL 0x20000000 #define HEAP_VALIDATE_PARAMS 0x40000000 +#define BLOCK_ALIGN (2 * sizeof(void *) - 1) +#define ALIGN_BLOCK_SIZE(x) (((x) + BLOCK_ALIGN) & ~BLOCK_ALIGN) + /* use function pointers to avoid warnings for invalid parameter tests */ static LPVOID (WINAPI *pHeapAlloc)(HANDLE,DWORD,SIZE_T); static LPVOID (WINAPI *pHeapReAlloc)(HANDLE,DWORD,LPVOID,SIZE_T); @@ -1729,6 +1732,125 @@ static void test_LocalAlloc(void) } } +static void test_block_layout( HANDLE heap, DWORD global_flags, DWORD heap_flags ) +{ + DWORD padd_flags = HEAP_VALIDATE | HEAP_VALIDATE_ALL | HEAP_VALIDATE_PARAMS; + SIZE_T expect_size, alloc_size, extra_size, tail_size = 0; + unsigned char *ptr0, *ptr1, *ptr2; + char tail_buf[64]; + BOOL ret; + + if (global_flags & (FLG_HEAP_DISABLE_COALESCING|FLG_HEAP_PAGE_ALLOCS|FLG_POOL_ENABLE_TAGGING| + FLG_HEAP_ENABLE_TAGGING|FLG_HEAP_ENABLE_TAG_BY_DLL)) + { + skip( "skipping not yet implemented block layout tests\n" ); + return; + } + + if (!global_flags) extra_size = 8; + else extra_size = 2 * sizeof(void *); + if (heap_flags & HEAP_TAIL_CHECKING_ENABLED) extra_size += 2 * sizeof(void *); + if (heap_flags & padd_flags) extra_size += 2 * sizeof(void *); + + if ((heap_flags & HEAP_TAIL_CHECKING_ENABLED)) tail_size = 2 * sizeof(void *); + memset( tail_buf, 0xab, sizeof(tail_buf) ); + + for (alloc_size = 0x20000 * sizeof(void *) - 0x3000; alloc_size > 0; alloc_size >>= 1) + { + winetest_push_context( "size %#Ix", alloc_size ); + + ptr0 = pHeapAlloc( heap, HEAP_ZERO_MEMORY, alloc_size ); + ok( !!ptr0, "HeapAlloc failed, error %lu\n", GetLastError() ); + ptr1 = pHeapAlloc( heap, HEAP_ZERO_MEMORY, alloc_size ); + ok( !!ptr1, "HeapAlloc failed, error %lu\n", GetLastError() ); + ptr2 = pHeapAlloc( heap, HEAP_ZERO_MEMORY, alloc_size ); + ok( !!ptr2, "HeapAlloc failed, error %lu\n", GetLastError() ); + + ok( !((UINT_PTR)ptr0 & (2 * sizeof(void *) - 1)), "got unexpected ptr align\n" ); + ok( !((UINT_PTR)ptr1 & (2 * sizeof(void *) - 1)), "got unexpected ptr align\n" ); + ok( !((UINT_PTR)ptr2 & (2 * sizeof(void *) - 1)), "got unexpected ptr align\n" ); + + expect_size = max( alloc_size, 2 * sizeof(void *) ); + expect_size = ALIGN_BLOCK_SIZE( expect_size + extra_size ); + todo_wine_if( heap_flags & (HEAP_VALIDATE_PARAMS|HEAP_VALIDATE_ALL) || + min( llabs( ptr2 - ptr1 ), llabs( ptr1 - ptr0 ) ) != expect_size ) + ok( min( llabs( ptr2 - ptr1 ), llabs( ptr1 - ptr0 ) ) == expect_size, "got diff %#I64x\n", + min( llabs( ptr2 - ptr1 ), llabs( ptr1 - ptr0 ) ) ); + + ok( !memcmp( ptr0 + alloc_size, tail_buf, tail_size ), "missing block tail\n" ); + ok( !memcmp( ptr1 + alloc_size, tail_buf, tail_size ), "missing block tail\n" ); + ok( !memcmp( ptr2 + alloc_size, tail_buf, tail_size ), "missing block tail\n" ); + + ret = HeapFree( heap, 0, ptr2 ); + ok( ret, "HeapFree failed, error %lu\n", GetLastError() ); + ret = HeapFree( heap, 0, ptr1 ); + ok( ret, "HeapFree failed, error %lu\n", GetLastError() ); + ret = HeapFree( heap, 0, ptr0 ); + ok( ret, "HeapFree failed, error %lu\n", GetLastError() ); + + winetest_pop_context(); + } + + + /* between the two thesholds, tail may still be set but block position is inconsistent */ + + alloc_size = 0x20000 * sizeof(void *) - 0x2000; + winetest_push_context( "size %#Ix", alloc_size ); + + ptr0 = pHeapAlloc( heap, HEAP_ZERO_MEMORY, alloc_size ); + ok( !!ptr0, "HeapAlloc failed, error %lu\n", GetLastError() ); + ok( !((UINT_PTR)ptr0 & (2 * sizeof(void *) - 1)), "got unexpected ptr align\n" ); + + ok( !memcmp( ptr0 + alloc_size, tail_buf, tail_size ), "missing block tail\n" ); + + ret = HeapFree( heap, 0, ptr0 ); + ok( ret, "HeapFree failed, error %lu\n", GetLastError() ); + + winetest_pop_context(); + + + for (alloc_size = 0x20000 * sizeof(void *) - 0x1000; alloc_size < 0x800000; alloc_size <<= 1) + { + winetest_push_context( "size %#Ix", alloc_size ); + + ptr0 = pHeapAlloc( heap, HEAP_ZERO_MEMORY, alloc_size ); + ok( !!ptr0, "HeapAlloc failed, error %lu\n", GetLastError() ); + ptr1 = pHeapAlloc( heap, 0, alloc_size ); + ok( !!ptr1, "HeapAlloc failed, error %lu\n", GetLastError() ); + ptr2 = pHeapAlloc( heap, 0, alloc_size ); + ok( !!ptr2, "HeapAlloc failed, error %lu\n", GetLastError() ); + + todo_wine_if( sizeof(void *) == 8 || alloc_size == 0x7efe9 ) + ok( !((UINT_PTR)ptr0 & (8 * sizeof(void *) - 1)), "got unexpected ptr align\n" ); + todo_wine_if( sizeof(void *) == 8 || alloc_size == 0x7efe9 ) + ok( !((UINT_PTR)ptr1 & (8 * sizeof(void *) - 1)), "got unexpected ptr align\n" ); + todo_wine_if( sizeof(void *) == 8 || alloc_size == 0x7efe9 ) + ok( !((UINT_PTR)ptr2 & (8 * sizeof(void *) - 1)), "got unexpected ptr align\n" ); + + expect_size = max( alloc_size, 2 * sizeof(void *) ); + expect_size = ALIGN_BLOCK_SIZE( expect_size + extra_size ); + todo_wine_if( alloc_size == 0x7efe9 ) + ok( min( llabs( ptr2 - ptr1 ), llabs( ptr1 - ptr0 ) ) > expect_size, "got diff %#I64x\n", + min( llabs( ptr2 - ptr1 ), llabs( ptr1 - ptr0 ) ) ); + + todo_wine_if( heap_flags & HEAP_TAIL_CHECKING_ENABLED ) + ok( !ptr0[alloc_size], "got block tail\n" ); + todo_wine_if( heap_flags & HEAP_TAIL_CHECKING_ENABLED ) + ok( !ptr1[alloc_size], "got block tail\n" ); + todo_wine_if( heap_flags & HEAP_TAIL_CHECKING_ENABLED ) + ok( !ptr2[alloc_size], "got block tail\n" ); + + ret = HeapFree( heap, 0, ptr2 ); + ok( ret, "HeapFree failed, error %lu\n", GetLastError() ); + ret = HeapFree( heap, 0, ptr1 ); + ok( ret, "HeapFree failed, error %lu\n", GetLastError() ); + ret = HeapFree( heap, 0, ptr0 ); + ok( ret, "HeapFree failed, error %lu\n", GetLastError() ); + + winetest_pop_context(); + } +} + static void test_heap_checks( DWORD flags ) { BYTE old, *p, *p2; @@ -2043,6 +2165,7 @@ static void test_child_heap( const char *arg ) heap = HeapCreate( HEAP_NO_SERIALIZE, 0, 0 ); ok( heap != GetProcessHeap(), "got unexpected heap\n" ); test_heap_layout( heap, global_flags, heap_flags|HEAP_NO_SERIALIZE|HEAP_GROWABLE|HEAP_PRIVATE ); + test_block_layout( heap, global_flags, heap_flags|HEAP_NO_SERIALIZE|HEAP_GROWABLE|HEAP_PRIVATE ); ret = HeapDestroy( heap ); ok( ret, "HeapDestroy failed, error %lu\n", GetLastError() );
1
0
0
0
Alexandre Julliard : kernelbase: Use the digit table from locale.nls in FoldStringW().
by Alexandre Julliard
25 Apr '22
25 Apr '22
Module: wine Branch: master Commit: f3b77b802709ac590f88a85dc1b85d45d00fdb59 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=f3b77b802709ac590f88a85d…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Mon Apr 25 11:53:53 2022 +0200 kernelbase: Use the digit table from locale.nls in FoldStringW(). Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/kernelbase/Makefile.in | 1 - dlls/kernelbase/digitmap.c | 91 --------------------------------------------- dlls/kernelbase/locale.c | 13 +------ tools/make_unicode | 19 ---------- 4 files changed, 1 insertion(+), 123 deletions(-) diff --git a/dlls/kernelbase/Makefile.in b/dlls/kernelbase/Makefile.in index a5845abc1a8..2b270153060 100644 --- a/dlls/kernelbase/Makefile.in +++ b/dlls/kernelbase/Makefile.in @@ -9,7 +9,6 @@ C_SRCS = \ collation.c \ console.c \ debug.c \ - digitmap.c \ file.c \ loader.c \ locale.c \ diff --git a/dlls/kernelbase/digitmap.c b/dlls/kernelbase/digitmap.c deleted file mode 100644 index 26a464e30f5..00000000000 --- a/dlls/kernelbase/digitmap.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Unicode digit folding mappings */ -/* generated from
https://www.unicode.org/Public/14.0.0/ucd/UCD.zip:UnicodeData.txt
*/ -/* DO NOT EDIT!! */ - -#include "windef.h" - -const unsigned short DECLSPEC_HIDDEN wine_digitmap[619] = -{ - /* level 1 offsets */ - 0x0100, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x0116, 0x0110, - 0x010c, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, 0x0135, 0x0140, - 0x014c, 0x010c, 0x010c, 0x0156, 0x010c, 0x010c, 0x010c, 0x010e, - 0x0165, 0x0171, 0x017f, 0x018a, 0x0196, 0x010c, 0x010c, 0x010c, - 0x019f, 0x010c, 0x010c, 0x010c, 0x01a9, 0x010c, 0x010c, 0x01b9, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x0140, 0x010c, - 0x010f, 0x01c9, 0x013d, 0x010d, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, - 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x0165, - /* level 2 offsets */ - 0x01d9, 0x01d9, 0x01d9, 0x01e9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, - 0x01d9, 0x01d9, 0x01d9, 0x01f7, 0x01d9, 0x01d9, 0x01d9, 0x01d9, - 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, - 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01e9, 0x01d9, 0x01d9, 0x01d9, - 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01e9, 0x01d9, 0x01d9, - 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01e3, 0x01d9, 0x01d9, 0x01d9, - 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01e3, 0x01d9, 0x01d9, 0x01d9, - 0x01d9, 0x01d9, 0x01e9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, - 0x01d9, 0x01d9, 0x01e9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, - 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, - 0x01e9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01e9, 0x01d9, 0x01d9, - 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x0201, 0x0211, 0x01d9, 0x01d9, - 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01e9, 0x01d9, - 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, - 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01e3, 0x01d9, 0x01d9, - 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x0221, 0x01d9, - 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01e9, - 0x01e9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01e9, - 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01e9, 0x01d9, 0x01d9, - 0x01d9, 0x01d9, 0x01e9, 0x01e9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, - 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x0231, 0x01e9, - 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x020a, - 0x0206, 0x0202, 0x023a, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x0240, - 0x024b, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, - 0x0204, 0x025b, 0x0210, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, - 0x01d9, 0x01e9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, - 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01d9, 0x01e9, 0x01d9, - 0x01e9, - /* values */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0032, 0x0033, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0031, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x0031, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0030, 0x0000, 0x0000, 0x0000, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0031, - 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, - 0x0000, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, - 0x0037, 0x0038, 0x0039, 0x0000, 0x0031, 0x0032, 0x0033, 0x0034, - 0x0035, 0x0036 -}; diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c index 3830a3fae2c..d046cefd749 100644 --- a/dlls/kernelbase/locale.c +++ b/dlls/kernelbase/locale.c @@ -1856,12 +1856,6 @@ void init_locale( HMODULE module ) } -static inline USHORT get_table_entry( const USHORT *table, WCHAR ch ) -{ - return table[table[table[ch >> 8] + ((ch >> 4) & 0x0f)] + (ch & 0xf)]; -} - - static inline WCHAR casemap( const USHORT *table, WCHAR ch ) { return ch + table[table[table[ch >> 8] + ((ch >> 4) & 0x0f)] + (ch & 0x0f)]; @@ -2072,17 +2066,12 @@ static NTSTATUS expand_ligatures( const WCHAR *src, int srclen, WCHAR *dst, int static NTSTATUS fold_digits( const WCHAR *src, int srclen, WCHAR *dst, int *dstlen ) { - extern const WCHAR wine_digitmap[] DECLSPEC_HIDDEN; int i, len = *dstlen; *dstlen = srclen; if (!len) return STATUS_SUCCESS; if (srclen > len) return STATUS_BUFFER_TOO_SMALL; - for (i = 0; i < srclen; i++) - { - WCHAR digit = get_table_entry( wine_digitmap, src[i] ); - dst[i] = digit ? digit : src[i]; - } + for (i = 0; i < srclen; i++) dst[i] = casemap( charmaps[CHARMAP_FOLDDIGITS], src[i] ); return STATUS_SUCCESS; } diff --git a/tools/make_unicode b/tools/make_unicode index f697eeaaeb4..29dea8cd52e 100755 --- a/tools/make_unicode +++ b/tools/make_unicode @@ -3253,24 +3253,6 @@ sub dump_vertical($$) save_file($filename); } -################################################################ -# dump the digit folding tables -sub dump_digit_folding($) -{ - my ($filename) = shift; - open OUTPUT,">$filename.new" or die "Cannot create $filename"; - print "Building $filename\n"; - print OUTPUT "/* Unicode digit folding mappings */\n"; - print OUTPUT "/* generated from $UNIDATA:UnicodeData.txt */\n"; - print OUTPUT "/* DO NOT EDIT!! */\n\n"; - print OUTPUT "#include \"windef.h\"\n\n"; - - dump_two_level_mapping( "wine_digitmap", 0, 16, @digitmap_table ); - close OUTPUT; - save_file($filename); -} - - ################################################################ # compress a mapping table by removing identical rows sub compress_array($$@) @@ -5393,7 +5375,6 @@ load_data(); dump_sortkeys( "dlls/kernelbase/collation.c" ); dump_bidi_dir_table( "dlls/gdi32/uniscribe/direction.c" ); dump_bidi_dir_table( "dlls/dwrite/direction.c" ); -dump_digit_folding( "dlls/kernelbase/digitmap.c" ); dump_mirroring( "dlls/gdi32/uniscribe/mirror.c" ); dump_mirroring( "dlls/dwrite/mirror.c" ); dump_bracket( "dlls/gdi32/uniscribe/bracket.c" );
1
0
0
0
← Newer
1
...
22
23
24
25
26
27
28
...
103
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
92
93
94
95
96
97
98
99
100
101
102
103
Results per page:
10
25
50
100
200