Loading libcutils/native_handle.c +17 −25 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ * limitations under the License. */ #define LOG_TAG "NativeHandle" #include <cutils/native_handle.h> #include <errno.h> #include <stdint.h> Loading @@ -22,15 +22,12 @@ #include <string.h> #include <unistd.h> #include <android/log.h> #include <cutils/native_handle.h> 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; } Loading @@ -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; } Loading @@ -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); Loading @@ -79,25 +74,22 @@ native_handle_t* native_handle_clone(const native_handle_t* handle) 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 ; i<numFds ; i++) { for (int i = 0; i < numFds; ++i) { close(h->data[i]); } errno = saved_errno; return 0; } Loading
libcutils/native_handle.c +17 −25 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ * limitations under the License. */ #define LOG_TAG "NativeHandle" #include <cutils/native_handle.h> #include <errno.h> #include <stdint.h> Loading @@ -22,15 +22,12 @@ #include <string.h> #include <unistd.h> #include <android/log.h> #include <cutils/native_handle.h> 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; } Loading @@ -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; } Loading @@ -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); Loading @@ -79,25 +74,22 @@ native_handle_t* native_handle_clone(const native_handle_t* handle) 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 ; i<numFds ; i++) { for (int i = 0; i < numFds; ++i) { close(h->data[i]); } errno = saved_errno; return 0; }