summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2018-10-31 16:12:03 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2018-10-31 16:12:03 +0000
commit0a33671efe66dc24060d16af0a212e7b081409ab (patch)
tree62869f6705222c369d9669b327dd0fbe2a6ab154
parentb22db0fda0d051fb2d7f01b4a281034b07aff6ac (diff)
parent30ad2abfa76f4297449cfe8332ad7aba4cc0e310 (diff)
Merge "Fix use after free issue found with ASAN build"
-rw-r--r--libs/graphicsenv/GraphicsEnv.cpp37
-rw-r--r--libs/graphicsenv/include/graphicsenv/GraphicsEnv.h28
-rw-r--r--opengl/libs/EGL/Loader.cpp19
-rw-r--r--opengl/libs/EGL/egl_display.cpp2
-rw-r--r--opengl/libs/EGL/egl_layers.cpp6
5 files changed, 19 insertions, 73 deletions
diff --git a/libs/graphicsenv/GraphicsEnv.cpp b/libs/graphicsenv/GraphicsEnv.cpp
index 024d72b8d6..8661401021 100644
--- a/libs/graphicsenv/GraphicsEnv.cpp
+++ b/libs/graphicsenv/GraphicsEnv.cpp
@@ -145,11 +145,11 @@ long GraphicsEnv::getAngleRulesLength() {
return mAngleRulesLength;
}
-const std::string GraphicsEnv::getLayerPaths(){
+const std::string& GraphicsEnv::getLayerPaths() {
return mLayerPaths;
}
-const std::string GraphicsEnv::getDebugLayers() {
+const std::string& GraphicsEnv::getDebugLayers() {
return mDebugLayers;
}
@@ -196,36 +196,3 @@ android_namespace_t* GraphicsEnv::getAngleNamespace() {
}
} // namespace android
-
-extern "C" {
-android_namespace_t* android_getDriverNamespace() {
- return android::GraphicsEnv::getInstance().getDriverNamespace();
-}
-android_namespace_t* android_getAngleNamespace() {
- return android::GraphicsEnv::getInstance().getAngleNamespace();
-}
-const char* android_getAngleAppName() {
- return android::GraphicsEnv::getInstance().getAngleAppName();
-}
-bool android_getAngleDeveloperOptIn() {
- return android::GraphicsEnv::getInstance().getAngleDeveloperOptIn();
-}
-const char* android_getAngleAppPref() {
- return android::GraphicsEnv::getInstance().getAngleAppPref();
-}
-int android_getAngleRulesFd() {
- return android::GraphicsEnv::getInstance().getAngleRulesFd();
-}
-long android_getAngleRulesOffset() {
- return android::GraphicsEnv::getInstance().getAngleRulesOffset();
-}
-long android_getAngleRulesLength() {
- return android::GraphicsEnv::getInstance().getAngleRulesLength();
-}
-const char* android_getLayerPaths() {
- return android::GraphicsEnv::getInstance().getLayerPaths().c_str();
-}
-const char* android_getDebugLayers() {
- return android::GraphicsEnv::getInstance().getDebugLayers().c_str();
-}
-}
diff --git a/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h b/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h
index 404823abf0..10c2549227 100644
--- a/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h
+++ b/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h
@@ -58,10 +58,10 @@ public:
void setLayerPaths(NativeLoaderNamespace* appNamespace, const std::string layerPaths);
NativeLoaderNamespace* getAppNamespace();
- const std::string getLayerPaths();
+ const std::string& getLayerPaths();
void setDebugLayers(const std::string layers);
- const std::string getDebugLayers();
+ const std::string& getDebugLayers();
private:
GraphicsEnv() = default;
@@ -82,28 +82,4 @@ private:
} // namespace android
-/* FIXME
- * Export an un-mangled function that just does
- * return android::GraphicsEnv::getInstance().getDriverNamespace();
- * This allows libEGL to get the function pointer via dlsym, since it can't
- * directly link against libgui. In a future release, we'll fix this so that
- * libgui does not depend on graphics API libraries, and libEGL can link
- * against it. The current dependencies from libgui -> libEGL are:
- * - the GLConsumer class, which should be moved to its own library
- * - the EGLsyncKHR synchronization in BufferQueue, which is deprecated and
- * will be removed soon.
- */
-extern "C" {
- android_namespace_t* android_getDriverNamespace();
- android_namespace_t* android_getAngleNamespace();
- const char* android_getAngleAppName();
- const char* android_getAngleAppPref();
- bool android_getAngleDeveloperOptIn();
- int android_getAngleRulesFd();
- long android_getAngleRulesOffset();
- long android_getAngleRulesLength();
- const char* android_getLayerPaths();
- const char* android_getDebugLayers();
-}
-
#endif // ANDROID_UI_GRAPHICS_ENV_H
diff --git a/opengl/libs/EGL/Loader.cpp b/opengl/libs/EGL/Loader.cpp
index 6624976c4f..922be02cda 100644
--- a/opengl/libs/EGL/Loader.cpp
+++ b/opengl/libs/EGL/Loader.cpp
@@ -529,12 +529,12 @@ static void* load_angle(const char* kind, android_namespace_t* ns, egl_connectio
std::string name;
char prop[PROPERTY_VALUE_MAX];
- const char* app_name = android_getAngleAppName();
- const char* app_pref = android_getAngleAppPref();
- bool developer_opt_in = android_getAngleDeveloperOptIn();
- const int rules_fd = android_getAngleRulesFd();
- const long rules_offset = android_getAngleRulesOffset();
- const long rules_length = android_getAngleRulesLength();
+ const char* app_name = android::GraphicsEnv::getInstance().getAngleAppName();
+ const char* app_pref = android::GraphicsEnv::getInstance().getAngleAppPref();
+ bool developer_opt_in = android::GraphicsEnv::getInstance().getAngleDeveloperOptIn();
+ const int rules_fd = android::GraphicsEnv::getInstance().getAngleRulesFd();
+ const long rules_offset = android::GraphicsEnv::getInstance().getAngleRulesOffset();
+ const long rules_length = android::GraphicsEnv::getInstance().getAngleRulesLength();
// Determine whether or not to use ANGLE:
ANGLEPreference developer_option = developer_opt_in ? ANGLE_PREFER_ANGLE : ANGLE_NO_PREFERENCE;
@@ -596,7 +596,8 @@ static void* load_angle(const char* kind, android_namespace_t* ns, egl_connectio
fpANGLEUseForApplication ANGLEUseForApplication =
(fpANGLEUseForApplication)dlsym(so, "ANGLEUseForApplication");
if (ANGLEUseForApplication) {
- ANGLEPreference app_preference = getAnglePref(android_getAngleAppPref());
+ ANGLEPreference app_preference =
+ getAnglePref(android::GraphicsEnv::getInstance().getAngleAppPref());
use_angle = (ANGLEUseForApplication)(app_name_str.c_str(), manufacturer, model,
developer_option, app_preference);
ALOGV("Result of opt-in/out logic is %s", use_angle ? "true" : "false");
@@ -688,13 +689,13 @@ void *Loader::load_driver(const char* kind,
ATRACE_CALL();
void* dso = nullptr;
- android_namespace_t* ns = android_getAngleNamespace();
+ android_namespace_t* ns = android::GraphicsEnv::getInstance().getAngleNamespace();
if (ns) {
dso = load_angle(kind, ns, cnx);
}
#ifndef __ANDROID_VNDK__
if (!dso) {
- android_namespace_t* ns = android_getDriverNamespace();
+ android_namespace_t* ns = android::GraphicsEnv::getInstance().getDriverNamespace();
if (ns) {
dso = load_updated_driver(kind, ns);
}
diff --git a/opengl/libs/EGL/egl_display.cpp b/opengl/libs/EGL/egl_display.cpp
index 113f0a6170..94af2e7bb0 100644
--- a/opengl/libs/EGL/egl_display.cpp
+++ b/opengl/libs/EGL/egl_display.cpp
@@ -167,7 +167,7 @@ static bool addAnglePlatformAttributes(egl_connection_t* const cnx,
// Initialize function ptrs for ANGLE PlatformMethods struct, used for systrace
bool initializeAnglePlatform(EGLDisplay dpy) {
// Since we're inside libEGL, use dlsym to lookup fptr for ANGLEGetDisplayPlatform
- android_namespace_t* ns = android_getAngleNamespace();
+ android_namespace_t* ns = android::GraphicsEnv::getInstance().getAngleNamespace();
const android_dlextinfo dlextinfo = {
.flags = ANDROID_DLEXT_USE_NAMESPACE,
.library_namespace = ns,
diff --git a/opengl/libs/EGL/egl_layers.cpp b/opengl/libs/EGL/egl_layers.cpp
index 6900b8b464..e4906e08c4 100644
--- a/opengl/libs/EGL/egl_layers.cpp
+++ b/opengl/libs/EGL/egl_layers.cpp
@@ -145,7 +145,7 @@ const char kSystemLayerLibraryDir[] = "/data/local/debug/gles";
std::string LayerLoader::GetDebugLayers() {
// Layers can be specified at the Java level in GraphicsEnvironemnt
// gpu_debug_layers = layer1:layer2:layerN
- std::string debug_layers = android_getDebugLayers();
+ std::string debug_layers = android::GraphicsEnv::getInstance().getDebugLayers();
if (debug_layers.empty()) {
// Only check system properties if Java settings are empty
@@ -339,7 +339,9 @@ void LayerLoader::LoadLayers() {
// Load the layers in reverse order so we start with the driver's entrypoint and work our way up
for (int32_t i = layers.size() - 1; i >= 0; i--) {
// Check each layer path for the layer
- std::vector<std::string> paths = android::base::Split(android_getLayerPaths(), ":");
+ std::vector<std::string> paths =
+ android::base::Split(android::GraphicsEnv::getInstance().getLayerPaths().c_str(),
+ ":");
if (!system_path.empty()) {
// Prepend the system paths so they override other layers