Skip to content

Commit 7ee750f

Browse files
krockotmibrunin
authored andcommitted
[Backport] CVE-2021-21207: Use after free in IndexedDB
Manual backport and adaptation to BindingSet of patch originally reviewed on https://chromium-review.googlesource.com/c/chromium/src/+/2778871: Never fail in ReceiverSet::Add Because of how UniqueReceiverSet is implemented and used, it is dangerous to allow Add() to fail: callers reasonably assume that added objects are still alive immediately after the Add() call. This changes ReceiverId to a uint64 and simply CHECK-fails on insert collision. This fundamentally increases binary size of 32-bit builds, because a widely used 32-bit data type is expanding to 64 bits for the sake of security and stability. It is effectively unavoidable for now, and also just barely above the tolerable threshold. A follow-up (but less backwards-mergeable) change should be able to reduce binary size beyond this increase by consolidating shared code among ReceiverSet template instantiations. Fixed: 1185732 Change-Id: I9acf6aaaa36e10fdce5aa49a890173caddc13c52 Binary-Size: Unavoidable (see above) Commit-Queue: Ken Rockot <rockot@google.com> Auto-Submit: Ken Rockot <rockot@google.com> Reviewed-by: Robert Sesek <rsesek@chromium.org> Cr-Commit-Position: refs/heads/master@{#865815} Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
1 parent 4bf755e commit 7ee750f

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

chromium/mojo/public/cpp/bindings/binding_set.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ struct BindingSetTraits<Binding<Interface, ImplRefTraits>> {
3535
}
3636
};
3737

38-
using BindingId = size_t;
38+
using BindingId = uint64_t;
3939

4040
template <typename ContextType>
4141
struct BindingSetContextTraits {
@@ -279,10 +279,10 @@ class BindingSetBase {
279279
RequestType request,
280280
Context context) {
281281
BindingId id = next_binding_id_++;
282-
DCHECK_GE(next_binding_id_, 0u);
283282
auto entry = std::make_unique<Entry>(std::move(impl), std::move(request),
284283
this, id, std::move(context));
285-
bindings_.insert(std::make_pair(id, std::move(entry)));
284+
auto result = bindings_.insert(std::make_pair(id, std::move(entry)));
285+
CHECK(result.second) << "BindingId overflow with collision";
286286
return id;
287287
}
288288

0 commit comments

Comments
 (0)