]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
libsmb: Use hex_byte() in urldecode_talloc()
authorVolker Lendecke <vl@samba.org>
Mon, 4 Jan 2021 13:16:32 +0000 (14:16 +0100)
committerJeremy Allison <jra@samba.org>
Fri, 8 Jan 2021 20:31:33 +0000 (20:31 +0000)
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/libsmb/libsmb_path.c

index bcbdae325c4e602b062884cacec85a38256b1e29..73dc374d6a87ecf0df2f9b0f843febbd1d366862 100644 (file)
 #include "libsmb_internal.h"
 
 
-/* Used by urldecode_talloc() */
-static int
-hex2int( unsigned int _char )
-{
-        if ( _char >= 'A' && _char <='F')
-                return _char - 'A' + 10;
-        if ( _char >= 'a' && _char <='f')
-                return _char - 'a' + 10;
-        if ( _char >= '0' && _char <='9')
-                return _char - '0';
-        return -1;
-}
-
 /*
  * smbc_urldecode()
  * and urldecode_talloc() (internal fn.)
@@ -70,13 +57,10 @@ urldecode_talloc(TALLOC_CTX *ctx, char **pp_dest, const char *src)
                unsigned char character = src[i++];
 
                if (character == '%') {
-                       int a = i+1 < old_length ? hex2int(src[i]) : -1;
-                       int b = i+1 < old_length ? hex2int(src[i+1]) : -1;
-
-                       /* Replace valid sequence */
-                       if (a != -1 && b != -1) {
-                               /* Replace valid %xx sequence with %dd */
-                               character = (a * 16) + b;
+                       uint8_t v;
+                       bool ok = hex_byte(&src[i], &v);
+                       if (ok) {
+                               character = v;
                                if (character == '\0') {
                                        break; /* Stop at %00 */
                                }
@@ -98,20 +82,17 @@ urldecode_talloc(TALLOC_CTX *ctx, char **pp_dest, const char *src)
                 unsigned char character = src[i++];
 
                 if (character == '%') {
-                        int a = i+1 < old_length ? hex2int(src[i]) : -1;
-                        int b = i+1 < old_length ? hex2int(src[i+1]) : -1;
-
-                        /* Replace valid sequence */
-                        if (a != -1 && b != -1) {
-                                /* Replace valid %xx sequence with %dd */
-                                character = (a * 16) + b;
-                                if (character == '\0') {
-                                        break; /* Stop at %00 */
-                                }
-                                i += 2;
-                        } else {
-                                err_count++;
-                        }
+                       uint8_t v;
+                       bool ok = hex_byte(&src[i], &v);
+                       if (ok) {
+                               character = v;
+                               if (character == '\0') {
+                                       break; /* Stop at %00 */
+                               }
+                               i += 2;
+                       } else {
+                               err_count++;
+                       }
                 }
                 *p++ = character;
         }