Test index-out-of-bounds in Features::to_context

When there are fewer known `from` feature bytes than known `to` feature
bytes, an index-out-of-bounds error can occur if the `from` features
have unknown features set in a byte past the greatest known `from`
feature byte.
This commit is contained in:
Jeffrey Czyz 2021-07-14 16:18:33 -07:00
parent 06ecbecd6d
commit 87233488cc
No known key found for this signature in database
GPG key ID: 3A4E08275D5E96D2

View file

@ -301,7 +301,7 @@ mod sealed {
set_shutdown_any_segwit_required);
#[cfg(test)]
define_feature!(123456789, UnknownFeature, [NodeContext, ChannelContext],
define_feature!(123456789, UnknownFeature, [NodeContext, ChannelContext, InvoiceContext],
"Feature flags for an unknown feature used in testing.", set_unknown_feature_optional,
set_unknown_feature_required);
}
@ -774,6 +774,16 @@ mod tests {
assert!(!init_features.supports_gossip_queries());
}
#[test]
fn convert_to_context_with_unknown_flags() {
// Ensure the `from` context has fewer known feature bytes than the `to` context.
assert!(InvoiceFeatures::known().byte_count() < NodeFeatures::known().byte_count());
let invoice_features = InvoiceFeatures::known().set_unknown_feature_optional();
assert!(invoice_features.supports_unknown_bits());
let node_features: NodeFeatures = invoice_features.to_context();
assert!(!node_features.supports_unknown_bits());
}
#[test]
fn set_feature_bits() {
let features = InvoiceFeatures::empty()