summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authortb <>2023-07-09 19:22:43 +0000
committertb <>2023-07-09 19:22:43 +0000
commitbd05409c6b5fc0f1d355d8a0a383f325306b0d4f (patch)
tree0722cc48611bcbbb8daa2bd8351b49f109c90264 /src/lib
parentc3a5f55cf5c07f2337c53a10e83c3d52de255ed9 (diff)
downloadopenbsd-bd05409c6b5fc0f1d355d8a0a383f325306b0d4f.tar.gz
openbsd-bd05409c6b5fc0f1d355d8a0a383f325306b0d4f.tar.bz2
openbsd-bd05409c6b5fc0f1d355d8a0a383f325306b0d4f.zip
Fix ndef_{prefix,suffix}()
These functions inline a poor version of asn1_item_flags_i2d() without error checks. This can be replaced with a single correct call to ASN1_item_ndef_i2d(). Mechanically adding malloc checks and checks for negative did not really improve things all that much in a related project. ok beck jsing
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/asn1/bio_ndef.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/src/lib/libcrypto/asn1/bio_ndef.c b/src/lib/libcrypto/asn1/bio_ndef.c
index d0329ede8f..11e51edade 100644
--- a/src/lib/libcrypto/asn1/bio_ndef.c
+++ b/src/lib/libcrypto/asn1/bio_ndef.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: bio_ndef.c,v 1.22 2023/04/25 19:08:30 tb Exp $ */ 1/* $OpenBSD: bio_ndef.c,v 1.23 2023/07/09 19:22:43 tb Exp $ */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project. 3 * project.
4 */ 4 */
@@ -171,7 +171,7 @@ static int
171ndef_prefix(BIO *b, unsigned char **pbuf, int *plen, void *parg) 171ndef_prefix(BIO *b, unsigned char **pbuf, int *plen, void *parg)
172{ 172{
173 NDEF_SUPPORT *ndef_aux; 173 NDEF_SUPPORT *ndef_aux;
174 unsigned char *p; 174 unsigned char *p = NULL;
175 int derlen; 175 int derlen;
176 176
177 if (!parg) 177 if (!parg)
@@ -179,13 +179,13 @@ ndef_prefix(BIO *b, unsigned char **pbuf, int *plen, void *parg)
179 179
180 ndef_aux = *(NDEF_SUPPORT **)parg; 180 ndef_aux = *(NDEF_SUPPORT **)parg;
181 181
182 derlen = ASN1_item_ndef_i2d(ndef_aux->val, NULL, ndef_aux->it); 182 if ((derlen = ASN1_item_ndef_i2d(ndef_aux->val, &p, ndef_aux->it)) <= 0)
183 p = malloc(derlen); 183 return 0;
184
184 ndef_aux->derbuf = p; 185 ndef_aux->derbuf = p;
185 *pbuf = p; 186 *pbuf = p;
186 derlen = ASN1_item_ndef_i2d(ndef_aux->val, &p, ndef_aux->it);
187 187
188 if (!*ndef_aux->boundary) 188 if (*ndef_aux->boundary == NULL)
189 return 0; 189 return 0;
190 190
191 *plen = *ndef_aux->boundary - *pbuf; 191 *plen = *ndef_aux->boundary - *pbuf;
@@ -231,7 +231,7 @@ static int
231ndef_suffix(BIO *b, unsigned char **pbuf, int *plen, void *parg) 231ndef_suffix(BIO *b, unsigned char **pbuf, int *plen, void *parg)
232{ 232{
233 NDEF_SUPPORT *ndef_aux; 233 NDEF_SUPPORT *ndef_aux;
234 unsigned char *p; 234 unsigned char *p = NULL;
235 int derlen; 235 int derlen;
236 const ASN1_AUX *aux; 236 const ASN1_AUX *aux;
237 ASN1_STREAM_ARG sarg; 237 ASN1_STREAM_ARG sarg;
@@ -251,14 +251,15 @@ ndef_suffix(BIO *b, unsigned char **pbuf, int *plen, void *parg)
251 &ndef_aux->val, ndef_aux->it, &sarg) <= 0) 251 &ndef_aux->val, ndef_aux->it, &sarg) <= 0)
252 return 0; 252 return 0;
253 253
254 derlen = ASN1_item_ndef_i2d(ndef_aux->val, NULL, ndef_aux->it); 254 if ((derlen = ASN1_item_ndef_i2d(ndef_aux->val, &p, ndef_aux->it)) <= 0)
255 p = malloc(derlen); 255 return 0;
256
256 ndef_aux->derbuf = p; 257 ndef_aux->derbuf = p;
257 *pbuf = p; 258 *pbuf = p;
258 derlen = ASN1_item_ndef_i2d(ndef_aux->val, &p, ndef_aux->it);
259 259
260 if (!*ndef_aux->boundary) 260 if (*ndef_aux->boundary == NULL)
261 return 0; 261 return 0;
262
262 *pbuf = *ndef_aux->boundary; 263 *pbuf = *ndef_aux->boundary;
263 *plen = derlen - (*ndef_aux->boundary - ndef_aux->derbuf); 264 *plen = derlen - (*ndef_aux->boundary - ndef_aux->derbuf);
264 265