Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
38 | magnus | 1 | #! /bin/sh /usr/share/dpatch/dpatch-run |
2 | ## 51_actually-keep-track-of-max_var_len.dpatch by Hannah Schroeter <hannah.schroeter@1und1.de> |
||
3 | ## |
||
4 | ## DP: actually keep track of max_var_len so SPF_record_expand_data doesn't fail |
||
5 | ## DP: and abort the whole program on some cases, e.g. creating the Received-SPF |
||
6 | ## DP: header when the envelope from is very long. |
||
7 | ## |
||
8 | ## src/libspf2/spf_request.c | 50 +++++++++++++++++++++++++++++++++++++++++++- |
||
9 | ## 1 files changed, 48 insertions(+), 2 deletions(-) |
||
10 | |||
11 | @DPATCH@ |
||
12 | diff --git a/src/libspf2/spf_request.c b/src/libspf2/spf_request.c |
||
13 | index 181b0e4..cf6c39b 100644 |
||
14 | --- a/src/libspf2/spf_request.c |
||
15 | +++ b/src/libspf2/spf_request.c |
||
16 | @@ -41,6 +41,7 @@ SPF_request_t * |
||
17 | SPF_request_new(SPF_server_t *spf_server) |
||
18 | { |
||
19 | SPF_request_t *sr; |
||
20 | + const char *rec_dom; |
||
21 | |||
22 | sr = (SPF_request_t *)malloc(sizeof(SPF_request_t)); |
||
23 | if (! sr) |
||
24 | @@ -51,6 +52,9 @@ SPF_request_new(SPF_server_t *spf_server) |
||
25 | sr->client_ver = AF_UNSPEC; |
||
26 | sr->ipv4.s_addr = htonl(INADDR_ANY); |
||
27 | sr->ipv6 = in6addr_any; |
||
28 | + rec_dom = SPF_request_get_rec_dom(sr); |
||
29 | + if (rec_dom) |
||
30 | + sr->max_var_len = strlen(rec_dom); |
||
31 | |||
32 | return sr; |
||
33 | } |
||
34 | @@ -116,9 +120,15 @@ SPF_request_set_ipv6_str(SPF_request_t *sr, const char *astr) |
||
35 | SPF_errcode_t |
||
36 | SPF_request_set_helo_dom(SPF_request_t *sr, const char *dom) |
||
37 | { |
||
38 | + size_t len; |
||
39 | SPF_ASSERT_NOTNULL(dom); |
||
40 | SPF_FREE(sr->helo_dom); |
||
41 | sr->helo_dom = strdup(dom); |
||
42 | + if (! sr->helo_dom) |
||
43 | + return SPF_E_NO_MEMORY; |
||
44 | + len = strlen(dom); |
||
45 | + if (len > sr->max_var_len) |
||
46 | + sr->max_var_len = len; |
||
47 | /* set cur_dom and env_from? */ |
||
48 | if (sr->env_from == NULL) |
||
49 | return SPF_request_set_env_from(sr, dom); |
||
50 | @@ -130,16 +138,24 @@ SPF_request_set_helo_dom(SPF_request_t *sr, const char *dom) |
||
51 | const char * |
||
52 | SPF_request_get_rec_dom(SPF_request_t *sr) |
||
53 | { |
||
54 | + char *result; |
||
55 | + size_t len; |
||
56 | SPF_server_t *spf_server; |
||
57 | spf_server = sr->spf_server; |
||
58 | - return spf_server->rec_dom; |
||
59 | + result = spf_server->rec_dom; |
||
60 | + if (result) { |
||
61 | + len = strlen(result); |
||
62 | + if (len > sr->max_var_len) |
||
63 | + sr->max_var_len = len; |
||
64 | + } |
||
65 | + return result; |
||
66 | } |
||
67 | |||
68 | int |
||
69 | SPF_request_set_env_from(SPF_request_t *sr, const char *from) |
||
70 | { |
||
71 | char *cp; |
||
72 | - int len; |
||
73 | + size_t len; |
||
74 | |||
75 | SPF_ASSERT_NOTNULL(from); |
||
76 | SPF_FREE(sr->env_from); |
||
77 | @@ -187,6 +203,10 @@ SPF_request_set_env_from(SPF_request_t *sr, const char *from) |
||
78 | } |
||
79 | } |
||
80 | |||
81 | + len = strlen(sr->env_from); |
||
82 | + if (sr->max_var_len < len) |
||
83 | + sr->max_var_len = len; |
||
84 | + |
||
85 | return 0; |
||
86 | } |
||
87 | |||
88 | @@ -200,8 +220,12 @@ SPF_request_get_client_dom(SPF_request_t *sr) |
||
89 | SPF_ASSERT_NOTNULL(spf_server); |
||
90 | |||
91 | if (sr->client_dom == NULL) { |
||
92 | + size_t len; |
||
93 | sr->client_dom = SPF_dns_get_client_dom(spf_server->resolver, |
||
94 | sr); |
||
95 | + len = strlen(sr->client_dom); |
||
96 | + if (len > sr->max_var_len) |
||
97 | + sr->max_var_len = len; |
||
98 | } |
||
99 | return sr->client_dom; |
||
100 | } |
||
101 | @@ -225,6 +249,16 @@ SPF_request_is_loopback(SPF_request_t *sr) |
||
102 | static SPF_errcode_t |
||
103 | SPF_request_prepare(SPF_request_t *sr) |
||
104 | { |
||
105 | + const char *rec_dom; |
||
106 | + size_t len; |
||
107 | + |
||
108 | + /* SPF_request_get_rec_dom result could have changed */ |
||
109 | + rec_dom = SPF_request_get_rec_dom(sr); |
||
110 | + if (rec_dom) { |
||
111 | + len = strlen(rec_dom); |
||
112 | + if (len > sr->max_var_len) |
||
113 | + sr->max_var_len = len; |
||
114 | + } |
||
115 | if (sr->use_helo) |
||
116 | sr->cur_dom = sr->helo_dom; |
||
117 | else |
||
118 | @@ -241,11 +275,23 @@ SPF_request_query_record(SPF_request_t *spf_request, |
||
119 | SPF_record_t *spf_record, |
||
120 | SPF_errcode_t err) |
||
121 | { |
||
122 | + const char *rec_dom; |
||
123 | + size_t len; |
||
124 | + |
||
125 | if (err != SPF_E_SUCCESS) { |
||
126 | if (spf_record) |
||
127 | SPF_record_free(spf_record); |
||
128 | return err; |
||
129 | } |
||
130 | + |
||
131 | + /* SPF_request_get_rec_dom result could have changed */ |
||
132 | + rec_dom = SPF_request_get_rec_dom(spf_request); |
||
133 | + if (rec_dom) { |
||
134 | + len = strlen(rec_dom); |
||
135 | + if (len > spf_request->max_var_len) |
||
136 | + spf_request->max_var_len = len; |
||
137 | + } |
||
138 | + |
||
139 | /* Now, in theory, SPF_response_errors(spf_response) == 0 */ |
||
140 | if (SPF_response_errors(spf_response) > 0) |
||
141 | SPF_infof("Warning: %d errors in response, " |
||
142 | -- |
||
143 | 1.5.6.4 |
||
144 |