Jacek Caban : quartz: Fix hex digit checks in process_pattern_string.
Alexandre Julliard
julliard at winehq.org
Thu Feb 6 15:44:17 CST 2020
Module: wine
Branch: master
Commit: bf95bccfafd7ea8faf5acf414a4806cbd001358f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=bf95bccfafd7ea8faf5acf414a4806cbd001358f
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Feb 6 14:00:29 2020 +0100
quartz: Fix hex digit checks in process_pattern_string.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/quartz/filesource.c | 46 ++++++++++++++--------------------------------
1 file changed, 14 insertions(+), 32 deletions(-)
diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c
index 4855f9834c..11cc438be2 100644
--- a/dlls/quartz/filesource.c
+++ b/dlls/quartz/filesource.c
@@ -87,37 +87,19 @@ static inline AsyncReader *impl_from_IFileSourceFilter(IFileSourceFilter *iface)
static const IFileSourceFilterVtbl FileSource_Vtbl;
static const IAsyncReaderVtbl FileAsyncReader_Vtbl;
-static unsigned char byte_from_hex_char(WCHAR wHex)
+static int byte_from_hex_char(WCHAR c)
{
- switch (towlower(wHex))
- {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- return (wHex - '0') & 0xf;
- case 'a':
- case 'b':
- case 'c':
- case 'd':
- case 'e':
- case 'f':
- return (wHex - 'a' + 10) & 0xf;
- default:
- return 0;
- }
+ if ('0' <= c && c <= '9') return c - '0';
+ if ('a' <= c && c <= 'f') return c - 'a' + 10;
+ if ('A' <= c && c <= 'F') return c - 'A' + 10;
+ return -1;
}
static BOOL process_pattern_string(const WCHAR *pattern, HANDLE file)
{
ULONG size, offset, i, ret_size;
BYTE *mask, *expect, *actual;
+ int d;
BOOL ret = TRUE;
/* format: "offset, size, mask, value" */
@@ -140,15 +122,15 @@ static BOOL process_pattern_string(const WCHAR *pattern, HANDLE file)
return FALSE;
}
pattern++;
- while (!iswxdigit(*pattern) && (*pattern != ','))
+ while (byte_from_hex_char(*pattern) == -1 && (*pattern != ','))
pattern++;
- for (i = 0; iswxdigit(*pattern) && (i/2 < size); pattern++, i++)
+ for (i = 0; (d = byte_from_hex_char(*pattern)) != -1 && (i/2 < size); pattern++, i++)
{
if (i % 2)
- mask[i / 2] |= byte_from_hex_char(*pattern);
+ mask[i / 2] |= d;
else
- mask[i / 2] = byte_from_hex_char(*pattern) << 4;
+ mask[i / 2] = d << 4;
}
if (!(pattern = wcschr(pattern, ',')))
@@ -158,15 +140,15 @@ static BOOL process_pattern_string(const WCHAR *pattern, HANDLE file)
return FALSE;
}
pattern++;
- while (!iswxdigit(*pattern) && (*pattern != ','))
+ while (byte_from_hex_char(*pattern) == -1 && (*pattern != ','))
pattern++;
- for (i = 0; iswxdigit(*pattern) && (i/2 < size); pattern++, i++)
+ for (i = 0; (d = byte_from_hex_char(*pattern)) != -1 && (i/2 < size); pattern++, i++)
{
if (i % 2)
- expect[i / 2] |= byte_from_hex_char(*pattern);
+ expect[i / 2] |= d;
else
- expect[i / 2] = byte_from_hex_char(*pattern) << 4;
+ expect[i / 2] = d << 4;
}
actual = heap_alloc(size);
More information about the wine-cvs
mailing list