]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Add some more error cases to the smtp date parsing
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 6 Oct 2020 14:42:21 +0000 (15:42 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 6 Oct 2020 14:42:21 +0000 (15:42 +0100)
src/libmime/smtp_parsers.h
src/ragel/smtp_date.rl
src/ragel/smtp_date_parser.rl

index 067d84424ad9518cffbfce122c339ebafc49bac2..7eff6bf713730bebcb3e308e00d7b87f91c7039d 100644 (file)
@@ -46,7 +46,7 @@ rspamd_rfc2047_parser (const gchar *in, gsize len, gint *pencoding,
 rspamd_inet_addr_t *rspamd_parse_smtp_ip (const char *data, size_t len,
                                                                                  rspamd_mempool_t *pool);
 
-guint64 rspamd_parse_smtp_date (const char *data, size_t len, GError **err);
+guint64 rspamd_parse_smtp_date (const unsigned char *data, size_t len, GError **err);
 
 #ifdef  __cplusplus
 }
index e873e44dea12520360792dd706081374f1d776c1..df21cb3f35ef1d2976e47b22297749e5c42e9ee0 100644 (file)
@@ -15,6 +15,9 @@
         if (n > 0 && n <= 31) {
           tm.tm_mday = n;
         }
+        else {
+          fbreak;
+        }
       }
     }
   }
         if (n < 24) {
           tm.tm_hour = n;
         }
+        else {
+          fbreak;
+        }
       }
     }
+    else {
+      fbreak;
+    }
   }
   action Minute_Start {
     tmp = p;
         if (n < 60) {
           tm.tm_min = n;
         }
+        else {
+          fbreak;
+        }
       }
     }
+    else {
+      fbreak;
+    }
   }
   action Second_Start {
     tmp = p;
         if (n <= 60) { /* Leap second */
           tm.tm_sec = n;
         }
+        else {
+          fbreak;
+        }
       }
     }
+    else {
+      fbreak;
+    }
   }
   action TZ_Sign {
     tmp = p;
index 48a1cbcbfc1aa78a99ae061354e0c8d8f2f6ea6e..d53e61148e0fb98c43d466b770cbc81b740b43b5 100644 (file)
@@ -1,6 +1,7 @@
 %%{
 
   machine smtp_date_parser;
+  alphtype unsigned char;
   include smtp_base "smtp_base.rl";
   include smtp_date "smtp_date.rl";
 
@@ -13,9 +14,9 @@
 %% write data;
 
 guint64
-rspamd_parse_smtp_date (const char *data, size_t len, GError **err)
+rspamd_parse_smtp_date (const unsigned char *data, size_t len, GError **err)
 {
-  const gchar *p = data, *pe = data + len, *eof = data + len, *tmp = data;
+  const unsigned char *p = data, *pe = data + len, *eof = data + len, *tmp = data;
   struct tm tm;
   glong tz = 0;
   gint cs = 0;
@@ -27,7 +28,7 @@ rspamd_parse_smtp_date (const char *data, size_t len, GError **err)
 
   if ( cs < %%{ write first_final; }%% ) {
     g_set_error (err, g_quark_from_static_string ("smtp_date"), cs, "invalid date at offset %d (%c), state %d",
-        p - data, *p, cs);
+                       (int)(p - data), (*p > 0 && *p < 128) ? *p : '?', cs);
     return (guint64)(-1);
   }