transform/BindingRemapper: Validate access mode

Ensure that remapped access modes are valid enum values.

NB: This is hard to test, as UBSan flags an out-of-range enum value as
a hard error.

Fixed: chromium:1248754, chromium:1248755
Change-Id: I2e686843134e6a285fb8316a1960fc4eadff2a93
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/64120
Auto-Submit: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
This commit is contained in:
James Price 2021-09-13 14:58:39 +00:00 committed by Tint LUCI CQ
parent 2ebcb93cb3
commit f66f651374
2 changed files with 11 additions and 2 deletions

View File

@ -24,13 +24,15 @@ namespace ast {
/// The access control settings /// The access control settings
enum Access { enum Access {
/// Not declared in the source /// Not declared in the source
kUndefined, kUndefined = 0,
/// Read only /// Read only
kRead, kRead,
/// Write only /// Write only
kWrite, kWrite,
/// Read write /// Read write
kReadWrite kReadWrite,
// Last valid access mode
kLastValid = kReadWrite,
}; };
/// @param out the std::ostream to write to /// @param out the std::ostream to write to

View File

@ -113,6 +113,13 @@ void BindingRemapper::Run(CloneContext& ctx, const DataMap& inputs, DataMap&) {
auto ac_it = remappings->access_controls.find(from); auto ac_it = remappings->access_controls.find(from);
if (ac_it != remappings->access_controls.end()) { if (ac_it != remappings->access_controls.end()) {
ast::Access ac = ac_it->second; ast::Access ac = ac_it->second;
if (ac > ast::Access::kLastValid) {
ctx.dst->Diagnostics().add_error(
diag::System::Transform,
"invalid access mode (" +
std::to_string(static_cast<uint32_t>(ac)) + ")");
return;
}
auto* sem = ctx.src->Sem().Get(var); auto* sem = ctx.src->Sem().Get(var);
if (sem->StorageClass() != ast::StorageClass::kStorage) { if (sem->StorageClass() != ast::StorageClass::kStorage) {
ctx.dst->Diagnostics().add_error( ctx.dst->Diagnostics().add_error(