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

Commit 8938ed2c authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Add mechanism for Parcel to not allow FDs to be written to it.

This is to help implement issue #5224703.

Change-Id: I026a5890495537d15b57fe61227a640aac806d46
parent c673c036
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -56,6 +56,8 @@ public:
    status_t            appendFrom(const Parcel *parcel,
    status_t            appendFrom(const Parcel *parcel,
                                   size_t start, size_t len);
                                   size_t start, size_t len);


    bool                setAllowFds(bool allowFds);

    bool                hasFileDescriptors() const;
    bool                hasFileDescriptors() const;


    // Writes the RPC header.
    // Writes the RPC header.
@@ -212,6 +214,7 @@ private:


    mutable bool        mFdsKnown;
    mutable bool        mFdsKnown;
    mutable bool        mHasFds;
    mutable bool        mHasFds;
    bool                mAllowFds;
    
    
    release_func        mOwner;
    release_func        mOwner;
    void*               mOwnerCookie;
    void*               mOwnerCookie;
+1 −0
Original line number Original line Diff line number Diff line
@@ -72,6 +72,7 @@ enum {
    TIMED_OUT           = 0x80000005,
    TIMED_OUT           = 0x80000005,
    UNKNOWN_TRANSACTION = 0x80000006,
    UNKNOWN_TRANSACTION = 0x80000006,
#endif    
#endif    
    FDS_NOT_ALLOWED     = 0x80000007,
};
};


// Restore define; enumeration is in "android" namespace, so the value defined
// Restore define; enumeration is in "android" namespace, so the value defined
+18 −1
Original line number Original line Diff line number Diff line
@@ -399,6 +399,8 @@ status_t Parcel::appendFrom(const Parcel *parcel, size_t offset, size_t len)
    mDataPos += len;
    mDataPos += len;
    mDataSize += len;
    mDataSize += len;


    err = NO_ERROR;

    if (numObjects > 0) {
    if (numObjects > 0) {
        // grow objects
        // grow objects
        if (mObjectsCapacity < mObjectsSize + numObjects) {
        if (mObjectsCapacity < mObjectsSize + numObjects) {
@@ -430,11 +432,21 @@ status_t Parcel::appendFrom(const Parcel *parcel, size_t offset, size_t len)
                flat->handle = dup(flat->handle);
                flat->handle = dup(flat->handle);
                flat->cookie = (void*)1;
                flat->cookie = (void*)1;
                mHasFds = mFdsKnown = true;
                mHasFds = mFdsKnown = true;
                if (!mAllowFds) {
                    err = FDS_NOT_ALLOWED;
                }
            }
            }
        }
        }
    }
    }


    return NO_ERROR;
    return err;
}

bool Parcel::setAllowFds(bool allowFds)
{
    const bool origValue = mAllowFds;
    mAllowFds = allowFds;
    return origValue;
}
}


bool Parcel::hasFileDescriptors() const
bool Parcel::hasFileDescriptors() const
@@ -759,6 +771,9 @@ restart_write:
        
        
        // remember if it's a file descriptor
        // remember if it's a file descriptor
        if (val.type == BINDER_TYPE_FD) {
        if (val.type == BINDER_TYPE_FD) {
            if (!mAllowFds) {
                return FDS_NOT_ALLOWED;
            }
            mHasFds = mFdsKnown = true;
            mHasFds = mFdsKnown = true;
        }
        }


@@ -1283,6 +1298,7 @@ status_t Parcel::restartWrite(size_t desired)
    mNextObjectHint = 0;
    mNextObjectHint = 0;
    mHasFds = false;
    mHasFds = false;
    mFdsKnown = true;
    mFdsKnown = true;
    mAllowFds = true;
    
    
    return NO_ERROR;
    return NO_ERROR;
}
}
@@ -1434,6 +1450,7 @@ void Parcel::initState()
    mNextObjectHint = 0;
    mNextObjectHint = 0;
    mHasFds = false;
    mHasFds = false;
    mFdsKnown = true;
    mFdsKnown = true;
    mAllowFds = true;
    mOwner = NULL;
    mOwner = NULL;
}
}