diff options
| -rw-r--r-- | cmds/keystore/netkeystore.c | 5 | ||||
| -rw-r--r-- | libs/binder/Parcel.cpp | 2 | ||||
| -rw-r--r-- | libs/ui/Surface.cpp | 14 | ||||
| -rw-r--r-- | opengl/libagl/egl.cpp | 27 | ||||
| -rw-r--r-- | opengl/libs/EGL/egl.cpp | 11 |
5 files changed, 39 insertions, 20 deletions
diff --git a/cmds/keystore/netkeystore.c b/cmds/keystore/netkeystore.c index eac455e0c5..637e0d8760 100644 --- a/cmds/keystore/netkeystore.c +++ b/cmds/keystore/netkeystore.c @@ -37,6 +37,7 @@ #include "netkeystore.h" #include "keymgmt.h" +#define DBG 1 #define CMD_PUT_WITH_FILE "putfile" typedef void CMD_FUNC(LPC_MARSHAL *cmd, LPC_MARSHAL *reply); @@ -397,12 +398,12 @@ int main(const int argc, const char *argv[]) // read the command, execute and send the result back. if(read_marshal(s, &cmd)) goto err; - LOGI("new connection\n"); + if (DBG) LOGD("new connection\n"); execute(&cmd, &reply); write_marshal(s, &reply); err: memset(&reply, 0, sizeof(LPC_MARSHAL)); - LOGI("closing connection\n"); + if (DBG) LOGD("closing connection\n"); close(s); } diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index f40e4bdc3e..785a3c5ddb 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -661,7 +661,7 @@ status_t Parcel::writeWeakBinder(const wp<IBinder>& val) status_t Parcel::writeNativeHandle(const native_handle* handle) { - if (handle->version != sizeof(native_handle)) + if (!handle || handle->version != sizeof(native_handle)) return BAD_TYPE; status_t err; diff --git a/libs/ui/Surface.cpp b/libs/ui/Surface.cpp index 04ab64c4ab..a4710aafb4 100644 --- a/libs/ui/Surface.cpp +++ b/libs/ui/Surface.cpp @@ -558,14 +558,16 @@ int Surface::dequeueBuffer(android_native_buffer_t** buffer) volatile const surface_info_t* const back = lcblk->surface + backIdx; if (back->flags & surface_info_t::eNeedNewBuffer) { - getBufferLocked(backIdx); + err = getBufferLocked(backIdx); } - const sp<SurfaceBuffer>& backBuffer(mBuffers[backIdx]); - mDirtyRegion.set(backBuffer->width, backBuffer->height); - *buffer = backBuffer.get(); + if (err == NO_ERROR) { + const sp<SurfaceBuffer>& backBuffer(mBuffers[backIdx]); + mDirtyRegion.set(backBuffer->width, backBuffer->height); + *buffer = backBuffer.get(); + } - return NO_ERROR; + return err; } int Surface::lockBuffer(android_native_buffer_t* buffer) @@ -729,7 +731,7 @@ status_t Surface::getBufferLocked(int index) currentBuffer.clear(); } err = getBufferMapper().registerBuffer(buffer->handle); - LOGW_IF(err, "map(...) failed %d (%s)", err, strerror(-err)); + LOGW_IF(err, "registerBuffer(...) failed %d (%s)", err, strerror(-err)); if (err == NO_ERROR) { currentBuffer = buffer; } diff --git a/opengl/libagl/egl.cpp b/opengl/libagl/egl.cpp index b0e54d8f27..cf66be3372 100644 --- a/opengl/libagl/egl.cpp +++ b/opengl/libagl/egl.cpp @@ -145,7 +145,7 @@ struct egl_surface_t virtual EGLBoolean bindDrawSurface(ogles_context_t* gl) = 0; virtual EGLBoolean bindReadSurface(ogles_context_t* gl) = 0; - virtual void connect() {} + virtual EGLBoolean connect() { return EGL_TRUE; } virtual void disconnect() {} virtual EGLint getWidth() const = 0; virtual EGLint getHeight() const = 0; @@ -214,7 +214,7 @@ struct egl_window_surface_v2_t : public egl_surface_t virtual EGLBoolean swapBuffers(); virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); virtual EGLBoolean bindReadSurface(ogles_context_t* gl); - virtual void connect(); + virtual EGLBoolean connect(); virtual void disconnect(); virtual EGLint getWidth() const { return width; } virtual EGLint getHeight() const { return height; } @@ -382,10 +382,12 @@ egl_window_surface_v2_t::~egl_window_surface_v2_t() { } } -void egl_window_surface_v2_t::connect() +EGLBoolean egl_window_surface_v2_t::connect() { // dequeue a buffer - nativeWindow->dequeueBuffer(nativeWindow, &buffer); + if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) != NO_ERROR) { + return setError(EGL_BAD_ALLOC, EGL_FALSE); + } // allocate a corresponding depth-buffer width = buffer->width; @@ -396,8 +398,7 @@ void egl_window_surface_v2_t::connect() depth.stride = depth.width; // use the width here depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); if (depth.data == 0) { - setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); - return; + return setError(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -411,9 +412,10 @@ void egl_window_surface_v2_t::connect() GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { LOGE("connect() failed to lock buffer %p (%ux%u)", buffer, buffer->width, buffer->height); - setError(EGL_BAD_ACCESS, EGL_NO_SURFACE); + return setError(EGL_BAD_ACCESS, EGL_FALSE); // FIXME: we should make sure we're not accessing the buffer anymore } + return EGL_TRUE; } void egl_window_surface_v2_t::disconnect() @@ -444,6 +446,7 @@ status_t egl_window_surface_v2_t::lock( status_t egl_window_surface_v2_t::unlock(android_native_buffer_t* buf) { + if (!buf) return BAD_VALUE; int err = module->unlock(module, buf->handle); return err; } @@ -515,6 +518,10 @@ void egl_window_surface_v2_t::copyBlt( EGLBoolean egl_window_surface_v2_t::swapBuffers() { + if (!buffer) { + return setError(EGL_BAD_ACCESS, EGL_FALSE); + } + /* * Handle eglSetSwapRectangleANDROID() * We copyback from the front buffer @@ -580,7 +587,7 @@ EGLBoolean egl_window_surface_v2_t::swapBuffers() GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)", buffer, buffer->width, buffer->height); - setError(EGL_BAD_ACCESS, EGL_NO_SURFACE); + return setError(EGL_BAD_ACCESS, EGL_FALSE); // FIXME: we should make sure we're not accessing the buffer anymore } @@ -1748,7 +1755,9 @@ EGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw, ogles_scissor(gl, 0, 0, w, h); } if (d) { - d->connect(); + if (d->connect() == EGL_FALSE) { + return EGL_FALSE; + } d->ctx = ctx; d->bindDrawSurface(gl); } diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp index c2003dd4e4..236d24723c 100644 --- a/opengl/libs/EGL/egl.cpp +++ b/opengl/libs/EGL/egl.cpp @@ -135,9 +135,10 @@ struct egl_image_t : public egl_object_t<'_img'> struct tls_t { - tls_t() : error(EGL_SUCCESS), ctx(0) { } + tls_t() : error(EGL_SUCCESS), ctx(0), logCallWithNoContext(EGL_TRUE) { } EGLint error; EGLContext ctx; + EGLBoolean logCallWithNoContext; }; @@ -352,8 +353,14 @@ static int ext_context_lost() { } static void gl_no_context() { - LOGE("call to OpenGL ES API with no current context"); + tls_t* tls = getTLS(); + if (tls->logCallWithNoContext == EGL_TRUE) { + tls->logCallWithNoContext = EGL_FALSE; + LOGE("call to OpenGL ES API with no current context " + "(logged once per thread)"); + } } + static void early_egl_init(void) { #if !USE_FAST_TLS_KEY |