summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/asn_pack.c
diff options
context:
space:
mode:
authormiod <>2014-05-15 21:07:10 +0000
committermiod <>2014-05-15 21:07:10 +0000
commit2e447a2a0b77b6aa9627ba1c455ce9c3b4c8ace7 (patch)
tree9fcab74eb7b14bf3b8728465d8f8ef2f7589164c /src/lib/libcrypto/asn1/asn_pack.c
parentce07241b92b5b1b9d60acb439c3d18e00a563d55 (diff)
downloadopenbsd-2e447a2a0b77b6aa9627ba1c455ce9c3b4c8ace7.tar.gz
openbsd-2e447a2a0b77b6aa9627ba1c455ce9c3b4c8ace7.tar.bz2
openbsd-2e447a2a0b77b6aa9627ba1c455ce9c3b4c8ace7.zip
Fix memory leaks upon failure.
ok beck@
Diffstat (limited to 'src/lib/libcrypto/asn1/asn_pack.c')
-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 */