diff options
Diffstat (limited to 'src/lib/libcrypto/asn1/asn_pack.c')
| -rw-r--r-- | src/lib/libcrypto/asn1/asn_pack.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/lib/libcrypto/asn1/asn_pack.c b/src/lib/libcrypto/asn1/asn_pack.c index 8eb39e6a9b..7f46e1100d 100644 --- a/src/lib/libcrypto/asn1/asn_pack.c +++ b/src/lib/libcrypto/asn1/asn_pack.c | |||
| @@ -137,22 +137,26 @@ ASN1_pack_string(void *obj, i2d_of_void *i2d, ASN1_STRING **oct) | |||
| 137 | ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); | 137 | ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); |
| 138 | return NULL; | 138 | return NULL; |
| 139 | } | 139 | } |
| 140 | if (oct) | ||
| 141 | *oct = octmp; | ||
| 142 | } else | 140 | } else |
| 143 | octmp = *oct; | 141 | octmp = *oct; |
| 144 | 142 | ||
| 145 | if (!(octmp->length = i2d(obj, NULL))) { | 143 | if (!(octmp->length = i2d(obj, NULL))) { |
| 146 | ASN1err(ASN1_F_ASN1_PACK_STRING,ASN1_R_ENCODE_ERROR); | 144 | ASN1err(ASN1_F_ASN1_PACK_STRING,ASN1_R_ENCODE_ERROR); |
| 147 | return NULL; | 145 | goto err; |
| 148 | } | 146 | } |
| 149 | if (!(p = malloc (octmp->length))) { | 147 | if (!(p = malloc (octmp->length))) { |
| 150 | ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); | 148 | ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); |
| 151 | return NULL; | 149 | goto err; |
| 152 | } | 150 | } |
| 153 | octmp->data = p; | 151 | octmp->data = p; |
| 154 | i2d (obj, &p); | 152 | i2d (obj, &p); |
| 153 | if (oct) | ||
| 154 | *oct = octmp; | ||
| 155 | return octmp; | 155 | return octmp; |
| 156 | err: | ||
| 157 | if (!oct || octmp != *oct) | ||
| 158 | ASN1_STRING_free(octmp); | ||
| 159 | return NULL; | ||
| 156 | } | 160 | } |
| 157 | 161 | ||
| 158 | #endif | 162 | #endif |
| @@ -169,8 +173,6 @@ ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_STRING **oct) | |||
| 169 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ERR_R_MALLOC_FAILURE); | 173 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ERR_R_MALLOC_FAILURE); |
| 170 | return NULL; | 174 | return NULL; |
| 171 | } | 175 | } |
| 172 | if (oct) | ||
| 173 | *oct = octmp; | ||
| 174 | } else | 176 | } else |
| 175 | octmp = *oct; | 177 | octmp = *oct; |
| 176 | 178 | ||
| @@ -181,13 +183,19 @@ ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_STRING **oct) | |||
| 181 | 183 | ||
| 182 | if (!(octmp->length = ASN1_item_i2d(obj, &octmp->data, it))) { | 184 | if (!(octmp->length = ASN1_item_i2d(obj, &octmp->data, it))) { |
| 183 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ASN1_R_ENCODE_ERROR); | 185 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ASN1_R_ENCODE_ERROR); |
| 184 | return NULL; | 186 | goto err; |
| 185 | } | 187 | } |
| 186 | if (!octmp->data) { | 188 | if (!octmp->data) { |
| 187 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ERR_R_MALLOC_FAILURE); | 189 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ERR_R_MALLOC_FAILURE); |
| 188 | return NULL; | 190 | goto err; |
| 189 | } | 191 | } |
| 192 | if (oct) | ||
| 193 | *oct = octmp; | ||
| 190 | return octmp; | 194 | return octmp; |
| 195 | err: | ||
| 196 | if (!oct || octmp != *oct) | ||
| 197 | ASN1_STRING_free(octmp); | ||
| 198 | return NULL; | ||
| 191 | } | 199 | } |
| 192 | 200 | ||
| 193 | /* Extract an ASN1 object from an ASN1_STRING */ | 201 | /* Extract an ASN1 object from an ASN1_STRING */ |
