Subversion Repositories

?revision_form?Rev ?revision_input??revision_submit??revision_endform?

Blame | Last modification | View Log | RSS feed

#! /bin/sh /usr/share/dpatch/dpatch-run
## 51_actually-keep-track-of-max_var_len.dpatch by Hannah Schroeter <hannah.schroeter@1und1.de>
##
## DP: actually keep track of max_var_len so SPF_record_expand_data doesn't fail
## DP: and abort the whole program on some cases, e.g. creating the Received-SPF
## DP:  header when the envelope from is very long.
##
## src/libspf2/spf_request.c |   50 +++++++++++++++++++++++++++++++++++++++++++-
## 1 files changed, 48 insertions(+), 2 deletions(-)

@DPATCH@
diff --git a/src/libspf2/spf_request.c b/src/libspf2/spf_request.c
index 181b0e4..cf6c39b 100644
--- a/src/libspf2/spf_request.c
+++ b/src/libspf2/spf_request.c
@@ -41,6 +41,7 @@ SPF_request_t *
 SPF_request_new(SPF_server_t *spf_server)
 {
        SPF_request_t   *sr;
+       const char *rec_dom;
 
        sr = (SPF_request_t *)malloc(sizeof(SPF_request_t));
        if (! sr)
@@ -51,6 +52,9 @@ SPF_request_new(SPF_server_t *spf_server)
        sr->client_ver = AF_UNSPEC;
        sr->ipv4.s_addr = htonl(INADDR_ANY);
        sr->ipv6 = in6addr_any;
+       rec_dom = SPF_request_get_rec_dom(sr);
+       if (rec_dom)
+               sr->max_var_len = strlen(rec_dom);
 
        return sr;
 }
@@ -116,9 +120,15 @@ SPF_request_set_ipv6_str(SPF_request_t *sr, const char *astr)
 SPF_errcode_t
 SPF_request_set_helo_dom(SPF_request_t *sr, const char *dom)
 {
+       size_t len;
        SPF_ASSERT_NOTNULL(dom);
        SPF_FREE(sr->helo_dom);
        sr->helo_dom = strdup(dom);
+       if (! sr->helo_dom)
+               return SPF_E_NO_MEMORY;
+       len = strlen(dom);
+       if (len > sr->max_var_len)
+               sr->max_var_len = len;
        /* set cur_dom and env_from? */
        if (sr->env_from == NULL)
                return SPF_request_set_env_from(sr, dom);
@@ -130,16 +138,24 @@ SPF_request_set_helo_dom(SPF_request_t *sr, const char *dom)
 const char *
 SPF_request_get_rec_dom(SPF_request_t *sr)
 {
+       char *result;
+       size_t len;
        SPF_server_t    *spf_server;
        spf_server = sr->spf_server;
-       return spf_server->rec_dom;
+       result = spf_server->rec_dom;
+       if (result) {
+               len = strlen(result);
+               if (len > sr->max_var_len)
+                       sr->max_var_len = len;
+       }
+       return result;
 }
 
 int
 SPF_request_set_env_from(SPF_request_t *sr, const char *from)
 {
        char    *cp;
-       int              len;
+       size_t           len;
 
        SPF_ASSERT_NOTNULL(from);
        SPF_FREE(sr->env_from);
@@ -187,6 +203,10 @@ SPF_request_set_env_from(SPF_request_t *sr, const char *from)
                }
        }
 
+       len = strlen(sr->env_from);
+       if (sr->max_var_len < len)
+               sr->max_var_len = len;
+
        return 0;
 }
 
@@ -200,8 +220,12 @@ SPF_request_get_client_dom(SPF_request_t *sr)
        SPF_ASSERT_NOTNULL(spf_server);
 
        if (sr->client_dom == NULL) {
+               size_t len;
                sr->client_dom = SPF_dns_get_client_dom(spf_server->resolver,
                                                sr);
+               len = strlen(sr->client_dom);
+               if (len > sr->max_var_len)
+                       sr->max_var_len = len;
        }
        return sr->client_dom;
 }
@@ -225,6 +249,16 @@ SPF_request_is_loopback(SPF_request_t *sr)
 static SPF_errcode_t
 SPF_request_prepare(SPF_request_t *sr)
 {
+       const char *rec_dom;
+       size_t len;
+
+       /* SPF_request_get_rec_dom result could have changed */
+       rec_dom = SPF_request_get_rec_dom(sr);
+       if (rec_dom) {
+               len = strlen(rec_dom);
+               if (len > sr->max_var_len)
+                       sr->max_var_len = len;
+       }
        if (sr->use_helo)
                sr->cur_dom = sr->helo_dom;
        else
@@ -241,11 +275,23 @@ SPF_request_query_record(SPF_request_t *spf_request,
                                SPF_record_t *spf_record,
                                SPF_errcode_t err)
 {
+       const char *rec_dom;
+       size_t len;
+
        if (err != SPF_E_SUCCESS) {
                if (spf_record)
                        SPF_record_free(spf_record);
                return err;
        }
+
+       /* SPF_request_get_rec_dom result could have changed */
+       rec_dom = SPF_request_get_rec_dom(spf_request);
+       if (rec_dom) {
+               len = strlen(rec_dom);
+               if (len > spf_request->max_var_len)
+                       spf_request->max_var_len = len;
+       }
+
        /* Now, in theory, SPF_response_errors(spf_response) == 0 */
        if (SPF_response_errors(spf_response) > 0)
                SPF_infof("Warning: %d errors in response, "
-- 
1.5.6.4