ad9eee1628
Child and root CBBs share a type, but are different kinds of things. C++ programmers sometimes mistakenly believe they should use ScopedCBB for everything. This mostly works because we NULL cbb->child->base on flush, making CBB_cleanup a no-op. This zeroing also skips the assert in CBB_cleanup. (If we ran it unconditionally, CBB_zero + CBB_cleanup would not work.) However, if a CBB operation fails and a function returns early, the child CBB is not cleared. ScopedCBB will then call CBB_cleanup which trips the assert but, in release build, misbehaves. Run the assert unconditionally and, when the assert fails, still behave well. To make this work with CBB_zero, negate is_top_level to is_child, so a flushed child CBB and a (presumably) root CBB in the zero state are distinguishable. Update-Note: Code that was using CBB wrong may trip an assert in debug builds. Change-Id: Ifea7759e1d0331f2e727c59bbafa355d70fb9dba Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/35524 Reviewed-by: Adam Langley <agl@google.com> |
||
---|---|---|
.. | ||
asn1_compat.c | ||
ber.c | ||
bytestring_test.cc | ||
cbb.c | ||
cbs.c | ||
internal.h | ||
unicode.c |