Subversion Repositories

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

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