am 6b3ce09d: Merge "fix crash when validating an invalid EGL objects" into ics-mr1
* commit '6b3ce09d37fdb53a3a32e688017a5b343398c03b': fix crash when validating an invalid EGL objects
This commit is contained in:
@@ -212,16 +212,20 @@ egl_connection_t* validate_display_config(EGLDisplay dpy, EGLConfig config,
|
|||||||
|
|
||||||
EGLImageKHR egl_get_image_for_current_context(EGLImageKHR image)
|
EGLImageKHR egl_get_image_for_current_context(EGLImageKHR image)
|
||||||
{
|
{
|
||||||
ImageRef _i(image);
|
|
||||||
if (!_i.get())
|
|
||||||
return EGL_NO_IMAGE_KHR;
|
|
||||||
|
|
||||||
EGLContext context = egl_tls_t::getContext();
|
EGLContext context = egl_tls_t::getContext();
|
||||||
if (context == EGL_NO_CONTEXT || image == EGL_NO_IMAGE_KHR)
|
if (context == EGL_NO_CONTEXT || image == EGL_NO_IMAGE_KHR)
|
||||||
return EGL_NO_IMAGE_KHR;
|
return EGL_NO_IMAGE_KHR;
|
||||||
|
|
||||||
egl_context_t const * const c = get_context(context);
|
egl_context_t const * const c = get_context(context);
|
||||||
if (c == NULL) // this should never happen
|
if (c == NULL) // this should never happen, by construction
|
||||||
|
return EGL_NO_IMAGE_KHR;
|
||||||
|
|
||||||
|
egl_display_t* display = egl_display_t::get(c->dpy);
|
||||||
|
if (display == NULL) // this should never happen, by construction
|
||||||
|
return EGL_NO_IMAGE_KHR;
|
||||||
|
|
||||||
|
ImageRef _i(display, image);
|
||||||
|
if (!_i.get())
|
||||||
return EGL_NO_IMAGE_KHR;
|
return EGL_NO_IMAGE_KHR;
|
||||||
|
|
||||||
// here we don't validate the context because if it's been marked for
|
// here we don't validate the context because if it's been marked for
|
||||||
|
|||||||
@@ -451,7 +451,7 @@ EGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
|
|||||||
egl_display_t const * const dp = validate_display(dpy);
|
egl_display_t const * const dp = validate_display(dpy);
|
||||||
if (!dp) return EGL_FALSE;
|
if (!dp) return EGL_FALSE;
|
||||||
|
|
||||||
SurfaceRef _s(surface);
|
SurfaceRef _s(dp, surface);
|
||||||
if (!_s.get())
|
if (!_s.get())
|
||||||
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
||||||
|
|
||||||
@@ -472,7 +472,7 @@ EGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface surface,
|
|||||||
egl_display_t const * const dp = validate_display(dpy);
|
egl_display_t const * const dp = validate_display(dpy);
|
||||||
if (!dp) return EGL_FALSE;
|
if (!dp) return EGL_FALSE;
|
||||||
|
|
||||||
SurfaceRef _s(surface);
|
SurfaceRef _s(dp, surface);
|
||||||
if (!_s.get())
|
if (!_s.get())
|
||||||
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
||||||
|
|
||||||
@@ -541,7 +541,7 @@ EGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
|
|||||||
if (!dp)
|
if (!dp)
|
||||||
return EGL_FALSE;
|
return EGL_FALSE;
|
||||||
|
|
||||||
ContextRef _c(ctx);
|
ContextRef _c(dp, ctx);
|
||||||
if (!_c.get())
|
if (!_c.get())
|
||||||
return setError(EGL_BAD_CONTEXT, EGL_FALSE);
|
return setError(EGL_BAD_CONTEXT, EGL_FALSE);
|
||||||
|
|
||||||
@@ -592,9 +592,9 @@ EGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// get a reference to the object passed in
|
// get a reference to the object passed in
|
||||||
ContextRef _c(ctx);
|
ContextRef _c(dp, ctx);
|
||||||
SurfaceRef _d(draw);
|
SurfaceRef _d(dp, draw);
|
||||||
SurfaceRef _r(read);
|
SurfaceRef _r(dp, read);
|
||||||
|
|
||||||
// validate the context (if not EGL_NO_CONTEXT)
|
// validate the context (if not EGL_NO_CONTEXT)
|
||||||
if ((ctx != EGL_NO_CONTEXT) && !_c.get()) {
|
if ((ctx != EGL_NO_CONTEXT) && !_c.get()) {
|
||||||
@@ -696,7 +696,7 @@ EGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx,
|
|||||||
egl_display_t const * const dp = validate_display(dpy);
|
egl_display_t const * const dp = validate_display(dpy);
|
||||||
if (!dp) return EGL_FALSE;
|
if (!dp) return EGL_FALSE;
|
||||||
|
|
||||||
ContextRef _c(ctx);
|
ContextRef _c(dp, ctx);
|
||||||
if (!_c.get()) return setError(EGL_BAD_CONTEXT, EGL_FALSE);
|
if (!_c.get()) return setError(EGL_BAD_CONTEXT, EGL_FALSE);
|
||||||
|
|
||||||
egl_context_t * const c = get_context(ctx);
|
egl_context_t * const c = get_context(ctx);
|
||||||
@@ -944,7 +944,7 @@ EGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
|
|||||||
egl_display_t const * const dp = validate_display(dpy);
|
egl_display_t const * const dp = validate_display(dpy);
|
||||||
if (!dp) return EGL_FALSE;
|
if (!dp) return EGL_FALSE;
|
||||||
|
|
||||||
SurfaceRef _s(draw);
|
SurfaceRef _s(dp, draw);
|
||||||
if (!_s.get())
|
if (!_s.get())
|
||||||
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
||||||
|
|
||||||
@@ -960,7 +960,7 @@ EGLBoolean eglCopyBuffers( EGLDisplay dpy, EGLSurface surface,
|
|||||||
egl_display_t const * const dp = validate_display(dpy);
|
egl_display_t const * const dp = validate_display(dpy);
|
||||||
if (!dp) return EGL_FALSE;
|
if (!dp) return EGL_FALSE;
|
||||||
|
|
||||||
SurfaceRef _s(surface);
|
SurfaceRef _s(dp, surface);
|
||||||
if (!_s.get())
|
if (!_s.get())
|
||||||
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
||||||
|
|
||||||
@@ -1002,7 +1002,7 @@ EGLBoolean eglSurfaceAttrib(
|
|||||||
egl_display_t const * const dp = validate_display(dpy);
|
egl_display_t const * const dp = validate_display(dpy);
|
||||||
if (!dp) return EGL_FALSE;
|
if (!dp) return EGL_FALSE;
|
||||||
|
|
||||||
SurfaceRef _s(surface);
|
SurfaceRef _s(dp, surface);
|
||||||
if (!_s.get())
|
if (!_s.get())
|
||||||
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
||||||
|
|
||||||
@@ -1022,7 +1022,7 @@ EGLBoolean eglBindTexImage(
|
|||||||
egl_display_t const * const dp = validate_display(dpy);
|
egl_display_t const * const dp = validate_display(dpy);
|
||||||
if (!dp) return EGL_FALSE;
|
if (!dp) return EGL_FALSE;
|
||||||
|
|
||||||
SurfaceRef _s(surface);
|
SurfaceRef _s(dp, surface);
|
||||||
if (!_s.get())
|
if (!_s.get())
|
||||||
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
||||||
|
|
||||||
@@ -1042,7 +1042,7 @@ EGLBoolean eglReleaseTexImage(
|
|||||||
egl_display_t const * const dp = validate_display(dpy);
|
egl_display_t const * const dp = validate_display(dpy);
|
||||||
if (!dp) return EGL_FALSE;
|
if (!dp) return EGL_FALSE;
|
||||||
|
|
||||||
SurfaceRef _s(surface);
|
SurfaceRef _s(dp, surface);
|
||||||
if (!_s.get())
|
if (!_s.get())
|
||||||
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
||||||
|
|
||||||
@@ -1201,7 +1201,7 @@ EGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface,
|
|||||||
egl_display_t const * const dp = validate_display(dpy);
|
egl_display_t const * const dp = validate_display(dpy);
|
||||||
if (!dp) return EGL_FALSE;
|
if (!dp) return EGL_FALSE;
|
||||||
|
|
||||||
SurfaceRef _s(surface);
|
SurfaceRef _s(dp, surface);
|
||||||
if (!_s.get())
|
if (!_s.get())
|
||||||
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
||||||
|
|
||||||
@@ -1220,7 +1220,7 @@ EGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface)
|
|||||||
egl_display_t const * const dp = validate_display(dpy);
|
egl_display_t const * const dp = validate_display(dpy);
|
||||||
if (!dp) return EGL_FALSE;
|
if (!dp) return EGL_FALSE;
|
||||||
|
|
||||||
SurfaceRef _s(surface);
|
SurfaceRef _s(dp, surface);
|
||||||
if (!_s.get())
|
if (!_s.get())
|
||||||
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
||||||
|
|
||||||
@@ -1241,7 +1241,7 @@ EGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
|
|||||||
if (!dp) return EGL_NO_IMAGE_KHR;
|
if (!dp) return EGL_NO_IMAGE_KHR;
|
||||||
|
|
||||||
if (ctx != EGL_NO_CONTEXT) {
|
if (ctx != EGL_NO_CONTEXT) {
|
||||||
ContextRef _c(ctx);
|
ContextRef _c(dp, ctx);
|
||||||
if (!_c.get())
|
if (!_c.get())
|
||||||
return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
|
return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
|
||||||
egl_context_t * const c = get_context(ctx);
|
egl_context_t * const c = get_context(ctx);
|
||||||
@@ -1310,7 +1310,7 @@ EGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img)
|
|||||||
egl_display_t const * const dp = validate_display(dpy);
|
egl_display_t const * const dp = validate_display(dpy);
|
||||||
if (!dp) return EGL_FALSE;
|
if (!dp) return EGL_FALSE;
|
||||||
|
|
||||||
ImageRef _i(img);
|
ImageRef _i(dp, img);
|
||||||
if (!_i.get()) return setError(EGL_BAD_PARAMETER, EGL_FALSE);
|
if (!_i.get()) return setError(EGL_BAD_PARAMETER, EGL_FALSE);
|
||||||
|
|
||||||
egl_image_t* image = get_image(img);
|
egl_image_t* image = get_image(img);
|
||||||
@@ -1349,7 +1349,7 @@ EGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_l
|
|||||||
if (!dp) return EGL_NO_SYNC_KHR;
|
if (!dp) return EGL_NO_SYNC_KHR;
|
||||||
|
|
||||||
EGLContext ctx = eglGetCurrentContext();
|
EGLContext ctx = eglGetCurrentContext();
|
||||||
ContextRef _c(ctx);
|
ContextRef _c(dp, ctx);
|
||||||
if (!_c.get())
|
if (!_c.get())
|
||||||
return setError(EGL_BAD_CONTEXT, EGL_NO_SYNC_KHR);
|
return setError(EGL_BAD_CONTEXT, EGL_NO_SYNC_KHR);
|
||||||
|
|
||||||
@@ -1372,12 +1372,12 @@ EGLBoolean eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
|
|||||||
egl_display_t const * const dp = validate_display(dpy);
|
egl_display_t const * const dp = validate_display(dpy);
|
||||||
if (!dp) return EGL_FALSE;
|
if (!dp) return EGL_FALSE;
|
||||||
|
|
||||||
SyncRef _s(sync);
|
SyncRef _s(dp, sync);
|
||||||
if (!_s.get()) return setError(EGL_BAD_PARAMETER, EGL_FALSE);
|
if (!_s.get()) return setError(EGL_BAD_PARAMETER, EGL_FALSE);
|
||||||
egl_sync_t* syncObject = get_sync(sync);
|
egl_sync_t* syncObject = get_sync(sync);
|
||||||
|
|
||||||
EGLContext ctx = syncObject->context;
|
EGLContext ctx = syncObject->context;
|
||||||
ContextRef _c(ctx);
|
ContextRef _c(dp, ctx);
|
||||||
if (!_c.get())
|
if (!_c.get())
|
||||||
return setError(EGL_BAD_CONTEXT, EGL_FALSE);
|
return setError(EGL_BAD_CONTEXT, EGL_FALSE);
|
||||||
|
|
||||||
@@ -1399,12 +1399,12 @@ EGLint eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTi
|
|||||||
egl_display_t const * const dp = validate_display(dpy);
|
egl_display_t const * const dp = validate_display(dpy);
|
||||||
if (!dp) return EGL_FALSE;
|
if (!dp) return EGL_FALSE;
|
||||||
|
|
||||||
SyncRef _s(sync);
|
SyncRef _s(dp, sync);
|
||||||
if (!_s.get()) return setError(EGL_BAD_PARAMETER, EGL_FALSE);
|
if (!_s.get()) return setError(EGL_BAD_PARAMETER, EGL_FALSE);
|
||||||
egl_sync_t* syncObject = get_sync(sync);
|
egl_sync_t* syncObject = get_sync(sync);
|
||||||
|
|
||||||
EGLContext ctx = syncObject->context;
|
EGLContext ctx = syncObject->context;
|
||||||
ContextRef _c(ctx);
|
ContextRef _c(dp, ctx);
|
||||||
if (!_c.get())
|
if (!_c.get())
|
||||||
return setError(EGL_BAD_CONTEXT, EGL_FALSE);
|
return setError(EGL_BAD_CONTEXT, EGL_FALSE);
|
||||||
|
|
||||||
@@ -1424,13 +1424,13 @@ EGLBoolean eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute
|
|||||||
egl_display_t const * const dp = validate_display(dpy);
|
egl_display_t const * const dp = validate_display(dpy);
|
||||||
if (!dp) return EGL_FALSE;
|
if (!dp) return EGL_FALSE;
|
||||||
|
|
||||||
SyncRef _s(sync);
|
SyncRef _s(dp, sync);
|
||||||
if (!_s.get())
|
if (!_s.get())
|
||||||
return setError(EGL_BAD_PARAMETER, EGL_FALSE);
|
return setError(EGL_BAD_PARAMETER, EGL_FALSE);
|
||||||
|
|
||||||
egl_sync_t* syncObject = get_sync(sync);
|
egl_sync_t* syncObject = get_sync(sync);
|
||||||
EGLContext ctx = syncObject->context;
|
EGLContext ctx = syncObject->context;
|
||||||
ContextRef _c(ctx);
|
ContextRef _c(dp, ctx);
|
||||||
if (!_c.get())
|
if (!_c.get())
|
||||||
return setError(EGL_BAD_CONTEXT, EGL_FALSE);
|
return setError(EGL_BAD_CONTEXT, EGL_FALSE);
|
||||||
|
|
||||||
@@ -1455,7 +1455,7 @@ EGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw,
|
|||||||
egl_display_t const * const dp = validate_display(dpy);
|
egl_display_t const * const dp = validate_display(dpy);
|
||||||
if (!dp) return EGL_FALSE;
|
if (!dp) return EGL_FALSE;
|
||||||
|
|
||||||
SurfaceRef _s(draw);
|
SurfaceRef _s(dp, draw);
|
||||||
if (!_s.get())
|
if (!_s.get())
|
||||||
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
return setError(EGL_BAD_SURFACE, EGL_FALSE);
|
||||||
|
|
||||||
|
|||||||
@@ -62,11 +62,13 @@ void egl_display_t::removeObject(egl_object_t* object) {
|
|||||||
objects.remove(object);
|
objects.remove(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool egl_display_t::getObject(egl_object_t* object) {
|
bool egl_display_t::getObject(egl_object_t* object) const {
|
||||||
Mutex::Autolock _l(lock);
|
Mutex::Autolock _l(lock);
|
||||||
if (objects.indexOf(object) >= 0) {
|
if (objects.indexOf(object) >= 0) {
|
||||||
object->incRef();
|
if (object->getDisplay() == this) {
|
||||||
return true;
|
object->incRef();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ public:
|
|||||||
// remove object from this display's list
|
// remove object from this display's list
|
||||||
void removeObject(egl_object_t* object);
|
void removeObject(egl_object_t* object);
|
||||||
// add reference to this object. returns true if this is a valid object.
|
// add reference to this object. returns true if this is a valid object.
|
||||||
bool getObject(egl_object_t* object);
|
bool getObject(egl_object_t* object) const;
|
||||||
|
|
||||||
|
|
||||||
static egl_display_t* get(EGLDisplay dpy);
|
static egl_display_t* get(EGLDisplay dpy);
|
||||||
@@ -119,9 +119,9 @@ public:
|
|||||||
egl_config_t* configs;
|
egl_config_t* configs;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint32_t refs;
|
uint32_t refs;
|
||||||
Mutex lock;
|
mutable Mutex lock;
|
||||||
SortedVector<egl_object_t*> objects;
|
SortedVector<egl_object_t*> objects;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -55,10 +55,10 @@ void egl_object_t::destroy() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool egl_object_t::get() {
|
bool egl_object_t::get(egl_display_t const* display, egl_object_t* object) {
|
||||||
// used by LocalRef, this does an incRef() atomically with
|
// used by LocalRef, this does an incRef() atomically with
|
||||||
// checking that the object is valid.
|
// checking that the object is valid.
|
||||||
return display->getObject(this);
|
return display->getObject(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -52,10 +52,11 @@ public:
|
|||||||
|
|
||||||
inline int32_t incRef() { return android_atomic_inc(&count); }
|
inline int32_t incRef() { return android_atomic_inc(&count); }
|
||||||
inline int32_t decRef() { return android_atomic_dec(&count); }
|
inline int32_t decRef() { return android_atomic_dec(&count); }
|
||||||
|
inline egl_display_t* getDisplay() const { return display; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void terminate();
|
void terminate();
|
||||||
bool get();
|
static bool get(egl_display_t const* display, egl_object_t* object);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
template <typename N, typename T>
|
template <typename N, typename T>
|
||||||
@@ -66,9 +67,9 @@ public:
|
|||||||
public:
|
public:
|
||||||
~LocalRef();
|
~LocalRef();
|
||||||
explicit LocalRef(egl_object_t* rhs);
|
explicit LocalRef(egl_object_t* rhs);
|
||||||
explicit LocalRef(T o) : ref(0) {
|
explicit LocalRef(egl_display_t const* display, T o) : ref(0) {
|
||||||
egl_object_t* native = reinterpret_cast<N*>(o);
|
egl_object_t* native = reinterpret_cast<N*>(o);
|
||||||
if (o && native->get()) {
|
if (o && egl_object_t::get(display, native)) {
|
||||||
ref = native;
|
ref = native;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user