]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Project] Css: Finish generic lexer cases
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 28 Jan 2021 15:47:23 +0000 (15:47 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 28 Jan 2021 15:47:23 +0000 (15:47 +0000)
src/libserver/css/css_tokeniser.cxx

index 534ae34265e32f4b8de6fd07b80ae3527abf135c..3d1749913d54191395ece0d8085b8b160a1361a0 100644 (file)
@@ -381,6 +381,8 @@ auto css_tokeniser::consume_number() -> struct css_parser_token
                        if (input[i] == '%') {
                                ret.flags |= css_parser_token::number_percent;
                                i ++;
+
+                               offset = i;
                        }
                        else if (is_plain_ident(input[i])) {
                                auto dim_token = consume_ident();
@@ -392,8 +394,16 @@ auto css_tokeniser::consume_number() -> struct css_parser_token
                                                                (int)sv.size(), sv.begin(), num);
                                        }
                                }
+                               else {
+                                       /* We have no option but to uncosume ident token in this case */
+                                       msg_debug_css("got invalid ident like token after number, unconsume it");
+                                       offset = i;
+                               }
                        }
                }
+               else {
+                       offset = i;
+               }
 
                return ret;
        }
@@ -677,6 +687,17 @@ auto css_tokeniser::next_token(void) -> struct css_parser_token
                        break;
                default:
                        /* Generic parsing code */
+
+                       if (g_ascii_isdigit(c)) {
+                               return consume_number();
+                       }
+                       else if (is_plain_ident(c)) {
+                               return consume_ident();
+                       }
+                       else {
+                               offset = i + 1;
+                               return make_token<css_parser_token::token_type::delim_token>(c);
+                       }
                        break;
                }