commit f0cbfec: [Minor] Lowercase CSS

Vsevolod Stakhov vsevolod at highsecure.ru
Mon Mar 29 14:21:06 UTC 2021


Author: Vsevolod Stakhov
Date: 2021-03-29 14:16:06 +0100
URL: https://github.com/rspamd/rspamd/commit/f0cbfec0eed63d3ad36868835e93973efd383012

[Minor] Lowercase CSS

---
 src/libserver/css/css_parser.cxx | 25 +++++++++++++++++++++----
 src/libserver/css/css_util.cxx   | 16 ++++++++--------
 src/libutil/mem_pool.h           | 29 +++++++++++++++--------------
 3 files changed, 44 insertions(+), 26 deletions(-)

diff --git a/src/libserver/css/css_parser.cxx b/src/libserver/css/css_parser.cxx
index f80386fc2..d828ffa46 100644
--- a/src/libserver/css/css_parser.cxx
+++ b/src/libserver/css/css_parser.cxx
@@ -18,6 +18,7 @@
 #include "css_tokeniser.hxx"
 #include "css_selector.hxx"
 #include "css_rule.hxx"
+#include "css_util.hxx"
 #include "css.hxx"
 #include "fmt/core.h"
 
@@ -159,6 +160,9 @@ public:
 		return tl::make_unexpected(error);
 	}
 
+	/* Helper parser methods */
+	bool need_unescape(const std::string_view &sv);
+
 private:
 	std::unique_ptr<css_style_sheet> style_object;
 	std::unique_ptr<css_tokeniser> tokeniser;
@@ -170,9 +174,6 @@ private:
 	const int max_rec = 20;
 	bool eof = false;
 
-	/* Helper parser methods */
-	bool need_unescape(const std::string_view &sv);
-
 	/* Consumers */
 	auto component_value_consumer(std::unique_ptr<css_consumed_block> &top) -> bool;
 	auto function_consumer(std::unique_ptr<css_consumed_block> &top) -> bool;
