summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/asn_pack.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libcrypto/asn1/asn_pack.c24
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;
156err:
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;
195err:
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 */