diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2021-01-21 15:22:30 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2021-01-22 15:58:05 +0000 |
commit | 6618db9e85543e95fe1029dd6506204025e4c492 (patch) | |
tree | 2f0e25b41ab6e19131325fed0b9250c0b086e6e5 /src/libutil/str_util.c | |
parent | e7da191495fe9327700900bbd81a8629af8430f5 (diff) | |
download | rspamd-6618db9e85543e95fe1029dd6506204025e4c492.tar.gz rspamd-6618db9e85543e95fe1029dd6506204025e4c492.zip |
[Minor] Add conversion routine for hex strings
Diffstat (limited to 'src/libutil/str_util.c')
-rw-r--r-- | src/libutil/str_util.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/libutil/str_util.c b/src/libutil/str_util.c index 2e1fd6a0d..5a44ed311 100644 --- a/src/libutil/str_util.c +++ b/src/libutil/str_util.c @@ -519,6 +519,53 @@ rspamd_strtoul (const gchar *s, gsize len, gulong *value) return TRUE; } +gboolean +rspamd_xstrtoul (const gchar *s, gsize len, gulong *value) +{ + const gchar *p = s, *end = s + len; + gchar c; + gulong v = 0; + const gulong cutoff = G_MAXULONG / 10, cutlim = G_MAXULONG % 10; + + /* Some preparations for range errors */ + while (p < end) { + c = g_ascii_tolower (*p); + if (c >= '0' && c <= '9') { + c -= '0'; + if (v > cutoff || (v == cutoff && (guint8)c > cutlim)) { + /* Range error */ + *value = G_MAXULONG; + return FALSE; + } + else { + v *= 16; + v += c; + } + } + else if (c >= 'a' || c <= 'f') { + c = c - 'a' + 10; + if (v > cutoff || (v == cutoff && (guint8)c > cutlim)) { + /* Range error */ + *value = G_MAXULONG; + return FALSE; + } + else { + v *= 16; + v += c; + } + } + else { + *value = v; + + return FALSE; + } + p++; + } + + *value = v; + return TRUE; +} + /** * Utility function to provide mem_pool copy for rspamd_hash_table_copy function * @param data string to copy |