aboutsummaryrefslogtreecommitdiff
path: root/crypto/asn1/a_bitstr.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/asn1/a_bitstr.c')
-rw-r--r--crypto/asn1/a_bitstr.c17
1 files changed, 6 insertions, 11 deletions
diff --git a/crypto/asn1/a_bitstr.c b/crypto/asn1/a_bitstr.c
index 549c0e885549..a87cb15b44d4 100644
--- a/crypto/asn1/a_bitstr.c
+++ b/crypto/asn1/a_bitstr.c
@@ -87,7 +87,7 @@ ASN1_BIT_STRING *ossl_c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a,
ASN1_BIT_STRING *ret = NULL;
const unsigned char *p;
unsigned char *s;
- int i;
+ int i = 0;
if (len < 1) {
i = ASN1_R_STRING_TOO_SHORT;
@@ -115,13 +115,11 @@ ASN1_BIT_STRING *ossl_c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a,
* We do this to preserve the settings. If we modify the settings, via
* the _set_bit function, we will recalculate on output
*/
- ret->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); /* clear */
- ret->flags |= (ASN1_STRING_FLAG_BITS_LEFT | i); /* set */
+ ossl_asn1_string_set_bits_left(ret, i);
if (len-- > 1) { /* using one because of the bits left byte */
s = OPENSSL_malloc((int)len);
if (s == NULL) {
- i = ERR_R_MALLOC_FAILURE;
goto err;
}
memcpy(s, p, (int)len);
@@ -130,16 +128,15 @@ ASN1_BIT_STRING *ossl_c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a,
} else
s = NULL;
- ret->length = (int)len;
- OPENSSL_free(ret->data);
- ret->data = s;
+ ASN1_STRING_set0(ret, s, (int)len);
ret->type = V_ASN1_BIT_STRING;
if (a != NULL)
(*a) = ret;
*pp = p;
return ret;
err:
- ERR_raise(ERR_LIB_ASN1, i);
+ if (i != 0)
+ ERR_raise(ERR_LIB_ASN1, i);
if ((a == NULL) || (*a != ret))
ASN1_BIT_STRING_free(ret);
return NULL;
@@ -171,10 +168,8 @@ int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value)
if (!value)
return 1; /* Don't need to set */
c = OPENSSL_clear_realloc(a->data, a->length, w + 1);
- if (c == NULL) {
- ERR_raise(ERR_LIB_ASN1, ERR_R_MALLOC_FAILURE);
+ if (c == NULL)
return 0;
- }
if (w + 1 - a->length > 0)
memset(c + a->length, 0, w + 1 - a->length);
a->data = c;