From: Hans Leidekker hans@codeweavers.com
--- dlls/adsldp/adsldp.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/dlls/adsldp/adsldp.c b/dlls/adsldp/adsldp.c index c79a77211f3..115c7cfb77e 100644 --- a/dlls/adsldp/adsldp.c +++ b/dlls/adsldp/adsldp.c @@ -400,6 +400,7 @@ typedef struct { ADS_SCOPEENUM scope; int pagesize; + int size_limit; BOOL cache_results; BOOL attribtypes_only; BOOL tombstone; @@ -1272,6 +1273,19 @@ static HRESULT WINAPI search_SetSearchPreference(IDirectorySearch *iface, PADS_S prefs[i].dwStatus = ADS_STATUS_S_OK; break;
+ case ADS_SEARCHPREF_SIZE_LIMIT: + if (prefs[i].vValue.dwType != ADSTYPE_INTEGER) + { + FIXME("ADS_SEARCHPREF_SIZE_LIMIT: unsupported dwType %d\n", prefs[i].vValue.dwType); + prefs[i].dwStatus = ADS_STATUS_INVALID_SEARCHPREFVALUE; + break; + } + + TRACE("SIZE_LIMIT: %ld\n", prefs[i].vValue.u.Integer); + ldap->search.size_limit = prefs[i].vValue.u.Integer; + prefs[i].dwStatus = ADS_STATUS_S_OK; + break; + default: FIXME("pref %d, type %u: stub\n", prefs[i].dwSearchPref, prefs[i].vValue.dwType); prefs[i].dwStatus = ADS_STATUS_INVALID_SEARCHPREF; @@ -1339,7 +1353,7 @@ static HRESULT WINAPI search_ExecuteSearch(IDirectorySearch *iface, LPWSTR filte { ldap_ctx->page = ldap_search_init_pageW(ldap->ld, ldap->object, ldap->search.scope, filter, props, ldap->search.attribtypes_only, - ctrls, NULL, 0, 0, NULL); + ctrls, NULL, 0, ldap->search.size_limit, NULL); if (ldap_ctx->page) err = ldap_get_next_page_s(ldap->ld, ldap_ctx->page, NULL, ldap->search.pagesize, &count, &ldap_ctx->res); @@ -1348,7 +1362,8 @@ static HRESULT WINAPI search_ExecuteSearch(IDirectorySearch *iface, LPWSTR filte } else err = ldap_search_ext_sW(ldap->ld, ldap->object, ldap->search.scope, filter, props, - ldap->search.attribtypes_only, ctrls, NULL, NULL, 0, &ldap_ctx->res); + ldap->search.attribtypes_only, ctrls, NULL, NULL, ldap->search.size_limit, + &ldap_ctx->res); heap_free(props); if (err != LDAP_SUCCESS) { @@ -1972,6 +1987,7 @@ static HRESULT LDAPNamespace_create(REFIID riid, void **obj) ldap->attrs = NULL; ldap->search.scope = ADS_SCOPE_SUBTREE; ldap->search.pagesize = 0; + ldap->search.size_limit = 0; ldap->search.cache_results = TRUE; ldap->search.attribtypes_only = FALSE; ldap->search.tombstone = FALSE;
From: Hans Leidekker hans@codeweavers.com
--- dlls/adsldp/tests/ldap.c | 61 +++++++++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 16 deletions(-)
diff --git a/dlls/adsldp/tests/ldap.c b/dlls/adsldp/tests/ldap.c index 558dc02c0c5..8010837243e 100644 --- a/dlls/adsldp/tests/ldap.c +++ b/dlls/adsldp/tests/ldap.c @@ -226,7 +226,7 @@ static void do_search(const struct search *s) { HRESULT hr; IDirectorySearch *ds; - ADS_SEARCHPREF_INFO pref; + ADS_SEARCHPREF_INFO pref[2]; ADS_SEARCH_HANDLE sh; ADS_SEARCH_COLUMN col; LPWSTR name; @@ -242,13 +242,20 @@ static void do_search(const struct search *s) } ok(hr == S_OK, "got %#lx\n", hr);
- pref.dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE; - pref.vValue.dwType = ADSTYPE_INTEGER; - pref.vValue.Integer = s->scope; - pref.dwStatus = 0xdeadbeef; - hr = IDirectorySearch_SetSearchPreference(ds, &pref, 1); + pref[0].dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE; + pref[0].vValue.dwType = ADSTYPE_INTEGER; + pref[0].vValue.Integer = s->scope; + pref[0].dwStatus = 0xdeadbeef; + + pref[1].dwSearchPref = ADS_SEARCHPREF_SIZE_LIMIT; + pref[1].vValue.dwType = ADSTYPE_INTEGER; + pref[1].vValue.Integer = 5; + pref[1].dwStatus = 0xdeadbeef; + + hr = IDirectorySearch_SetSearchPreference(ds, pref, ARRAY_SIZE(pref)); ok(hr == S_OK, "got %#lx\n", hr); - ok(pref.dwStatus == ADS_STATUS_S_OK, "got %d\n", pref.dwStatus); + ok(pref[0].dwStatus == ADS_STATUS_S_OK, "got %u\n", pref[0].dwStatus); + ok(pref[1].dwStatus == ADS_STATUS_S_OK, "got %u\n", pref[1].dwStatus);
hr = IDirectorySearch_ExecuteSearch(ds, (WCHAR *)L"(objectClass=*)", NULL, ~0, &sh); ok(hr == S_OK, "got %#lx\n", hr); @@ -346,7 +353,7 @@ static void test_DirectorySearch(void) }; HRESULT hr; IDirectorySearch *ds; - ADS_SEARCHPREF_INFO pref; + ADS_SEARCHPREF_INFO pref[2]; ADS_SEARCH_HANDLE sh; ADS_SEARCH_COLUMN col; LPWSTR name; @@ -370,13 +377,20 @@ static void test_DirectorySearch(void) } ok(hr == S_OK, "got %#lx\n", hr);
- pref.dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE; - pref.vValue.dwType = ADSTYPE_INTEGER; - pref.vValue.Integer = ADS_SCOPE_BASE; - pref.dwStatus = 0xdeadbeef; - hr = IDirectorySearch_SetSearchPreference(ds, &pref, 1); + pref[0].dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE; + pref[0].vValue.dwType = ADSTYPE_INTEGER; + pref[0].vValue.Integer = ADS_SCOPE_BASE; + pref[0].dwStatus = 0xdeadbeef; + + pref[1].dwSearchPref = ADS_SEARCHPREF_SIZE_LIMIT; + pref[1].vValue.dwType = ADSTYPE_INTEGER; + pref[1].vValue.Integer = 5; + pref[1].dwStatus = 0xdeadbeef; + + hr = IDirectorySearch_SetSearchPreference(ds, pref, ARRAY_SIZE(pref)); ok(hr == S_OK, "got %#lx\n", hr); - ok(pref.dwStatus == ADS_STATUS_S_OK, "got %d\n", pref.dwStatus); + ok(pref[0].dwStatus == ADS_STATUS_S_OK, "got %u\n", pref[0].dwStatus); + ok(pref[1].dwStatus == ADS_STATUS_S_OK, "got %u\n", pref[1].dwStatus);
hr = IDirectorySearch_ExecuteSearch(ds, (WCHAR *)L"(objectClass=*)", NULL, ~0, NULL); ok(hr == E_ADS_BAD_PARAMETER, "got %#lx\n", hr); @@ -475,7 +489,7 @@ static void test_DirectoryObject(void) IDirectoryObject *dirobj; IUnknown *unk; IDirectorySearch *ds; - ADS_SEARCHPREF_INFO pref[2]; + ADS_SEARCHPREF_INFO pref[3]; ADS_SEARCH_HANDLE sh; ADS_SEARCH_COLUMN col;
@@ -504,15 +518,23 @@ static void test_DirectoryObject(void) pref[0].vValue.dwType = ADSTYPE_INTEGER; pref[0].vValue.Integer = ADS_SCOPE_BASE; pref[0].dwStatus = 0xdeadbeef; + pref[1].dwSearchPref = ADS_SEARCHPREF_SECURITY_MASK; pref[1].vValue.dwType = ADSTYPE_INTEGER; pref[1].vValue.Integer = ADS_SECURITY_INFO_OWNER | ADS_SECURITY_INFO_GROUP | ADS_SECURITY_INFO_DACL; pref[1].dwStatus = 0xdeadbeef; + + pref[2].dwSearchPref = ADS_SEARCHPREF_SIZE_LIMIT; + pref[2].vValue.dwType = ADSTYPE_INTEGER; + pref[2].vValue.Integer = 5; + pref[2].dwStatus = 0xdeadbeef; + hr = IDirectorySearch_SetSearchPreference(ds, pref, ARRAY_SIZE(pref)); ok(hr == S_ADS_ERRORSOCCURRED, "got %#lx\n", hr); ok(pref[0].dwStatus == ADS_STATUS_S_OK, "got %d\n", pref[0].dwStatus); /* ldap.forumsys.com doesn't support NT security, real ADs DC - does */ ok(pref[1].dwStatus == ADS_STATUS_INVALID_SEARCHPREF, "got %d\n", pref[1].dwStatus); + ok(pref[2].dwStatus == ADS_STATUS_S_OK, "got %d\n", pref[2].dwStatus);
hr = IDirectorySearch_ExecuteSearch(ds, (WCHAR *)L"(objectClass=*)", NULL, ~0, &sh); ok(hr == S_OK, "got %#lx\n", hr); @@ -530,9 +552,16 @@ static void test_DirectoryObject(void) pref[0].vValue.dwType = ADSTYPE_BOOLEAN; pref[0].vValue.Integer = 1; pref[0].dwStatus = 0xdeadbeef; - hr = IDirectorySearch_SetSearchPreference(ds, pref, 1); + + pref[1].dwSearchPref = ADS_SEARCHPREF_SIZE_LIMIT; + pref[1].vValue.dwType = ADSTYPE_INTEGER; + pref[1].vValue.Integer = 5; + pref[1].dwStatus = 0xdeadbeef; + + hr = IDirectorySearch_SetSearchPreference(ds, pref, 2); ok(hr == S_OK, "got %#lx\n", hr); ok(pref[0].dwStatus == ADS_STATUS_S_OK, "got %d\n", pref[0].dwStatus); + ok(pref[1].dwStatus == ADS_STATUS_S_OK, "got %d\n", pref[1].dwStatus);
hr = IDirectorySearch_ExecuteSearch(ds, (WCHAR *)L"(objectClass=*)", NULL, ~0, &sh); ok(hr == HRESULT_FROM_WIN32(ERROR_DS_UNAVAILABLE_CRIT_EXTENSION) || broken(hr == S_OK) /* XP */, "got %#lx\n", hr);
From: Hans Leidekker hans@codeweavers.com
--- dlls/adsldp/tests/ldap.c | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-)
diff --git a/dlls/adsldp/tests/ldap.c b/dlls/adsldp/tests/ldap.c index 8010837243e..23cca695c3a 100644 --- a/dlls/adsldp/tests/ldap.c +++ b/dlls/adsldp/tests/ldap.c @@ -395,11 +395,8 @@ static void test_DirectorySearch(void) hr = IDirectorySearch_ExecuteSearch(ds, (WCHAR *)L"(objectClass=*)", NULL, ~0, NULL); ok(hr == E_ADS_BAD_PARAMETER, "got %#lx\n", hr);
- if (0) /* crashes under XP */ - { hr = IDirectorySearch_ExecuteSearch(ds, (WCHAR *)L"(objectClass=*)", NULL, 1, &sh); ok(hr == E_ADS_BAD_PARAMETER, "got %#lx\n", hr); - }
hr = IDirectorySearch_ExecuteSearch(ds, (WCHAR *)L"(objectClass=*)", NULL, ~0, &sh); ok(hr == S_OK, "got %#lx\n", hr); @@ -435,8 +432,8 @@ static void test_DirectorySearch(void)
name = (void *)0xdeadbeef; hr = IDirectorySearch_GetNextColumnName(ds, sh, &name); - ok(hr == S_ADS_NOMORE_COLUMNS || broken(hr == S_OK) /* XP */, "got %#lx\n", hr); - ok(name == NULL || broken(name && !wcscmp(name, L"ADsPath")) /* XP */, "got %p/%s\n", name, wine_dbgstr_w(name)); + ok(hr == S_ADS_NOMORE_COLUMNS, "got %#lx\n", hr); + ok(name == NULL, "got %p/%s\n", name, wine_dbgstr_w(name)); }
hr = IDirectorySearch_GetNextRow(ds, sh); @@ -445,21 +442,18 @@ static void test_DirectorySearch(void) name = NULL; hr = IDirectorySearch_GetNextColumnName(ds, sh, &name); todo_wine - ok(hr == S_OK || broken(hr == S_ADS_NOMORE_COLUMNS) /* XP */, "got %#lx\n", hr); + ok(hr == S_OK, "got %#lx\n", hr); todo_wine - ok((name && !wcscmp(name, L"ADsPath")) || broken(!name) /* XP */, "got %s\n", wine_dbgstr_w(name)); + ok(name && !wcscmp(name, L"ADsPath"), "got %s\n", wine_dbgstr_w(name)); FreeADsMem(name);
name = (void *)0xdeadbeef; hr = IDirectorySearch_GetNextColumnName(ds, sh, &name); - ok(hr == S_ADS_NOMORE_COLUMNS || broken(hr == S_OK) /* XP */, "got %#lx\n", hr); - ok(name == NULL || broken(name && !wcscmp(name, L"ADsPath")) /* XP */, "got %p/%s\n", name, wine_dbgstr_w(name)); + ok(hr == S_ADS_NOMORE_COLUMNS, "got %#lx\n", hr); + ok(name == NULL, "got %p/%s\n", name, wine_dbgstr_w(name));
- if (0) /* crashes under XP */ - { hr = IDirectorySearch_GetColumn(ds, sh, NULL, &col); ok(hr == E_ADS_BAD_PARAMETER, "got %#lx\n", hr); - }
hr = IDirectorySearch_GetFirstRow(ds, sh); ok(hr == S_OK, "got %#lx\n", hr); @@ -467,8 +461,8 @@ static void test_DirectorySearch(void) memset(&col, 0x55, sizeof(col)); hr = IDirectorySearch_GetColumn(ds, sh, (WCHAR *)L"deadbeef", &col); ok(hr == E_ADS_COLUMN_NOT_SET, "got %#lx\n", hr); - ok(!col.pszAttrName || broken(col.pszAttrName != NULL) /* XP */, "got %p\n", col.pszAttrName); - ok(col.dwADsType == ADSTYPE_INVALID || broken(col.dwADsType != ADSTYPE_INVALID) /* XP */, "got %d\n", col.dwADsType); + ok(!col.pszAttrName, "got %p\n", col.pszAttrName); + ok(col.dwADsType == ADSTYPE_INVALID, "got %d\n", col.dwADsType); ok(!col.pADsValues, "got %p\n", col.pADsValues); ok(!col.dwNumValues, "got %lu\n", col.dwNumValues); ok(!col.hReserved, "got %p\n", col.hReserved); @@ -564,7 +558,7 @@ static void test_DirectoryObject(void) ok(pref[1].dwStatus == ADS_STATUS_S_OK, "got %d\n", pref[1].dwStatus);
hr = IDirectorySearch_ExecuteSearch(ds, (WCHAR *)L"(objectClass=*)", NULL, ~0, &sh); - ok(hr == HRESULT_FROM_WIN32(ERROR_DS_UNAVAILABLE_CRIT_EXTENSION) || broken(hr == S_OK) /* XP */, "got %#lx\n", hr); + todo_wine ok(hr == S_OK, "got %#lx\n", hr); if (hr == S_OK) { hr = IDirectorySearch_GetNextRow(ds, sh);