Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 347b67a8 authored by Elliott Hughes's avatar Elliott Hughes Committed by android-build-merger
Browse files

Merge "Preserve errno better in native_handle functions." am: dd6e73f4 am: 4b6b4e02

am: d0c0d16b

Change-Id: I825b20ac4c9c3b0c6921a4469cf3091b0c811d9a
parents df3dc783 d0c0d16b
Loading
Loading
Loading
Loading
+17 −25
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@
 * limitations under the License.
 */

#define LOG_TAG "NativeHandle"
#include <cutils/native_handle.h>

#include <errno.h>
#include <stdint.h>
@@ -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;
    }

@@ -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);
@@ -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;
}