return 1;
}
+static gboolean
+rspamd_url_is_ip (struct rspamd_url *uri, rspamd_mempool_t *pool)
+{
+ const gchar *p, *end;
+ gchar buf[INET6_ADDRSTRLEN + 1];
+ struct in_addr in4;
+ struct in6_addr in6;
+ gboolean ret = FALSE;
+
+ p = uri->host;
+ end = p + uri->hostlen;
+
+ if (*p == '[' && *(end - 1) == ']') {
+ p ++;
+ end --;
+ }
+
+ if (end - p > (gint)sizeof (buf) - 1) {
+ return FALSE;
+ }
+
+ rspamd_strlcpy (buf, p, end - p + 1);
+
+ if (inet_pton (AF_INET, buf, &in4) == 1) {
+ uri->host = rspamd_mempool_alloc (pool, INET_ADDRSTRLEN + 1);
+ memset (uri->host, 0, INET_ADDRSTRLEN + 1);
+ inet_ntop (AF_INET, &in4, uri->host, INET_ADDRSTRLEN);
+ uri->hostlen = strlen (uri->host);
+ uri->tld = uri->host;
+ uri->tldlen = uri->hostlen;
+ uri->is_numeric = TRUE;
+ ret = TRUE;
+ }
+ else if (inet_pton (AF_INET6, buf, &in6) == 1) {
+ uri->host = rspamd_mempool_alloc (pool, INET6_ADDRSTRLEN + 1);
+ memset (uri->host, 0, INET6_ADDRSTRLEN + 1);
+ inet_ntop (AF_INET6, &in6, uri->host, INET6_ADDRSTRLEN);
+ uri->hostlen = strlen (uri->host);
+ uri->tld = uri->host;
+ uri->tldlen = uri->hostlen;
+ uri->is_numeric = TRUE;
+ ret = TRUE;
+ }
+
+ return ret;
+}
+
enum uri_errno
rspamd_url_parse (struct rspamd_url *uri, gchar *uristring, gsize len,
rspamd_mempool_t *pool)
if (acism_lookup (url_scanner->search_trie, uri->host, uri->hostlen,
rspamd_tld_trie_callback, uri, &state, true) == 0) {
/* Ignore URL's without TLD if it is not a numeric URL */
- for (i = 0; i < uri->hostlen; i ++) {
- t = uri->host[i];
-
- if (g_ascii_isalpha (t)) {
- return URI_ERRNO_BAD_FORMAT;
- }
+ if (!rspamd_url_is_ip (uri, pool)) {
+ return URI_ERRNO_BAD_FORMAT;
}
}