Fix ubsan error in EphemeralKeyExchangeCipherGroups::Update
In the current code the end iterator of a vector can be passed to the
single-argument variant of std::vector::erase, which is not allowed.
When removing elements using std::remove_if we need to use the two-arg
variant instead.
Detected via the EphemeralKeyExchangeCipherGroupsTest.Update test case
which triggered a nullptr-with-nonzero-offset ubsan error under OpenSSL.
Bug: webrtc:404763475
Change-Id: I9f2a28608c4bc7142783c94c0f931ac91ee43132
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/402643
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Joachim Reiersen <joachimr@meta.com>
Reviewed-by: Jonas Oreland <jonaso@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45285}
diff --git a/api/crypto/crypto_options.cc b/api/crypto/crypto_options.cc
index c83e110..4c2d49c 100644
--- a/api/crypto/crypto_options.cc
+++ b/api/crypto/crypto_options.cc
@@ -127,16 +127,22 @@
field_trials);
// Remove all disabled.
if (disabled_groups) {
- default_groups.erase(std::remove_if(
- default_groups.begin(), default_groups.end(), [&](uint16_t val) {
- return std::find(disabled_groups->begin(), disabled_groups->end(),
- val) != disabled_groups->end();
- }));
- enabled_.erase(
- std::remove_if(enabled_.begin(), enabled_.end(), [&](uint16_t val) {
- return std::find(disabled_groups->begin(), disabled_groups->end(),
- val) != disabled_groups->end();
- }));
+ default_groups.erase(
+ std::remove_if(default_groups.begin(), default_groups.end(),
+ [&](uint16_t val) {
+ return std::find(disabled_groups->begin(),
+ disabled_groups->end(),
+ val) != disabled_groups->end();
+ }),
+ default_groups.end());
+ enabled_.erase(std::remove_if(enabled_.begin(), enabled_.end(),
+ [&](uint16_t val) {
+ return std::find(disabled_groups->begin(),
+ disabled_groups->end(),
+ val) !=
+ disabled_groups->end();
+ }),
+ enabled_.end());
}
// Add those enabled by field-trials first.