commit b6085d4: [Minor] Add erroring to smtp parse date
Vsevolod Stakhov
vsevolod at highsecure.ru
Tue Oct 6 14:49:07 UTC 2020
Author: Vsevolod Stakhov
Date: 2020-10-06 15:36:23 +0100
URL: https://github.com/rspamd/rspamd/commit/b6085d45f1a31b4bf19abf91d5926e1ef87d39ca
[Minor] Add erroring to smtp parse date
---
src/libmime/mime_headers.c | 2 +-
src/libmime/smtp_parsers.h | 2 +-
src/lua/lua_task.c | 22 +++++++++++++++-------
src/lua/lua_util.c | 26 ++++++++++++++++++--------
src/ragel/smtp_date_parser.rl | 8 +++++++-
5 files changed, 42 insertions(+), 18 deletions(-)
diff --git a/src/libmime/mime_headers.c b/src/libmime/mime_headers.c
index 34cafd8cb..bbf1dc31d 100644
--- a/src/libmime/mime_headers.c
+++ b/src/libmime/mime_headers.c
@@ -1655,7 +1655,7 @@ rspamd_smtp_received_parse (struct rspamd_task *task,
if (date_pos > 0 && date_pos < len) {
rh->timestamp = rspamd_parse_smtp_date (data + date_pos,
- len - date_pos);
+ len - date_pos, NULL);
}
return 0;
diff --git a/src/libmime/smtp_parsers.h b/src/libmime/smtp_parsers.h
index 3a52f1dd6..067d84424 100644
--- a/src/libmime/smtp_parsers.h
+++ b/src/libmime/smtp_parsers.h
@@ -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);
+guint64 rspamd_parse_smtp_date (const char *data, size_t len, GError **err);
#ifdef __cplusplus
}
diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c
index 21780cb9f..6a904352f 100644
--- a/src/lua/lua_task.c
+++ b/src/lua/lua_task.c
@@ -5042,19 +5042,27 @@ lua_task_get_date (lua_State *L)
if (h) {
time_t tt;
struct tm t;
+ GError *err = NULL;
- tt = rspamd_parse_smtp_date (h->decoded, strlen (h->decoded));
+ tt = rspamd_parse_smtp_date (h->decoded, strlen (h->decoded),
+ &err);
- if (!gmt) {
- rspamd_localtime (tt, &t);
+ if (err == NULL) {
+ if (!gmt) {
+ rspamd_localtime (tt, &t);
#if !defined(__sun)
- t.tm_gmtoff = 0;
+ t.tm_gmtoff = 0;
#endif
- t.tm_isdst = 0;
- tim = mktime (&t);
+ t.tm_isdst = 0;
+ tim = mktime (&t);
+ }
+ else {
+ tim = tt;
+ }
}
else {
- tim = tt;
+ g_error_free (err);
+ tim = 0.0;
}
}
else {
diff --git a/src/lua/lua_util.c b/src/lua/lua_util.c
index 5509fc435..1a2b52f80 100644
--- a/src/lua/lua_util.c
+++ b/src/lua/lua_util.c
@@ -3968,25 +3968,35 @@ lua_util_parse_smtp_date (lua_State *L)
{
gsize slen;
const gchar *str = lua_tolstring (L, 1, &slen);
+ GError *err = NULL;
if (str == NULL) {
return luaL_argerror (L, 1, "invalid argument");
}
- time_t tt = rspamd_parse_smtp_date (str, slen);
+ time_t tt = rspamd_parse_smtp_date (str, slen, &err);
- if (lua_isboolean (L, 2) && !!lua_toboolean (L, 2)) {
- struct tm t;
+ if (err == NULL) {
+ if (lua_isboolean (L, 2) && !!lua_toboolean (L, 2)) {
+ struct tm t;
- rspamd_localtime (tt, &t);
+ rspamd_localtime (tt, &t);
#if !defined(__sun)
- t.tm_gmtoff = 0;
+ t.tm_gmtoff = 0;
#endif
- t.tm_isdst = 0;
- tt = mktime (&t);
+ t.tm_isdst = 0;
+ tt = mktime (&t);
+ }
+
+ lua_pushnumber (L, tt);
}
+ else {
+ lua_pushnil (L);
+ lua_pushstring (L, err->message);
+ g_error_free (err);
- lua_pushnumber (L, tt);
+ return 2;
+ }
return 1;
}
diff --git a/src/ragel/smtp_date_parser.rl b/src/ragel/smtp_date_parser.rl
index f0d49c23a..48a1cbcbf 100644
--- a/src/ragel/smtp_date_parser.rl
+++ b/src/ragel/smtp_date_parser.rl
@@ -13,7 +13,7 @@
%% write data;
guint64
-rspamd_parse_smtp_date (const char *data, size_t len)
+rspamd_parse_smtp_date (const char *data, size_t len, GError **err)
{
const gchar *p = data, *pe = data + len, *eof = data + len, *tmp = data;
struct tm tm;
@@ -25,5 +25,11 @@ rspamd_parse_smtp_date (const char *data, size_t len)
%% write init;
%% write exec;
+ 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);
+ return (guint64)(-1);
+ }
+
return rspamd_tm_to_time (&tm, tz);
}
\ No newline at end of file
More information about the Commits
mailing list