@@ -684,8 +685,24 @@ auto parse_css(rspamd_mempool_t *pool, const std::string_view &st) ->
 		tl::expected<std::unique_ptr<css_style_sheet>, css_parse_error>
 {
 	css_parser parser(pool);
+	std::string_view processed_input;
+
+	if (parser.need_unescape(st)) {
+		processed_input = rspamd::css::unescape_css(pool, st);
+	}
+	else {
+		/* Lowercase inplace */
+		auto *nspace = reinterpret_cast<char *>(rspamd_mempool_alloc(pool, st.length()));
+		auto *p = nspace;
+
+		for (const auto c : st) {
+			*p++ = g_ascii_tolower(c);
+		}
+
+		processed_input = std::string_view{nspace, (std::size_t)(p - nspace)};
+	}
 
-	if (parser.consume_input(st)) {
+	if (parser.consume_input(processed_input)) {
 		return parser.get_object_maybe();
 	}
 
diff --git a/src/libserver/css/css_util.cxx b/src/libserver/css/css_util.cxx
index 7388e49fd..7add8043c 100644
--- a/src/libserver/css/css_util.cxx
+++ b/src/libserver/css/css_util.cxx
@@ -23,7 +23,7 @@ namespace rspamd::css {
 std::string_view unescape_css(rspamd_mempool_t *pool,
 							  const std::string_view &sv)
 {
-	auto *nspace = reinterpret_cast<char *>(rspamd_mempool_alloc(pool, sv.length ()));
+	auto *nspace = reinterpret_cast<char *>(rspamd_mempool_alloc(pool, sv.length()));
 	auto *d = nspace;
 	auto nleft = sv.length ();
 
@@ -38,20 +38,20 @@ std::string_view unescape_css(rspamd_mempool_t *pool,
 	auto escape_offset = 0, i = 0;
 
 #define MAYBE_CONSUME_CHAR(c) do { \
-    if (c == '"' || c == '\'') { \
+    if ((c) == '"' || (c) == '\'') { \
         state = quoted; \
-        quote_char = c; \
+        quote_char = (c); \
         nleft--; \
-        *d++ = c; \
+        *d++ = (c); \
     } \
-    else if (c == '\\') { \
+    else if ((c) == '\\') { \
         escape_offset = i; \
         state = escape; \
     } \
     else { \
         state = normal; \
         nleft--; \
-        *d++ = c; \
+        *d++ = g_ascii_tolower(c); \
     } \
 } while (0)
 
@@ -89,14 +89,14 @@ std::string_view unescape_css(rspamd_mempool_t *pool,
 					else {
 						if (val < 0x80) {
 							/* Trivial case: ascii character */
-							*d++ = (unsigned char)val;
+							*d++ = (unsigned char)g_ascii_tolower(val);
 							nleft --;
 						}
 						else {
 							UChar32 uc = val;
 							auto off = 0;
 							UTF8_APPEND_CHAR_SAFE((uint8_t *) d, off,
-									sv.length (), uc);
+									sv.length (), u_tolower(uc));
 							d += off;
 							nleft -= off;
 						}
diff --git a/src/libutil/mem_pool.h b/src/libutil/mem_pool.h
index 1554edbd2..a908af1ee 100644
--- a/src/libutil/mem_pool.h
+++ b/src/libutil/mem_pool.h
@@ -150,9 +150,9 @@ rspamd_mempool_t *rspamd_mempool_new_ (gsize size, const gchar *tag, gint flags,
  * @return pointer to allocated object
  */
 void *rspamd_mempool_alloc_ (rspamd_mempool_t *pool, gsize size, const gchar *loc)
-RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL;
+	RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL;
 #define rspamd_mempool_alloc(pool, size) \
-	rspamd_mempool_alloc_((pool), (size), G_STRLOC)
+	rspamd_mempool_alloc_((pool), (size), (G_STRLOC))
 
 /**
  * Notify external memory usage for memory pool
@@ -162,7 +162,7 @@ RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR
  */
 void rspamd_mempool_notify_alloc_ (rspamd_mempool_t *pool, gsize size, const gchar *loc);
 #define rspamd_mempool_notify_alloc(pool, size) \
-	rspamd_mempool_notify_alloc_((pool), (size), G_STRLOC)
+	rspamd_mempool_notify_alloc_((pool), (size), (G_STRLOC))
 
 /**
  * Get memory and set it to zero
@@ -171,9 +171,9 @@ void rspamd_mempool_notify_alloc_ (rspamd_mempool_t *pool, gsize size, const gch
  * @return pointer to allocated object
  */
 void *rspamd_mempool_alloc0_ (rspamd_mempool_t *pool, gsize size, const gchar *loc)
-RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL;
+	RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL;
 #define rspamd_mempool_alloc0(pool, size) \
-	rspamd_mempool_alloc0_((pool), (size), G_STRLOC)
+	rspamd_mempool_alloc0_((pool), (size), (G_STRLOC))
 
 /**
  * Make a copy of string in pool
@@ -182,9 +182,9 @@ RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR
  * @return pointer to newly created string that is copy of src
  */
 gchar *rspamd_mempool_strdup_ (rspamd_mempool_t *pool, const gchar *src, const gchar *loc)
-RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT);
+	RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT);
 #define rspamd_mempool_strdup(pool, src) \
-	rspamd_mempool_strdup_ ((pool), (src), G_STRLOC)
+	rspamd_mempool_strdup_ ((pool), (src), (G_STRLOC))
 
 /**
  * Make a copy of fixed string in pool as null terminated string
@@ -212,7 +212,7 @@ gchar *rspamd_mempool_ftokdup_ (rspamd_mempool_t *pool,
 								const gchar *loc)
 RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT);
 #define rspamd_mempool_ftokdup(pool, src) \
-	rspamd_mempool_ftokdup_ ((pool), (src), G_STRLOC)
+	rspamd_mempool_ftokdup_ ((pool), (src), (G_STRLOC))
 
 /**
  * Allocate piece of shared memory
@@ -220,14 +220,14 @@ RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT);
  * @param size bytes to allocate
  */
 void *rspamd_mempool_alloc_shared_ (rspamd_mempool_t *pool, gsize size, const gchar *loc)
-RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL;
+	RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL;
 #define rspamd_mempool_alloc_shared(pool, size) \
-	rspamd_mempool_alloc_shared_((pool), (size), G_STRLOC)
+	rspamd_mempool_alloc_shared_((pool), (size), (G_STRLOC))
 
 void *rspamd_mempool_alloc0_shared_ (rspamd_mempool_t *pool, gsize size, const gchar *loc)
-RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL;
+	RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL;
 #define rspamd_mempool_alloc0_shared(pool, size) \
-	rspamd_mempool_alloc0_shared_((pool), (size), G_STRLOC)
+	rspamd_mempool_alloc0_shared_((pool), (size), (G_STRLOC))
 
 /**
  * Add destructor callback to pool
@@ -243,7 +243,7 @@ void rspamd_mempool_add_destructor_full (rspamd_mempool_t *pool,
 
 /* Macros for common usage */
 #define rspamd_mempool_add_destructor(pool, func, data) \
-    rspamd_mempool_add_destructor_full (pool, func, data, G_STRFUNC, G_STRLOC)
+    rspamd_mempool_add_destructor_full (pool, func, data, (G_STRFUNC), (G_STRLOC))
 
 /**
  * Replace destructor callback to pool for specified pointer
@@ -253,7 +253,8 @@ void rspamd_mempool_add_destructor_full (rspamd_mempool_t *pool,
  * @param new_data pointer to data that would be passed to destructor
  */
 void rspamd_mempool_replace_destructor (rspamd_mempool_t *pool,
-										rspamd_mempool_destruct_t func, void *old_data, void *new_data);
+										rspamd_mempool_destruct_t func,
+										void *old_data, void *new_data);
 
 /**
  * Calls all destructors associated with the specific memory pool without removing


More information about the Commits mailing list