summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/a_object.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/asn1/a_object.c')
-rw-r--r--src/lib/libcrypto/asn1/a_object.c35
1 files changed, 9 insertions, 26 deletions
diff --git a/src/lib/libcrypto/asn1/a_object.c b/src/lib/libcrypto/asn1/a_object.c
index e5fbe7cbb1..dc980421d0 100644
--- a/src/lib/libcrypto/asn1/a_object.c
+++ b/src/lib/libcrypto/asn1/a_object.c
@@ -281,6 +281,8 @@ ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp,
281 return ret; 281 return ret;
282err: 282err:
283 ASN1err(ASN1_F_D2I_ASN1_OBJECT,i); 283 ASN1err(ASN1_F_D2I_ASN1_OBJECT,i);
284 if ((ret != NULL) && ((a == NULL) || (*a != ret)))
285 ASN1_OBJECT_free(ret);
284 return(NULL); 286 return(NULL);
285} 287}
286ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, 288ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp,
@@ -288,19 +290,7 @@ ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp,
288 { 290 {
289 ASN1_OBJECT *ret=NULL; 291 ASN1_OBJECT *ret=NULL;
290 const unsigned char *p; 292 const unsigned char *p;
291 unsigned char *data;
292 int i; 293 int i;
293 /* Sanity check OID encoding: can't have leading 0x80 in
294 * subidentifiers, see: X.690 8.19.2
295 */
296 for (i = 0, p = *pp + 1; i < len - 1; i++, p++)
297 {
298 if (*p == 0x80 && (!i || !(p[-1] & 0x80)))
299 {
300 ASN1err(ASN1_F_C2I_ASN1_OBJECT,ASN1_R_INVALID_OBJECT_ENCODING);
301 return NULL;
302 }
303 }
304 294
305 /* only the ASN1_OBJECTs from the 'table' will have values 295 /* only the ASN1_OBJECTs from the 'table' will have values
306 * for ->sn or ->ln */ 296 * for ->sn or ->ln */
@@ -312,22 +302,15 @@ ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp,
312 else ret=(*a); 302 else ret=(*a);
313 303
314 p= *pp; 304 p= *pp;
315 /* detach data from object */ 305 if ((ret->data == NULL) || (ret->length < len))
316 data = (unsigned char *)ret->data;
317 ret->data = NULL;
318 /* once detached we can change it */
319 if ((data == NULL) || (ret->length < len))
320 { 306 {
321 ret->length=0; 307 if (ret->data != NULL) OPENSSL_free(ret->data);
322 if (data != NULL) OPENSSL_free(data); 308 ret->data=(unsigned char *)OPENSSL_malloc(len ? (int)len : 1);
323 data=(unsigned char *)OPENSSL_malloc(len ? (int)len : 1);
324 if (data == NULL)
325 { i=ERR_R_MALLOC_FAILURE; goto err; }
326 ret->flags|=ASN1_OBJECT_FLAG_DYNAMIC_DATA; 309 ret->flags|=ASN1_OBJECT_FLAG_DYNAMIC_DATA;
310 if (ret->data == NULL)
311 { i=ERR_R_MALLOC_FAILURE; goto err; }
327 } 312 }
328 memcpy(data,p,(int)len); 313 memcpy(ret->data,p,(int)len);
329 /* reattach data to object, after which it remains const */
330 ret->data =data;
331 ret->length=(int)len; 314 ret->length=(int)len;
332 ret->sn=NULL; 315 ret->sn=NULL;
333 ret->ln=NULL; 316 ret->ln=NULL;
@@ -376,7 +359,7 @@ void ASN1_OBJECT_free(ASN1_OBJECT *a)
376 } 359 }
377 if (a->flags & ASN1_OBJECT_FLAG_DYNAMIC_DATA) 360 if (a->flags & ASN1_OBJECT_FLAG_DYNAMIC_DATA)
378 { 361 {
379 if (a->data != NULL) OPENSSL_free((void *)a->data); 362 if (a->data != NULL) OPENSSL_free(a->data);
380 a->data=NULL; 363 a->data=NULL;
381 a->length=0; 364 a->length=0;
382 } 365 }