summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2023-06-23 10:48:40 +0000
committertb <>2023-06-23 10:48:40 +0000
commit7dcef4f02ec5e543cc1748a3a8489a53576f18ec (patch)
tree67c5a0de710d097470e85a35c2df241dea7f9da7 /src
parent2f3a5c0440f7a0fcfdb5ed793f0f77b9d8af078c (diff)
downloadopenbsd-7dcef4f02ec5e543cc1748a3a8489a53576f18ec.tar.gz
openbsd-7dcef4f02ec5e543cc1748a3a8489a53576f18ec.tar.bz2
openbsd-7dcef4f02ec5e543cc1748a3a8489a53576f18ec.zip
Avoid crash in BN_asc2bn()
Historically (and currently in OpenSSL), BN_asc2bn() could be called with NULL, but only for positive numbers. So BN_asc2bn(NULL, "1") would succeed but BN_asc2bn(NULL, "-1"), would crash. The other *2bn functions return a length, so accepting a NULL makes some sense since it allows callers to skip over part of the string just parsed (atoi-style). For BN_asc2bn() a NULL bn makes no sense because it returns a boolean. The recent CBS rewrite makes BN_asc2bn(NULL, *) always crash which in turn made Coverity throw a fit. Another change of behavior from that rewrite pertains to accidents (or is it madness?) like -0x-11 and 0x-11 being parsed as decimal -17 (which Ingo of course spotted and diligently documented). This will be addressed later. ok jsing
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/bn/bn_convert.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/lib/libcrypto/bn/bn_convert.c b/src/lib/libcrypto/bn/bn_convert.c
index 9ad9f58f93..4736099cdc 100644
--- a/src/lib/libcrypto/bn/bn_convert.c
+++ b/src/lib/libcrypto/bn/bn_convert.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: bn_convert.c,v 1.11 2023/06/23 10:33:12 tb Exp $ */ 1/* $OpenBSD: bn_convert.c,v 1.12 2023/06/23 10:48:40 tb Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -301,7 +301,8 @@ BN_asc2bn(BIGNUM **bnp, const char *s)
301 return 0; 301 return 0;
302 302
303 done: 303 done:
304 BN_set_negative(*bnp, neg); 304 if (bnp != NULL && *bnp != NULL)
305 BN_set_negative(*bnp, neg);
305 306
306 return 1; 307 return 1;
307} 308}