diff options
author | miod <> | 2014-05-15 21:06:10 +0000 |
---|---|---|
committer | miod <> | 2014-05-15 21:06:10 +0000 |
commit | ce07241b92b5b1b9d60acb439c3d18e00a563d55 (patch) | |
tree | 2b3d3940b1fe2fc1049093e115ce5e85d63e7b4c | |
parent | 8bfccde54e4165db2d95797d53f16cb1978af3da (diff) | |
download | openbsd-ce07241b92b5b1b9d60acb439c3d18e00a563d55.tar.gz openbsd-ce07241b92b5b1b9d60acb439c3d18e00a563d55.tar.bz2 openbsd-ce07241b92b5b1b9d60acb439c3d18e00a563d55.zip |
Replace ASN1_GENERALIZEDTIME_adj(), ASN1_UTCTIME_adj() and
ASN1_TIME_to_generalizedtime() with wrappers around their former
implementations, making sure memory allocated is freed in all failure cases.
help and ok from beck@ and Brendan MacDonell.
-rw-r--r-- | src/lib/libcrypto/asn1/a_gentm.c | 32 | ||||
-rw-r--r-- | src/lib/libcrypto/asn1/a_time.c | 37 | ||||
-rw-r--r-- | src/lib/libcrypto/asn1/a_utctm.c | 29 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/asn1/a_gentm.c | 32 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/asn1/a_time.c | 37 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/asn1/a_utctm.c | 29 |
6 files changed, 146 insertions, 50 deletions
diff --git a/src/lib/libcrypto/asn1/a_gentm.c b/src/lib/libcrypto/asn1/a_gentm.c index f331bff320..7f8bc2fef7 100644 --- a/src/lib/libcrypto/asn1/a_gentm.c +++ b/src/lib/libcrypto/asn1/a_gentm.c | |||
@@ -208,20 +208,15 @@ ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s, time_t t) | |||
208 | return ASN1_GENERALIZEDTIME_adj(s, t, 0, 0); | 208 | return ASN1_GENERALIZEDTIME_adj(s, t, 0, 0); |
209 | } | 209 | } |
210 | 210 | ||
211 | ASN1_GENERALIZEDTIME * | 211 | static ASN1_GENERALIZEDTIME * |
212 | ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, time_t t, int offset_day, | 212 | ASN1_GENERALIZEDTIME_adj_internal(ASN1_GENERALIZEDTIME *s, time_t t, |
213 | long offset_sec) | 213 | int offset_day, long offset_sec) |
214 | { | 214 | { |
215 | char *p; | 215 | char *p; |
216 | struct tm *ts; | 216 | struct tm *ts; |
217 | struct tm data; | 217 | struct tm data; |
218 | size_t len = 20; | 218 | size_t len = 20; |
219 | 219 | ||
220 | if (s == NULL) | ||
221 | s = M_ASN1_GENERALIZEDTIME_new(); | ||
222 | if (s == NULL) | ||
223 | return (NULL); | ||
224 | |||
225 | ts = gmtime_r(&t, &data); | 220 | ts = gmtime_r(&t, &data); |
226 | if (ts == NULL) | 221 | if (ts == NULL) |
227 | return (NULL); | 222 | return (NULL); |
@@ -250,3 +245,24 @@ ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, time_t t, int offset_day, | |||
250 | s->type = V_ASN1_GENERALIZEDTIME; | 245 | s->type = V_ASN1_GENERALIZEDTIME; |
251 | return (s); | 246 | return (s); |
252 | } | 247 | } |
248 | |||
249 | ASN1_GENERALIZEDTIME * | ||
250 | ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, time_t t, int offset_day, | ||
251 | long offset_sec) | ||
252 | { | ||
253 | ASN1_GENERALIZEDTIME *tmp = NULL, *ret; | ||
254 | |||
255 | if (s == NULL) { | ||
256 | tmp = M_ASN1_GENERALIZEDTIME_new(); | ||
257 | if (tmp == NULL) | ||
258 | return NULL; | ||
259 | s = tmp; | ||
260 | } | ||
261 | |||
262 | ret = ASN1_GENERALIZEDTIME_adj_internal(s, t, offset_day, offset_sec); | ||
263 | if (ret == NULL && tmp != NULL) | ||
264 | M_ASN1_GENERALIZEDTIME_free(tmp); | ||
265 | |||
266 | return ret; | ||
267 | |||
268 | } | ||
diff --git a/src/lib/libcrypto/asn1/a_time.c b/src/lib/libcrypto/asn1/a_time.c index 8db2163622..574c99bbf8 100644 --- a/src/lib/libcrypto/asn1/a_time.c +++ b/src/lib/libcrypto/asn1/a_time.c | |||
@@ -120,8 +120,8 @@ ASN1_TIME_check(ASN1_TIME *t) | |||
120 | } | 120 | } |
121 | 121 | ||
122 | /* Convert an ASN1_TIME structure to GeneralizedTime */ | 122 | /* Convert an ASN1_TIME structure to GeneralizedTime */ |
123 | ASN1_GENERALIZEDTIME * | 123 | static ASN1_GENERALIZEDTIME * |
124 | ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME **out) | 124 | ASN1_TIME_to_generalizedtime_internal(ASN1_TIME *t, ASN1_GENERALIZEDTIME **out) |
125 | { | 125 | { |
126 | ASN1_GENERALIZEDTIME *ret; | 126 | ASN1_GENERALIZEDTIME *ret; |
127 | char *str; | 127 | char *str; |
@@ -131,13 +131,7 @@ ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME **out) | |||
131 | if (!ASN1_TIME_check(t)) | 131 | if (!ASN1_TIME_check(t)) |
132 | return NULL; | 132 | return NULL; |
133 | 133 | ||
134 | if (!out || !*out) { | 134 | ret = *out; |
135 | if (!(ret = ASN1_GENERALIZEDTIME_new ())) | ||
136 | return NULL; | ||
137 | if (out) | ||
138 | *out = ret; | ||
139 | } else | ||
140 | ret = *out; | ||
141 | 135 | ||
142 | /* If already GeneralizedTime just copy across */ | 136 | /* If already GeneralizedTime just copy across */ |
143 | if (t->type == V_ASN1_GENERALIZEDTIME) { | 137 | if (t->type == V_ASN1_GENERALIZEDTIME) { |
@@ -152,15 +146,38 @@ ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME **out) | |||
152 | /* ASN1_STRING_set() allocated 'len + 1' bytes. */ | 146 | /* ASN1_STRING_set() allocated 'len + 1' bytes. */ |
153 | newlen = t->length + 2 + 1; | 147 | newlen = t->length + 2 + 1; |
154 | str = (char *)ret->data; | 148 | str = (char *)ret->data; |
149 | /* XXX ASN1_TIME is not Y2050 compatible */ | ||
155 | i = snprintf(str, newlen, "%s%s", (t->data[0] >= '5') ? "19" : "20", | 150 | i = snprintf(str, newlen, "%s%s", (t->data[0] >= '5') ? "19" : "20", |
156 | (char *) t->data); | 151 | (char *) t->data); |
157 | if (i == -1 || i >= newlen) { | 152 | if (i == -1 || i >= newlen) { |
158 | ASN1_STRING_free(ret); | 153 | M_ASN1_GENERALIZEDTIME_free(ret); |
154 | *out = NULL; | ||
159 | return NULL; | 155 | return NULL; |
160 | } | 156 | } |
161 | return ret; | 157 | return ret; |
162 | } | 158 | } |
163 | 159 | ||
160 | ASN1_GENERALIZEDTIME * | ||
161 | ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME **out) | ||
162 | { | ||
163 | ASN1_GENERALIZEDTIME *tmp = NULL, *ret; | ||
164 | |||
165 | if (!out || !*out) { | ||
166 | if (!(tmp = ASN1_GENERALIZEDTIME_new())) | ||
167 | return NULL; | ||
168 | if (out != NULL) | ||
169 | *out = tmp; | ||
170 | else | ||
171 | out = &tmp; | ||
172 | } | ||
173 | |||
174 | ret = ASN1_TIME_to_generalizedtime_internal(t, out); | ||
175 | if (ret == NULL && tmp != NULL) | ||
176 | ASN1_GENERALIZEDTIME_free(tmp); | ||
177 | |||
178 | return ret; | ||
179 | } | ||
180 | |||
164 | int | 181 | int |
165 | ASN1_TIME_set_string(ASN1_TIME *s, const char *str) | 182 | ASN1_TIME_set_string(ASN1_TIME *s, const char *str) |
166 | { | 183 | { |
diff --git a/src/lib/libcrypto/asn1/a_utctm.c b/src/lib/libcrypto/asn1/a_utctm.c index e4db9f8a99..35f2b7fd66 100644 --- a/src/lib/libcrypto/asn1/a_utctm.c +++ b/src/lib/libcrypto/asn1/a_utctm.c | |||
@@ -149,19 +149,15 @@ ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t) | |||
149 | return ASN1_UTCTIME_adj(s, t, 0, 0); | 149 | return ASN1_UTCTIME_adj(s, t, 0, 0); |
150 | } | 150 | } |
151 | 151 | ||
152 | ASN1_UTCTIME * | 152 | static ASN1_UTCTIME * |
153 | ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, int offset_day, long offset_sec) | 153 | ASN1_UTCTIME_adj_internal(ASN1_UTCTIME *s, time_t t, int offset_day, |
154 | long offset_sec) | ||
154 | { | 155 | { |
155 | char *p; | 156 | char *p; |
156 | struct tm *ts; | 157 | struct tm *ts; |
157 | struct tm data; | 158 | struct tm data; |
158 | size_t len = 20; | 159 | size_t len = 20; |
159 | 160 | ||
160 | if (s == NULL) | ||
161 | s = M_ASN1_UTCTIME_new(); | ||
162 | if (s == NULL) | ||
163 | return (NULL); | ||
164 | |||
165 | ts = gmtime_r(&t, &data); | 161 | ts = gmtime_r(&t, &data); |
166 | if (ts == NULL) | 162 | if (ts == NULL) |
167 | return (NULL); | 163 | return (NULL); |
@@ -193,6 +189,25 @@ ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, int offset_day, long offset_sec) | |||
193 | return (s); | 189 | return (s); |
194 | } | 190 | } |
195 | 191 | ||
192 | ASN1_UTCTIME * | ||
193 | ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, int offset_day, long offset_sec) | ||
194 | { | ||
195 | ASN1_UTCTIME *tmp = NULL, *ret; | ||
196 | |||
197 | if (s == NULL) { | ||
198 | tmp = M_ASN1_UTCTIME_new(); | ||
199 | if (tmp == NULL) | ||
200 | return NULL; | ||
201 | s = tmp; | ||
202 | } | ||
203 | |||
204 | ret = ASN1_UTCTIME_adj_internal(s, t, offset_day, offset_sec); | ||
205 | if (ret == NULL && tmp != NULL) | ||
206 | M_ASN1_UTCTIME_free(tmp); | ||
207 | |||
208 | return ret; | ||
209 | } | ||
210 | |||
196 | int | 211 | int |
197 | ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t) | 212 | ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t) |
198 | { | 213 | { |
diff --git a/src/lib/libssl/src/crypto/asn1/a_gentm.c b/src/lib/libssl/src/crypto/asn1/a_gentm.c index f331bff320..7f8bc2fef7 100644 --- a/src/lib/libssl/src/crypto/asn1/a_gentm.c +++ b/src/lib/libssl/src/crypto/asn1/a_gentm.c | |||
@@ -208,20 +208,15 @@ ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s, time_t t) | |||
208 | return ASN1_GENERALIZEDTIME_adj(s, t, 0, 0); | 208 | return ASN1_GENERALIZEDTIME_adj(s, t, 0, 0); |
209 | } | 209 | } |
210 | 210 | ||
211 | ASN1_GENERALIZEDTIME * | 211 | static ASN1_GENERALIZEDTIME * |
212 | ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, time_t t, int offset_day, | 212 | ASN1_GENERALIZEDTIME_adj_internal(ASN1_GENERALIZEDTIME *s, time_t t, |
213 | long offset_sec) | 213 | int offset_day, long offset_sec) |
214 | { | 214 | { |
215 | char *p; | 215 | char *p; |
216 | struct tm *ts; | 216 | struct tm *ts; |
217 | struct tm data; | 217 | struct tm data; |
218 | size_t len = 20; | 218 | size_t len = 20; |
219 | 219 | ||
220 | if (s == NULL) | ||
221 | s = M_ASN1_GENERALIZEDTIME_new(); | ||
222 | if (s == NULL) | ||
223 | return (NULL); | ||
224 | |||
225 | ts = gmtime_r(&t, &data); | 220 | ts = gmtime_r(&t, &data); |
226 | if (ts == NULL) | 221 | if (ts == NULL) |
227 | return (NULL); | 222 | return (NULL); |
@@ -250,3 +245,24 @@ ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, time_t t, int offset_day, | |||
250 | s->type = V_ASN1_GENERALIZEDTIME; | 245 | s->type = V_ASN1_GENERALIZEDTIME; |
251 | return (s); | 246 | return (s); |
252 | } | 247 | } |
248 | |||
249 | ASN1_GENERALIZEDTIME * | ||
250 | ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, time_t t, int offset_day, | ||
251 | long offset_sec) | ||
252 | { | ||
253 | ASN1_GENERALIZEDTIME *tmp = NULL, *ret; | ||
254 | |||
255 | if (s == NULL) { | ||
256 | tmp = M_ASN1_GENERALIZEDTIME_new(); | ||
257 | if (tmp == NULL) | ||
258 | return NULL; | ||
259 | s = tmp; | ||
260 | } | ||
261 | |||
262 | ret = ASN1_GENERALIZEDTIME_adj_internal(s, t, offset_day, offset_sec); | ||
263 | if (ret == NULL && tmp != NULL) | ||
264 | M_ASN1_GENERALIZEDTIME_free(tmp); | ||
265 | |||
266 | return ret; | ||
267 | |||
268 | } | ||
diff --git a/src/lib/libssl/src/crypto/asn1/a_time.c b/src/lib/libssl/src/crypto/asn1/a_time.c index 8db2163622..574c99bbf8 100644 --- a/src/lib/libssl/src/crypto/asn1/a_time.c +++ b/src/lib/libssl/src/crypto/asn1/a_time.c | |||
@@ -120,8 +120,8 @@ ASN1_TIME_check(ASN1_TIME *t) | |||
120 | } | 120 | } |
121 | 121 | ||
122 | /* Convert an ASN1_TIME structure to GeneralizedTime */ | 122 | /* Convert an ASN1_TIME structure to GeneralizedTime */ |
123 | ASN1_GENERALIZEDTIME * | 123 | static ASN1_GENERALIZEDTIME * |
124 | ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME **out) | 124 | ASN1_TIME_to_generalizedtime_internal(ASN1_TIME *t, ASN1_GENERALIZEDTIME **out) |
125 | { | 125 | { |
126 | ASN1_GENERALIZEDTIME *ret; | 126 | ASN1_GENERALIZEDTIME *ret; |
127 | char *str; | 127 | char *str; |
@@ -131,13 +131,7 @@ ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME **out) | |||
131 | if (!ASN1_TIME_check(t)) | 131 | if (!ASN1_TIME_check(t)) |
132 | return NULL; | 132 | return NULL; |
133 | 133 | ||
134 | if (!out || !*out) { | 134 | ret = *out; |
135 | if (!(ret = ASN1_GENERALIZEDTIME_new ())) | ||
136 | return NULL; | ||
137 | if (out) | ||
138 | *out = ret; | ||
139 | } else | ||
140 | ret = *out; | ||
141 | 135 | ||
142 | /* If already GeneralizedTime just copy across */ | 136 | /* If already GeneralizedTime just copy across */ |
143 | if (t->type == V_ASN1_GENERALIZEDTIME) { | 137 | if (t->type == V_ASN1_GENERALIZEDTIME) { |
@@ -152,15 +146,38 @@ ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME **out) | |||
152 | /* ASN1_STRING_set() allocated 'len + 1' bytes. */ | 146 | /* ASN1_STRING_set() allocated 'len + 1' bytes. */ |
153 | newlen = t->length + 2 + 1; | 147 | newlen = t->length + 2 + 1; |
154 | str = (char *)ret->data; | 148 | str = (char *)ret->data; |
149 | /* XXX ASN1_TIME is not Y2050 compatible */ | ||
155 | i = snprintf(str, newlen, "%s%s", (t->data[0] >= '5') ? "19" : "20", | 150 | i = snprintf(str, newlen, "%s%s", (t->data[0] >= '5') ? "19" : "20", |
156 | (char *) t->data); | 151 | (char *) t->data); |
157 | if (i == -1 || i >= newlen) { | 152 | if (i == -1 || i >= newlen) { |
158 | ASN1_STRING_free(ret); | 153 | M_ASN1_GENERALIZEDTIME_free(ret); |
154 | *out = NULL; | ||
159 | return NULL; | 155 | return NULL; |
160 | } | 156 | } |
161 | return ret; | 157 | return ret; |
162 | } | 158 | } |
163 | 159 | ||
160 | ASN1_GENERALIZEDTIME * | ||
161 | ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME **out) | ||
162 | { | ||
163 | ASN1_GENERALIZEDTIME *tmp = NULL, *ret; | ||
164 | |||
165 | if (!out || !*out) { | ||
166 | if (!(tmp = ASN1_GENERALIZEDTIME_new())) | ||
167 | return NULL; | ||
168 | if (out != NULL) | ||
169 | *out = tmp; | ||
170 | else | ||
171 | out = &tmp; | ||
172 | } | ||
173 | |||
174 | ret = ASN1_TIME_to_generalizedtime_internal(t, out); | ||
175 | if (ret == NULL && tmp != NULL) | ||
176 | ASN1_GENERALIZEDTIME_free(tmp); | ||
177 | |||
178 | return ret; | ||
179 | } | ||
180 | |||
164 | int | 181 | int |
165 | ASN1_TIME_set_string(ASN1_TIME *s, const char *str) | 182 | ASN1_TIME_set_string(ASN1_TIME *s, const char *str) |
166 | { | 183 | { |
diff --git a/src/lib/libssl/src/crypto/asn1/a_utctm.c b/src/lib/libssl/src/crypto/asn1/a_utctm.c index e4db9f8a99..35f2b7fd66 100644 --- a/src/lib/libssl/src/crypto/asn1/a_utctm.c +++ b/src/lib/libssl/src/crypto/asn1/a_utctm.c | |||
@@ -149,19 +149,15 @@ ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t) | |||
149 | return ASN1_UTCTIME_adj(s, t, 0, 0); | 149 | return ASN1_UTCTIME_adj(s, t, 0, 0); |
150 | } | 150 | } |
151 | 151 | ||
152 | ASN1_UTCTIME * | 152 | static ASN1_UTCTIME * |
153 | ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, int offset_day, long offset_sec) | 153 | ASN1_UTCTIME_adj_internal(ASN1_UTCTIME *s, time_t t, int offset_day, |
154 | long offset_sec) | ||
154 | { | 155 | { |
155 | char *p; | 156 | char *p; |
156 | struct tm *ts; | 157 | struct tm *ts; |
157 | struct tm data; | 158 | struct tm data; |
158 | size_t len = 20; | 159 | size_t len = 20; |
159 | 160 | ||
160 | if (s == NULL) | ||
161 | s = M_ASN1_UTCTIME_new(); | ||
162 | if (s == NULL) | ||
163 | return (NULL); | ||
164 | |||
165 | ts = gmtime_r(&t, &data); | 161 | ts = gmtime_r(&t, &data); |
166 | if (ts == NULL) | 162 | if (ts == NULL) |
167 | return (NULL); | 163 | return (NULL); |
@@ -193,6 +189,25 @@ ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, int offset_day, long offset_sec) | |||
193 | return (s); | 189 | return (s); |
194 | } | 190 | } |
195 | 191 | ||
192 | ASN1_UTCTIME * | ||
193 | ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, int offset_day, long offset_sec) | ||
194 | { | ||
195 | ASN1_UTCTIME *tmp = NULL, *ret; | ||
196 | |||
197 | if (s == NULL) { | ||
198 | tmp = M_ASN1_UTCTIME_new(); | ||
199 | if (tmp == NULL) | ||
200 | return NULL; | ||
201 | s = tmp; | ||
202 | } | ||
203 | |||
204 | ret = ASN1_UTCTIME_adj_internal(s, t, offset_day, offset_sec); | ||
205 | if (ret == NULL && tmp != NULL) | ||
206 | M_ASN1_UTCTIME_free(tmp); | ||
207 | |||
208 | return ret; | ||
209 | } | ||
210 | |||
196 | int | 211 | int |
197 | ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t) | 212 | ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t) |
198 | { | 213 | { |