From 5c026b66583e20f4f1455f7f0da773f64c26992d Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 19 Feb 2014 18:41:19 +0000 Subject: [PATCH] Fix PTR requests handling. --- src/lua/lua_dns.c | 27 +++++++++++++-------------- src/rdns | 2 +- src/smtp_proxy.c | 7 ++++++- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/lua/lua_dns.c b/src/lua/lua_dns.c index b3d8f768f..c53688ef5 100644 --- a/src/lua/lua_dns.c +++ b/src/lua/lua_dns.c @@ -178,7 +178,6 @@ lua_dns_resolver_resolve_common (lua_State *L, struct rspamd_dns_resolver *resol struct rspamd_async_session *session, **psession; memory_pool_t *pool, **ppool; const gchar *to_resolve; - struct in_addr ina; struct lua_dns_cbdata *cbdata; /* Check arguments */ @@ -191,17 +190,23 @@ lua_dns_resolver_resolve_common (lua_State *L, struct rspamd_dns_resolver *resol to_resolve = luaL_checkstring (L, 4); if (pool != NULL && session != NULL && to_resolve != NULL && lua_isfunction (L, 5)) { - if (type == DNS_REQUEST_PTR) { - if (inet_aton (to_resolve, &ina) == 0) { + cbdata = memory_pool_alloc (pool, sizeof (struct lua_dns_cbdata)); + cbdata->L = L; + cbdata->resolver = resolver; + if (type != DNS_REQUEST_PTR) { + cbdata->to_resolve = memory_pool_strdup (pool, to_resolve); + } + else { + char *ptr_str; + ptr_str = rdns_generate_ptr_from_str (to_resolve); + if (ptr_str == NULL) { msg_err ("wrong resolve string to PTR request: %s", to_resolve); lua_pushnil (L); return 1; } + cbdata->to_resolve = memory_pool_strdup (pool, ptr_str); + free (ptr_str); } - cbdata = memory_pool_alloc (pool, sizeof (struct lua_dns_cbdata)); - cbdata->L = L; - cbdata->resolver = resolver; - cbdata->to_resolve = memory_pool_strdup (pool, to_resolve); lua_pushvalue (L, 5); cbdata->cbref = luaL_ref (L, LUA_REGISTRYINDEX); @@ -211,13 +216,7 @@ lua_dns_resolver_resolve_common (lua_State *L, struct rspamd_dns_resolver *resol else { cbdata->user_str = NULL; } - - if (type == DNS_REQUEST_PTR) { - make_dns_request (resolver, session, pool, lua_dns_callback, cbdata, type, &ina); - } - else { - make_dns_request (resolver, session, pool, lua_dns_callback, cbdata, type, to_resolve); - } + make_dns_request (resolver, session, pool, lua_dns_callback, cbdata, type, to_resolve); lua_pushboolean (L, TRUE); } else { diff --git a/src/rdns b/src/rdns index 4a9991016..cddc17d60 160000 --- a/src/rdns +++ b/src/rdns @@ -1 +1 @@ -Subproject commit 4a9991016a7f820620817f9d3359810fd02ec5ea +Subproject commit cddc17d60ccf3516516e73f4e5cab151277fafbb diff --git a/src/smtp_proxy.c b/src/smtp_proxy.c index c75cb530d..24d78ef4f 100644 --- a/src/smtp_proxy.c +++ b/src/smtp_proxy.c @@ -108,6 +108,7 @@ struct smtp_proxy_session { enum rspamd_smtp_proxy_state state; struct rspamd_worker *worker; struct in_addr client_addr; + gchar *ptr_str; gchar *hostname; gchar *error; gchar *temp_name; @@ -233,6 +234,9 @@ free_smtp_proxy_session (gpointer arg) if (session->proxy) { rspamd_proxy_close (session->proxy); } + if (session->ptr_str) { + free (session->ptr_str); + } if (session->upstream_sock != -1) { event_del (&session->upstream_ev); close (session->upstream_sock); @@ -930,6 +934,7 @@ accept_socket (gint fd, short what, void *arg) session->resolver = ctx->resolver; session->ev_base = ctx->ev_base; session->upstream_sock = -1; + session->ptr_str = rdns_generate_ptr_from_str (inet_ntoa (su.s4.sin_addr)); worker->srv->stat->connections_count++; /* Resolve client's addr */ @@ -937,7 +942,7 @@ accept_socket (gint fd, short what, void *arg) session->s = new_async_session (session->pool, NULL, NULL, free_smtp_proxy_session, session); session->state = SMTP_PROXY_STATE_RESOLVE_REVERSE; if (! make_dns_request (session->resolver, session->s, session->pool, - smtp_dns_cb, session, DNS_REQUEST_PTR, &session->client_addr)) { + smtp_dns_cb, session, DNS_REQUEST_PTR, session->ptr_str)) { msg_err ("cannot resolve %s", inet_ntoa (session->client_addr)); g_slice_free1 (sizeof (struct smtp_proxy_session), session); close (nfd); -- 2.39.5