]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Fix several issues with the HTTP keepalive parsing
authorVsevolod Stakhov <vsevolod@rspamd.com>
Sat, 9 Jul 2022 19:44:57 +0000 (20:44 +0100)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Sat, 9 Jul 2022 19:44:57 +0000 (20:44 +0100)
src/libserver/http/http_context.c

index 81e22bb52329fe6c6d2a36f14b3a7d7561f2bce9..4366e20ba18d2723cf6b63b6b2b9ced9aeb6c19c 100644 (file)
@@ -578,25 +578,24 @@ rspamd_http_parse_keepalive_timeout (const rspamd_ftok_t *tok)
 {
        long timeout = -1;
        goffset pos = rspamd_substring_search (tok->begin,
-                       tok->len, "timeout=", sizeof ("timeout=") - 1);
+                       tok->len, "timeout", sizeof ("timeout") - 1);
 
        if (pos != -1) {
-               pos += sizeof ("timeout=") - 1;
+               pos += sizeof ("timeout") - 1;
 
-               gchar *end_pos = memchr (tok->begin + pos, ',', tok->len - pos);
-               glong real_timeout;
-
-               if (end_pos) {
-                       if (rspamd_strtol (tok->begin + pos + 1,
-                                       (end_pos - tok->begin) - pos - 1, &real_timeout) &&
-                               real_timeout > 0) {
-                               timeout = real_timeout;
-                               msg_debug_http_context ("got timeout attr %.2f", timeout);
+               /* Skip spaces and equal sign */
+               while (pos < tok->len) {
+                       if (tok->begin[pos] != '=' && !g_ascii_isspace(tok->begin[pos])) {
+                               break;
                        }
+                       pos ++;
                }
-               else {
-                       if (rspamd_strtol (tok->begin + pos + 1,
-                                       tok->len - pos, &real_timeout) && real_timeout > 0) {
+
+               gsize ndigits = rspamd_memspn(tok->begin + pos, "0123456789", tok->len - pos);
+               glong real_timeout;
+
+               if (ndigits > 0) {
+                       if (rspamd_strtoul(tok->begin + pos,ndigits, &real_timeout)) {
                                timeout = real_timeout;
                                msg_debug_http_context ("got timeout attr %.2f", timeout);
                        }