X-Git-Url: https://git.openssl.org/?a=blobdiff_plain;f=crypto%2Fasn1%2Fasn1_lib.c;h=e3a8480eef3f10ebedeb95e69f4e84e4d7758ebd;hb=HEAD;hp=72d15acc7ef215eca291858b20728f9d98c1c953;hpb=3e73111d133dda63ec42437ff5706ac3142f17a5;p=openssl.git diff --git a/crypto/asn1/asn1_lib.c b/crypto/asn1/asn1_lib.c index 72d15acc7e..e3a8480eef 100644 --- a/crypto/asn1/asn1_lib.c +++ b/crypto/asn1/asn1_lib.c @@ -155,7 +155,7 @@ static int asn1_get_length(const unsigned char **pp, int *inf, long *rl, } /* - * class 0 is constructed constructed == 2 for indefinite length constructed + * constructed == 2 for indefinite length constructed */ void ASN1_put_object(unsigned char **pp, int constructed, int length, int tag, int xclass) @@ -248,6 +248,12 @@ int ASN1_object_size(int constructed, int length, int tag) return ret + length; } +void ossl_asn1_string_set_bits_left(ASN1_STRING *str, unsigned int num) +{ + str->flags &= ~0x07; + str->flags |= ASN1_STRING_FLAG_BITS_LEFT | (num & 0x07); +} + int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str) { if (str == NULL) @@ -301,9 +307,13 @@ int ASN1_STRING_set(ASN1_STRING *str, const void *_data, int len_in) } if ((size_t)str->length <= len || str->data == NULL) { c = str->data; +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + /* No NUL terminator in fuzzing builds */ + str->data = OPENSSL_realloc(c, len != 0 ? len : 1); +#else str->data = OPENSSL_realloc(c, len + 1); +#endif if (str->data == NULL) { - ERR_raise(ERR_LIB_ASN1, ERR_R_MALLOC_FAILURE); str->data = c; return 0; } @@ -311,8 +321,17 @@ int ASN1_STRING_set(ASN1_STRING *str, const void *_data, int len_in) str->length = len; if (data != NULL) { memcpy(str->data, data, len); - /* an allowance for strings :-) */ +#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + /* Set the unused byte to something non NUL and printable. */ + if (len == 0) + str->data[len] = '~'; +#else + /* + * Add a NUL terminator. This should not be necessary - but we add it as + * a safety precaution + */ str->data[len] = '\0'; +#endif } return 1; } @@ -334,10 +353,8 @@ ASN1_STRING *ASN1_STRING_type_new(int type) ASN1_STRING *ret; ret = OPENSSL_zalloc(sizeof(*ret)); - if (ret == NULL) { - ERR_raise(ERR_LIB_ASN1, ERR_R_MALLOC_FAILURE); + if (ret == NULL) return NULL; - } ret->type = type; return ret; } @@ -374,7 +391,8 @@ int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b) i = (a->length - b->length); if (i == 0) { - i = memcmp(a->data, b->data, a->length); + if (a->length != 0) + i = memcmp(a->data, b->data, a->length); if (i == 0) return a->type - b->type; else @@ -413,9 +431,9 @@ unsigned char *ASN1_STRING_data(ASN1_STRING *x) } #endif +/* |max_len| excludes NUL terminator and may be 0 to indicate no restriction */ char *ossl_sk_ASN1_UTF8STRING2text(STACK_OF(ASN1_UTF8STRING) *text, - const char *sep, - size_t max_len /* excluding NUL terminator */) + const char *sep, size_t max_len) { int i; ASN1_UTF8STRING *current; @@ -423,26 +441,27 @@ char *ossl_sk_ASN1_UTF8STRING2text(STACK_OF(ASN1_UTF8STRING) *text, char *result = NULL; char *p; - if (!ossl_assert(sep != NULL)) - return NULL; + if (sep == NULL) + sep = ""; sep_len = strlen(sep); - for (i = 0; i < sk_ASN1_UTF8STRING_num(text); ++i) { + for (i = 0; i < sk_ASN1_UTF8STRING_num(text); i++) { current = sk_ASN1_UTF8STRING_value(text, i); if (i > 0) length += sep_len; length += ASN1_STRING_length(current); - if (length > max_len) + if (max_len != 0 && length > max_len) return NULL; } if ((result = OPENSSL_malloc(length + 1)) == NULL) return NULL; - for (i = 0, p = result; i < sk_ASN1_UTF8STRING_num(text); ++i) { + p = result; + for (i = 0; i < sk_ASN1_UTF8STRING_num(text); i++) { current = sk_ASN1_UTF8STRING_value(text, i); length = ASN1_STRING_length(current); if (i > 0 && sep_len > 0) { - strncpy(p, sep, sep_len + 1); + strncpy(p, sep, sep_len + 1); /* using + 1 to silence gcc warning */ p += sep_len; } strncpy(p, (const char *)ASN1_STRING_get0_data(current), length);