utils/asn1: avoid undefined behaviour warning
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Sat, 5 Sep 2020 21:35:49 +0000 (09:35 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 11 Sep 2020 05:05:59 +0000 (05:05 +0000)
UBSAN does not like an int >= 1<<24 being shifted left.
We check the overflow in the very next line.

Credit to OSS-Fuzz.

REF: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25436

Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Autobuild-User(master): Andrew Bartlett <abartlet@samba.org>
Autobuild-Date(master): Fri Sep 11 05:05:59 UTC 2020 on sn-devel-184

lib/util/asn1.c

index 6b1b4bc2877fe9fcb6609b55b5a8b953897b4318..9ab9e1b08449c941be85a81c85b94ae3e08cbd6e 100644 (file)
@@ -1071,7 +1071,11 @@ bool asn1_read_enumerated(struct asn1_data *data, int *v)
                        data->has_error = true;
                        return false;
                }
-               *v = (*v << 8) + b;
+               /*
+                * To please/fool the Undefined Behaviour Sanitizer we cast to
+                * unsigned for the left shift.
+                */
+               *v = ((unsigned int)*v << 8) + b;
                if (*v < 0) {
                        /* ASN1_ENUMERATED can't be -ve. */
                        data->has_error = true;