diff options
author | miod <> | 2014-05-15 21:07:10 +0000 |
---|---|---|
committer | miod <> | 2014-05-15 21:07:10 +0000 |
commit | 2e447a2a0b77b6aa9627ba1c455ce9c3b4c8ace7 (patch) | |
tree | 9fcab74eb7b14bf3b8728465d8f8ef2f7589164c /src/lib/libcrypto/asn1/asn_pack.c | |
parent | ce07241b92b5b1b9d60acb439c3d18e00a563d55 (diff) | |
download | openbsd-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.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 */ |