summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2008-02-01 13:11:57 +0000
committerCorinna Vinschen <corinna@vinschen.de>2008-02-01 13:11:57 +0000
commit301d14d242268597570d4b38a84c426e7f3baf5b (patch)
treed64a3b29ee5ee90741ce07d4844ee707fedd27fd
parentc69d873f31440e6887288d38a9d009451874efd8 (diff)
downloadcygnal-301d14d242268597570d4b38a84c426e7f3baf5b.tar.gz
cygnal-301d14d242268597570d4b38a84c426e7f3baf5b.tar.bz2
cygnal-301d14d242268597570d4b38a84c426e7f3baf5b.zip
* miscfuncs.cc (cygwin_wcsncasecmp): Never access more than n
characters. (cygwin_strncasecmp): Ditto. Fix for strings longer than n.
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/miscfuncs.cc40
2 files changed, 28 insertions, 18 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index ea7b93f2a..3720bab56 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,11 @@
2008-02-01 Corinna Vinschen <corinna@vinschen.de>
+ * miscfuncs.cc (cygwin_wcsncasecmp): Never access more than n
+ characters.
+ (cygwin_strncasecmp): Ditto. Fix for strings longer than n.
+
+2008-02-01 Corinna Vinschen <corinna@vinschen.de>
+
* 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 c6328cb18..0ec0b4873 100644
--- a/winsup/cygwin/miscfuncs.cc
+++ b/winsup/cygwin/miscfuncs.cc
@@ -17,6 +17,8 @@ details. */
#include <alloca.h>
#include <limits.h>
#include <wchar.h>
+#include <winbase.h>
+#include <winnls.h>
#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);
}