Jacek Caban : webservices: Fix digit character checks.

Alexandre Julliard julliard at winehq.org
Fri Feb 7 15:41:09 CST 2020


Module: wine
Branch: master
Commit: 29848ee3fda5dc7b24c7072365bfdd860835f3f9
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=29848ee3fda5dc7b24c7072365bfdd860835f3f9

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Feb  7 15:07:03 2020 +0100

webservices: Fix digit character checks.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/webservices/url.c | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/dlls/webservices/url.c b/dlls/webservices/url.c
index 8bd3d82660..6f2ce9d6c9 100644
--- a/dlls/webservices/url.c
+++ b/dlls/webservices/url.c
@@ -87,11 +87,13 @@ static inline int url_decode_byte( char c1, char c2 )
 
     if (c1 >= '0' && c1 <= '9') ret = (c1 - '0') * 16;
     else if (c1 >= 'a' && c1 <= 'f') ret = (c1 - 'a' + 10) * 16;
-    else ret = (c1 - 'A' + 10) * 16;
+    else if (c1 >= 'A' && c1 <= 'F') ret = (c1 - 'A' + 10) * 16;
+    else return -1;
 
     if (c2 >= '0' && c2 <= '9') ret += c2 - '0';
     else if (c2 >= 'a' && c2 <= 'f') ret += c2 - 'a' + 10;
-    else ret += c2 - 'A' + 10;
+    else if (c2 >= 'A' && c2 <= 'F') ret += c2 - 'A' + 10;
+    else return -1;
 
     return ret;
 }
@@ -102,15 +104,16 @@ static WCHAR *url_decode( WCHAR *str, ULONG len, WS_HEAP *heap, ULONG *ret_len )
     BOOL decode = FALSE, convert = FALSE;
     ULONG i, len_utf8, len_left;
     unsigned char *utf8, *r;
+    int b;
 
     *ret_len = len;
     for (i = 0; i < len; i++, p++)
     {
         if ((len - i) < 3) break;
-        if (p[0] == '%' && iswxdigit( p[1] ) && iswxdigit( p[2] ))
+        if (p[0] == '%' && (b = url_decode_byte( p[1], p[2] )) != -1)
         {
             decode = TRUE;
-            if (url_decode_byte( p[1], p[2] ) > 159)
+            if (b > 159)
             {
                 convert = TRUE;
                 break;
@@ -125,9 +128,9 @@ static WCHAR *url_decode( WCHAR *str, ULONG len, WS_HEAP *heap, ULONG *ret_len )
         p = str;
         while (len)
         {
-            if (len >= 3 && p[0] == '%' && iswxdigit( p[1] ) && iswxdigit( p[2] ))
+            if (len >= 3 && p[0] == '%' && (b = url_decode_byte( p[1], p[2] )) != -1)
             {
-                *q++ = url_decode_byte( p[1], p[2] );
+                *q++ = b;
                 p += 3;
                 len -= 3;
             }
@@ -144,9 +147,9 @@ static WCHAR *url_decode( WCHAR *str, ULONG len, WS_HEAP *heap, ULONG *ret_len )
     len_left = len_utf8;
     while (len_left)
     {
-        if (len_left >= 3 && r[0] == '%' && isxdigit( r[1] ) && isxdigit( r[2] ))
+        if (len_left >= 3 && r[0] == '%' && (b = url_decode_byte( r[1], r[2] )) != -1)
         {
-            r[0] = url_decode_byte( r[1], r[2] );
+            r[0] = b;
             len_left -= 3;
             memmove( r + 1, r + 3, len_left );
             len_utf8 -= 2;
@@ -214,7 +217,7 @@ HRESULT WINAPI WsDecodeUrl( const WS_STRING *str, ULONG flags, WS_HEAP *heap, WS
     if (len && *q == ':')
     {
         p = ++q; len--;
-        while (len && iswdigit( *q ))
+        while (len && '0' <= *q && *q <= '9')
         {
             if ((port = port * 10 + *q - '0') > 65535) goto done;
             q++; len--;
@@ -481,7 +484,7 @@ HRESULT WINAPI WsEncodeUrl( const WS_URL *base, ULONG flags, WS_HEAP *heap, WS_S
     {
         q = url->portAsString.chars;
         len = url->portAsString.length;
-        while (len && iswdigit( *q ))
+        while (len && '0' <= *q && *q <= '9')
         {
             if ((port = port * 10 + *q - '0') > 65535)
             {




More information about the wine-cvs mailing list