summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormiod <>2014-05-15 21:06:10 +0000
committermiod <>2014-05-15 21:06:10 +0000
commitce07241b92b5b1b9d60acb439c3d18e00a563d55 (patch)
tree2b3d3940b1fe2fc1049093e115ce5e85d63e7b4c
parent8bfccde54e4165db2d95797d53f16cb1978af3da (diff)
downloadopenbsd-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.c32
-rw-r--r--src/lib/libcrypto/asn1/a_time.c37
-rw-r--r--src/lib/libcrypto/asn1/a_utctm.c29
-rw-r--r--src/lib/libssl/src/crypto/asn1/a_gentm.c32
-rw-r--r--src/lib/libssl/src/crypto/asn1/a_time.c37
-rw-r--r--src/lib/libssl/src/crypto/asn1/a_utctm.c29
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
211ASN1_GENERALIZEDTIME * 211static ASN1_GENERALIZEDTIME *
212ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, time_t t, int offset_day, 212ASN1_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
249ASN1_GENERALIZEDTIME *
250ASN1_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 */
123ASN1_GENERALIZEDTIME * 123static ASN1_GENERALIZEDTIME *
124ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME **out) 124ASN1_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
160ASN1_GENERALIZEDTIME *
161ASN1_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
164int 181int
165ASN1_TIME_set_string(ASN1_TIME *s, const char *str) 182ASN1_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
152ASN1_UTCTIME * 152static ASN1_UTCTIME *
153ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, int offset_day, long offset_sec) 153ASN1_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
192ASN1_UTCTIME *
193ASN1_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
196int 211int
197ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t) 212ASN1_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
211ASN1_GENERALIZEDTIME * 211static ASN1_GENERALIZEDTIME *
212ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, time_t t, int offset_day, 212ASN1_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
249ASN1_GENERALIZEDTIME *
250ASN1_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 */
123ASN1_GENERALIZEDTIME * 123static ASN1_GENERALIZEDTIME *
124ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME **out) 124ASN1_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
160ASN1_GENERALIZEDTIME *
161ASN1_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
164int 181int
165ASN1_TIME_set_string(ASN1_TIME *s, const char *str) 182ASN1_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
152ASN1_UTCTIME * 152static ASN1_UTCTIME *
153ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, int offset_day, long offset_sec) 153ASN1_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
192ASN1_UTCTIME *
193ASN1_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
196int 211int
197ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t) 212ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t)
198{ 213{