libbb: @ in "\x3@" is not a valid hex digit
authorDenys Vlasenko <vda.linux@googlemail.com>
Thu, 29 Nov 2018 11:34:50 +0000 (12:34 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 29 Nov 2018 11:34:50 +0000 (12:34 +0100)
function                                             old     new   delta
bb_process_escape_sequence                           134     141      +7

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
libbb/process_escape_sequence.c

index 59d0d3ea8ba5572e59f685ac6527b76bb2609385..11adbfceacf9d3e989e0d478cfb76248bec2b9f4 100644 (file)
@@ -41,8 +41,16 @@ char FAST_FUNC bb_process_escape_sequence(const char **ptr)
                unsigned d = (unsigned char)(*q) - '0';
 #else
                unsigned d = (unsigned char)_tolower(*q) - '0';
-               if (d >= 10)
-                       d += ('0' - 'a' + 10);
+               if (d >= 10) {
+                       //d += ('0' - 'a' + 10);
+                       /* The above would maps 'A'-'F' and 'a'-'f' to 10-15,
+                        * however, some chars like '@' would map to 9 < base.
+                        * Do not allow that, map invalid chars to N > base:
+                        */
+                       d += ('0' - 'a');
+                       if ((int)d >= 0)
+                               d += 10;
+               }
 #endif
                if (d >= base) {
                        if (WANT_HEX_ESCAPES && base == 16) {