crypto/asn1 represents an ASN.1 NULL value as a non-null ASN1_NULL* pointer, (ASN1_NULL*)1. It is a non-null pointer because a null pointer represents an omitted OPTIONAL NULL. It is an opaque pointer because there is no sense in allocating anything. This pointer cannot be dereferenced, yet ASN1_NULL is a typedef for int. This is confusing and probably undefined behavior. (N1548, 6.3.2.3, clause 7 requires pointer conversions between two pointer types be correctly aligned, even if the pointer is never dereferenced. Strangely, clause 5 above does not impose the same requirement when converting from integer to pointer, though it mostly punts to the implementation definition.) Of course, all of tasn_*.c is a giant strict aliasing violation anyway, but an opaque struct pointer is a slightly better choice here. (Note that, although ASN1_BOOLEAN is also a typedef for int, that situation is different: the ASN1_BOOLEAN representation is a plain ASN1_BOOLEAN, not ASN1_BOOLEAN*, while the ASN1_NULL representation is a pointer. ASN1_NULL could have had the same treatment and even used a little less memory, but changing that would break the API.) Update-Note: Code that was assuming ASN1_NULL was an int typedef will fail to compile. Given this was never dereferencable, it is hard to imagine anything relying on this. Bug: 438 Change-Id: Ia0c652eed66e76f82a3843af1fc877f06c8d5e8f Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/49805 Reviewed-by: Adam Langley <agl@google.com>grpc-202302
parent
f5e601275c
commit
a406ad76ad
2 changed files with 53 additions and 1 deletions
Loading…
Reference in new issue