From 7146e5115197f6b04d2cfffa3dd575585b279f85 Mon Sep 17 00:00:00 2001 From: corinna Date: Fri, 1 Feb 2008 13:11:55 +0000 Subject: [PATCH] * miscfuncs.cc (cygwin_wcsncasecmp): Never access more than n characters. (cygwin_strncasecmp): Ditto. Fix for strings longer than n. --- winsup/cygwin/ChangeLog | 6 ++++++ winsup/cygwin/miscfuncs.cc | 40 ++++++++++++++++++++++------------------ 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index ea7b93f2a6..3720bab56b 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,11 @@ 2008-02-01 Corinna Vinschen + * miscfuncs.cc (cygwin_wcsncasecmp): Never access more than n + characters. + (cygwin_strncasecmp): Ditto. Fix for strings longer than n. + +2008-02-01 Corinna Vinschen + * string.h: Re-enable inline strcasematch and strncasematch implementations and rename to ascii_strcasematch/ascii_strncasematch. * dcrt0.cc: Replace str[n]casematch with ascii_str[n]casematch where diff --git a/winsup/cygwin/miscfuncs.cc b/winsup/cygwin/miscfuncs.cc index c6328cb189..0ec0b4873d 100644 --- a/winsup/cygwin/miscfuncs.cc +++ b/winsup/cygwin/miscfuncs.cc @@ -17,6 +17,8 @@ details. */ #include #include #include +#include +#include #include "cygthread.h" #include "cygtls.h" #include "ntdll.h" @@ -94,14 +96,14 @@ extern "C" int __stdcall cygwin_wcsncasecmp (const wchar_t *ws, const wchar_t *wt, size_t n) { UNICODE_STRING us, ut; - - n *= sizeof (WCHAR); - RtlInitUnicodeString (&us, ws); - if (us.Length > n) - us.Length = n; - RtlInitUnicodeString (&ut, wt); - if (ut.Length > n) - ut.Length = n; + size_t ls = 0, lt = 0; + + while (ws[ls] && ls < n) + ++ls; + RtlInitCountedUnicodeString (&us, ws, ls * sizeof (WCHAR)); + while (wt[lt] && lt < n) + ++lt; + RtlInitCountedUnicodeString (&ut, wt, lt * sizeof (WCHAR)); return RtlCompareUnicodeString (&us, &ut, TRUE); } @@ -125,18 +127,20 @@ cygwin_strncasecmp (const char *cs, const char *ct, size_t n) { UNICODE_STRING us, ut; ULONG len; - - n *= sizeof (WCHAR); - len = (strlen (cs) + 1) * sizeof (WCHAR); + size_t ls = 0, lt = 0; + + while (cs[ls] && ls < n) + ++ls; + len = ls * sizeof (WCHAR); RtlInitEmptyUnicodeString (&us, (PWCHAR) alloca (len), len); - us.Length = sys_mbstowcs (us.Buffer, cs, us.MaximumLength) * sizeof (WCHAR); - if (us.Length > n) - us.Length = n; - len = (strlen (ct) + 1) * sizeof (WCHAR); + us.Length = MultiByteToWideChar (get_cp (), 0, cs, ls, us.Buffer, + us.MaximumLength) * sizeof (WCHAR); + while (ct[lt] && lt < n) + ++lt; + len = lt * sizeof (WCHAR); RtlInitEmptyUnicodeString (&ut, (PWCHAR) alloca (len), len); - ut.Length = sys_mbstowcs (ut.Buffer, ct, ut.MaximumLength) * sizeof (WCHAR); - if (ut.Length > n) - ut.Length = n; + ut.Length = MultiByteToWideChar (get_cp (), 0, ct, lt, ut.Buffer, + ut.MaximumLength) * sizeof (WCHAR); return RtlCompareUnicodeString (&us, &ut, TRUE); } -- 2.11.0