From 0098a49d7f3e76832151134749cae2b65b47ed1d Mon Sep 17 00:00:00 2001 From: jsing <> Date: Wed, 13 Jul 2022 20:07:44 +0000 Subject: Cast int64_t to uint64_t before negating. Avoid undefined behaviour/integer overflow by casting an int64_t to uint64_t before negating. Fixes oss-fuzz #49043 ok tb@ --- src/lib/libcrypto/asn1/a_int.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/lib/libcrypto/asn1/a_int.c b/src/lib/libcrypto/asn1/a_int.c index 1f1e587d39..d7790c787d 100644 --- a/src/lib/libcrypto/asn1/a_int.c +++ b/src/lib/libcrypto/asn1/a_int.c @@ -1,4 +1,4 @@ -/* $OpenBSD: a_int.c,v 1.43 2022/07/09 14:46:42 tb Exp $ */ +/* $OpenBSD: a_int.c,v 1.44 2022/07/13 20:07:44 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -282,14 +282,18 @@ ASN1_INTEGER_get_int64(int64_t *out_val, const ASN1_INTEGER *aint) int ASN1_INTEGER_set_int64(ASN1_INTEGER *aint, int64_t val) { + uint64_t uval; + asn1_aint_clear(aint); + uval = (uint64_t)val; + if (val < 0) { aint->type = V_ASN1_NEG_INTEGER; - val = -val; + uval = -uval; } - return asn1_aint_set_uint64((uint64_t)val, &aint->data, &aint->length); + return asn1_aint_set_uint64(uval, &aint->data, &aint->length); } long -- cgit v1.2.3-55-g6feb