From bf0492a9a1e3976dd4aea5596d1b1e10e8cbeea2 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Mon, 1 May 2017 21:34:15 -0700 Subject: [PATCH] Preserve errno better in native_handle functions. So a caller of native_handle_clone can trust errno to be relevant. Bug: http://b/37215366 Test: builds Change-Id: I0992f38ad559db4a02fce07123842dbad8e3f473 --- libcutils/native_handle.c | 42 ++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/libcutils/native_handle.c b/libcutils/native_handle.c index 9f4840a59..95bbc41c4 100644 --- a/libcutils/native_handle.c +++ b/libcutils/native_handle.c @@ -14,7 +14,7 @@ * limitations under the License. */ -#define LOG_TAG "NativeHandle" +#include #include #include @@ -22,15 +22,12 @@ #include #include -#include -#include - static const int kMaxNativeFds = 1024; static const int kMaxNativeInts = 1024; -native_handle_t* native_handle_init(char* storage, int numFds, int numInts) -{ +native_handle_t* native_handle_init(char* storage, int numFds, int numInts) { if ((uintptr_t) storage % alignof(native_handle_t)) { + errno = EINVAL; return NULL; } @@ -38,13 +35,12 @@ native_handle_t* native_handle_init(char* storage, int numFds, int numInts) handle->version = sizeof(native_handle_t); handle->numFds = numFds; handle->numInts = numInts; - return handle; } -native_handle_t* native_handle_create(int numFds, int numInts) -{ +native_handle_t* native_handle_create(int numFds, int numInts) { if (numFds < 0 || numInts < 0 || numFds > kMaxNativeFds || numInts > kMaxNativeInts) { + errno = EINVAL; return NULL; } @@ -58,14 +54,13 @@ native_handle_t* native_handle_create(int numFds, int numInts) return h; } -native_handle_t* native_handle_clone(const native_handle_t* handle) -{ +native_handle_t* native_handle_clone(const native_handle_t* handle) { native_handle_t* clone = native_handle_create(handle->numFds, handle->numInts); - int i; + if (clone == NULL) return NULL; - for (i = 0; i < handle->numFds; i++) { + for (int i = 0; i < handle->numFds; i++) { clone->data[i] = dup(handle->data[i]); - if (clone->data[i] < 0) { + if (clone->data[i] == -1) { clone->numFds = i; native_handle_close(clone); native_handle_delete(clone); @@ -74,30 +69,27 @@ native_handle_t* native_handle_clone(const native_handle_t* handle) } memcpy(&clone->data[handle->numFds], &handle->data[handle->numFds], - sizeof(int) * handle->numInts); + sizeof(int) * handle->numInts); return clone; } -int native_handle_delete(native_handle_t* h) -{ +int native_handle_delete(native_handle_t* h) { if (h) { - if (h->version != sizeof(native_handle_t)) - return -EINVAL; + if (h->version != sizeof(native_handle_t)) return -EINVAL; free(h); } return 0; } -int native_handle_close(const native_handle_t* h) -{ - if (h->version != sizeof(native_handle_t)) - return -EINVAL; +int native_handle_close(const native_handle_t* h) { + if (h->version != sizeof(native_handle_t)) return -EINVAL; + int saved_errno = errno; const int numFds = h->numFds; - int i; - for (i=0 ; idata[i]); } + errno = saved_errno; return 0; }