[PATCH] ntdll: qsort: comparator must not get the same pointer
Marcus Meissner
marcus at jet.franken.de
Sun May 23 06:33:40 CDT 2010
Hi,
ioquake runs qsort and uses *a==*b as a error assertion
(for two duplicate entries). The mergesort algorithm
in use calls the comparator with the same pointer.
Ciao, Marcus
---
dlls/ntdll/misc.c | 5 +++++
dlls/ntdll/tests/string.c | 3 +++
2 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/dlls/ntdll/misc.c b/dlls/ntdll/misc.c
index eedef65..a78a3e4 100644
--- a/dlls/ntdll/misc.c
+++ b/dlls/ntdll/misc.c
@@ -272,6 +272,11 @@ NTDLL_mergesort( void *arr, void *barr, int elemsize, int(__cdecl *compar)(const
for (k=left; k<=right; k++) {
/*arr[k]=(barr[i]<barr[j])?barr[i++]:barr[j--];*/
+ if (i == j) {
+ memcpy(X(arr,k),X(barr,j),elemsize);
+ j--;
+ continue;
+ }
if (compar(X(barr,i),X(barr,j))<0) {
memcpy(X(arr,k),X(barr,i),elemsize);
i++;
diff --git a/dlls/ntdll/tests/string.c b/dlls/ntdll/tests/string.c
index cd362ed..3f7236a 100644
--- a/dlls/ntdll/tests/string.c
+++ b/dlls/ntdll/tests/string.c
@@ -1145,16 +1145,19 @@ static void test_wcsrchr(void)
static __cdecl int intcomparefunc(const void *a, const void*b)
{
+ ok (a != b, "must never get the same pointer\n");
return (*(int*)a) - (*(int*)b);
}
static __cdecl int charcomparefunc(const void *a, const void*b)
{
+ ok (a != b, "must never get the same pointer\n");
return (*(char*)a) - (*(char*)b);
}
static __cdecl int strcomparefunc(const void *a, const void*b)
{
+ ok (a != b, "must never get the same pointer\n");
return lstrcmpA(*(char**)a,*(char**)b);
}
--
1.6.4.2
More information about the wine-patches
mailing list