Hash :
a4a52f78
Author :
Date :
2021-11-10T12:43:37
EGL: Validate CreatePbufferSurface attributes. This fixes an ASAN issue with a dEQP negative test: dEQP.EGL/functional_negative_api_create_pbuffer_surface Bug: angleproject:6660 Change-Id: I2d052f9f948b7a2a6fe3fbb1f1621dd280bb0d36 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3270978 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
//
// Copyright 2014 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
#include "libANGLE/AttributeMap.h"
#include "common/debug.h"
namespace egl
{
AttributeMap::AttributeMap() = default;
AttributeMap::AttributeMap(const AttributeMap &other) = default;
AttributeMap &AttributeMap::operator=(const AttributeMap &other) = default;
AttributeMap::~AttributeMap() = default;
void AttributeMap::insert(EGLAttrib key, EGLAttrib value)
{
mValidatedAttributes[key] = value;
}
bool AttributeMap::contains(EGLAttrib key) const
{
return (attribs().find(key) != attribs().end());
}
EGLAttrib AttributeMap::get(EGLAttrib key) const
{
auto iter = attribs().find(key);
ASSERT(iter != attribs().end());
return iter->second;
}
EGLAttrib AttributeMap::get(EGLAttrib key, EGLAttrib defaultValue) const
{
auto iter = attribs().find(key);
return (iter != attribs().end()) ? iter->second : defaultValue;
}
EGLint AttributeMap::getAsInt(EGLAttrib key) const
{
return static_cast<EGLint>(get(key));
}
EGLint AttributeMap::getAsInt(EGLAttrib key, EGLint defaultValue) const
{
return static_cast<EGLint>(get(key, static_cast<EGLAttrib>(defaultValue)));
}
bool AttributeMap::isEmpty() const
{
return attribs().empty();
}
std::vector<EGLint> AttributeMap::toIntVector() const
{
std::vector<EGLint> ret;
for (const auto &pair : attribs())
{
ret.push_back(static_cast<EGLint>(pair.first));
ret.push_back(static_cast<EGLint>(pair.second));
}
ret.push_back(EGL_NONE);
return ret;
}
AttributeMap::const_iterator AttributeMap::begin() const
{
return attribs().begin();
}
AttributeMap::const_iterator AttributeMap::end() const
{
return attribs().end();
}
bool AttributeMap::validate(const ValidationContext *val,
const egl::Display *display,
AttributeValidationFunc validationFunc) const
{
if (mIntPointer)
{
for (const EGLint *curAttrib = mIntPointer; curAttrib[0] != EGL_NONE; curAttrib += 2)
{
if (!validationFunc(val, display, curAttrib[0]))
{
return false;
}
mValidatedAttributes[static_cast<EGLAttrib>(curAttrib[0])] =
static_cast<EGLAttrib>(curAttrib[1]);
}
mIntPointer = nullptr;
}
if (mAttribPointer)
{
for (const EGLAttrib *curAttrib = mAttribPointer; curAttrib[0] != EGL_NONE; curAttrib += 2)
{
if (!validationFunc(val, display, curAttrib[0]))
{
return false;
}
mValidatedAttributes[curAttrib[0]] = curAttrib[1];
}
mAttribPointer = nullptr;
}
return true;
}
void AttributeMap::initializeWithoutValidation() const
{
auto alwaysTrue = [](const ValidationContext *, const egl::Display *, EGLAttrib) {
return true;
};
(void)validate(nullptr, nullptr, alwaysTrue);
}
// static
AttributeMap AttributeMap::CreateFromIntArray(const EGLint *attributes)
{
AttributeMap map;
map.mIntPointer = attributes;
return map;
}
// static
AttributeMap AttributeMap::CreateFromAttribArray(const EGLAttrib *attributes)
{
AttributeMap map;
map.mAttribPointer = attributes;
return map;
}
bool AttributeMap::isValidated() const
{
return mIntPointer == nullptr && mAttribPointer == nullptr;
}
} // namespace egl