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

Commit a5891f42 authored by Phil Burk's avatar Phil Burk
Browse files

aaudio: call validate() from readFromParcel()

This is to ensure that validate() is always called
in the future.

Bug: 74558178
Test: run AAudio CTS
Test: on Marlin, adb shell write_sine_callback -pl
Change-Id: I661f3c4e690be2268ca61b80a98bbdf9a7368c1b
parent b95a5989
Loading
Loading
Loading
Loading
+41 −38
Original line number Diff line number Diff line
@@ -64,27 +64,54 @@ int32_t AudioEndpointParcelable::addFileDescriptor(const unique_fd& fd,
 * The read and write must be symmetric.
 */
status_t AudioEndpointParcelable::writeToParcel(Parcel* parcel) const {
    parcel->writeInt32(mNumSharedMemories);
    status_t status = AAudioConvert_aaudioToAndroidStatus(validate());
    if (status != NO_ERROR) goto error;

    status = parcel->writeInt32(mNumSharedMemories);
    if (status != NO_ERROR) goto error;

    for (int i = 0; i < mNumSharedMemories; i++) {
        mSharedMemories[i].writeToParcel(parcel);
        status = mSharedMemories[i].writeToParcel(parcel);
        if (status != NO_ERROR) goto error;
    }
    mUpMessageQueueParcelable.writeToParcel(parcel);
    mDownMessageQueueParcelable.writeToParcel(parcel);
    mUpDataQueueParcelable.writeToParcel(parcel);
    mDownDataQueueParcelable.writeToParcel(parcel);
    return NO_ERROR; // TODO check for errors above
    status = mUpMessageQueueParcelable.writeToParcel(parcel);
    if (status != NO_ERROR) goto error;
    status = mDownMessageQueueParcelable.writeToParcel(parcel);
    if (status != NO_ERROR) goto error;
    status = mUpDataQueueParcelable.writeToParcel(parcel);
    if (status != NO_ERROR) goto error;
    status = mDownDataQueueParcelable.writeToParcel(parcel);
    if (status != NO_ERROR) goto error;

    return NO_ERROR;

error:
    ALOGE("%s returning %d", __func__, status);
    return status;
}

status_t AudioEndpointParcelable::readFromParcel(const Parcel* parcel) {
    parcel->readInt32(&mNumSharedMemories);
    status_t status = parcel->readInt32(&mNumSharedMemories);
    if (status != NO_ERROR) goto error;

    for (int i = 0; i < mNumSharedMemories; i++) {
        mSharedMemories[i].readFromParcel(parcel);
        if (status != NO_ERROR) goto error;
    }
    mUpMessageQueueParcelable.readFromParcel(parcel);
    mDownMessageQueueParcelable.readFromParcel(parcel);
    mUpDataQueueParcelable.readFromParcel(parcel);
    mDownDataQueueParcelable.readFromParcel(parcel);
    return NO_ERROR; // TODO check for errors above
    status = mUpMessageQueueParcelable.readFromParcel(parcel);
    if (status != NO_ERROR) goto error;
    status = mDownMessageQueueParcelable.readFromParcel(parcel);
    if (status != NO_ERROR) goto error;
    status = mUpDataQueueParcelable.readFromParcel(parcel);
    if (status != NO_ERROR) goto error;
    status = mDownDataQueueParcelable.readFromParcel(parcel);
    if (status != NO_ERROR) goto error;

    return AAudioConvert_aaudioToAndroidStatus(validate());

error:
    ALOGE("%s returning %d", __func__, status);
    return status;
}

aaudio_result_t AudioEndpointParcelable::resolve(EndpointDescriptor *descriptor) {
@@ -109,35 +136,11 @@ aaudio_result_t AudioEndpointParcelable::close() {
    return AAudioConvert_androidToAAudioResult(err);
}

aaudio_result_t AudioEndpointParcelable::validate() {
    aaudio_result_t result;
aaudio_result_t AudioEndpointParcelable::validate() const {
    if (mNumSharedMemories < 0 || mNumSharedMemories >= MAX_SHARED_MEMORIES) {
        ALOGE("invalid mNumSharedMemories = %d", mNumSharedMemories);
        return AAUDIO_ERROR_INTERNAL;
    }
    for (int i = 0; i < mNumSharedMemories; i++) {
        result = mSharedMemories[i].validate();
        if (result != AAUDIO_OK) {
            ALOGE("invalid mSharedMemories[%d] = %d", i, result);
            return result;
        }
    }
    if ((result = mUpMessageQueueParcelable.validate()) != AAUDIO_OK) {
        ALOGE("invalid mUpMessageQueueParcelable = %d", result);
        return result;
    }
    if ((result = mDownMessageQueueParcelable.validate()) != AAUDIO_OK) {
        ALOGE("invalid mDownMessageQueueParcelable = %d", result);
        return result;
    }
    if ((result = mUpDataQueueParcelable.validate()) != AAUDIO_OK) {
        ALOGE("invalid mUpDataQueueParcelable = %d", result);
        return result;
    }
    if ((result = mDownDataQueueParcelable.validate()) != AAUDIO_OK) {
        ALOGE("invalid mDownDataQueueParcelable = %d", result);
        return result;
    }
    return AAUDIO_OK;
}

+2 −2
Original line number Diff line number Diff line
@@ -56,8 +56,6 @@ public:

    aaudio_result_t resolve(EndpointDescriptor *descriptor);

    aaudio_result_t validate();

    aaudio_result_t close();

    void dump();
@@ -70,6 +68,8 @@ public: // TODO add getters
    RingBufferParcelable    mDownDataQueueParcelable;    // eg. playback

private:
    aaudio_result_t         validate() const;

    int32_t                 mNumSharedMemories = 0;
    SharedMemoryParcelable  mSharedMemories[MAX_SHARED_MEMORIES];
};
+10 −16
Original line number Diff line number Diff line
@@ -121,17 +121,11 @@ public:
            ALOGE("BpAAudioService::client GET_STREAM_DESCRIPTION passed result %d", result);
            return result;
        }
        err = parcelable.readFromParcel(&reply);;
        err = parcelable.readFromParcel(&reply);
        if (err != NO_ERROR) {
            ALOGE("BpAAudioService::client transact(GET_STREAM_DESCRIPTION) read endpoint %d", err);
            return AAudioConvert_androidToAAudioResult(err);
        }
        //parcelable.dump();
        result = parcelable.validate();
        if (result != AAUDIO_OK) {
            ALOGE("BpAAudioService::client GET_STREAM_DESCRIPTION validation fails %d", result);
            return result;
        }
        return result;
    }

@@ -250,6 +244,7 @@ status_t BnAAudioService::onTransact(uint32_t code, const Parcel& data,
    pid_t tid;
    int64_t nanoseconds;
    aaudio_result_t result;
    status_t status = NO_ERROR;
    ALOGV("BnAAudioService::onTransact(%i) %i", code, flags);

    switch(code) {
@@ -294,21 +289,20 @@ status_t BnAAudioService::onTransact(uint32_t code, const Parcel& data,

        case GET_STREAM_DESCRIPTION: {
            CHECK_INTERFACE(IAAudioService, data, reply);
            data.readInt32(&streamHandle);
            status = data.readInt32(&streamHandle);
            if (status != NO_ERROR) {
                return status;
            }
            aaudio::AudioEndpointParcelable parcelable;
            result = getStreamDescription(streamHandle, parcelable);
            if (result != AAUDIO_OK) {
                return AAudioConvert_aaudioToAndroidStatus(result);
            }
            result = parcelable.validate();
            if (result != AAUDIO_OK) {
                ALOGE("BnAAudioService::onTransact getStreamDescription() returns %d", result);
                parcelable.dump();
                return AAudioConvert_aaudioToAndroidStatus(result);
            status = reply->writeInt32(result);
            if (status != NO_ERROR) {
                return status;
            }
            reply->writeInt32(result);
            parcelable.writeToParcel(reply);
            return NO_ERROR;
            return parcelable.writeToParcel(reply);
        } break;

        case START_STREAM: {
+9 −18
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include <stdint.h>

#include <binder/Parcelable.h>
#include <utility/AAudioUtilities.h>

#include "binding/AAudioServiceDefinitions.h"
#include "binding/SharedRegionParcelable.h"
@@ -79,7 +80,10 @@ void RingBufferParcelable::setCapacityInFrames(int32_t capacityInFrames) {
 * The read and write must be symmetric.
 */
status_t RingBufferParcelable::writeToParcel(Parcel* parcel) const {
    status_t status = parcel->writeInt32(mCapacityInFrames);
    status_t status = AAudioConvert_aaudioToAndroidStatus(validate());
    if (status != NO_ERROR) goto error;

    status = parcel->writeInt32(mCapacityInFrames);
    if (status != NO_ERROR) goto error;
    if (mCapacityInFrames > 0) {
        status = parcel->writeInt32(mBytesPerFrame);
@@ -97,7 +101,7 @@ status_t RingBufferParcelable::writeToParcel(Parcel* parcel) const {
    }
    return NO_ERROR;
error:
    ALOGE("writeToParcel() error = %d", status);
    ALOGE("%s returning %d", __func__, status);
    return status;
}

@@ -118,9 +122,9 @@ status_t RingBufferParcelable::readFromParcel(const Parcel* parcel) {
        status = mDataParcelable.readFromParcel(parcel);
        if (status != NO_ERROR) goto error;
    }
    return NO_ERROR;
    return AAudioConvert_aaudioToAndroidStatus(validate());
error:
    ALOGE("readFromParcel() error = %d", status);
    ALOGE("%s returning %d", __func__, status);
    return status;
}

@@ -151,8 +155,7 @@ aaudio_result_t RingBufferParcelable::resolve(SharedMemoryParcelable *memoryParc
    return AAUDIO_OK;
}

aaudio_result_t RingBufferParcelable::validate() {
    aaudio_result_t result;
aaudio_result_t RingBufferParcelable::validate() const {
    if (mCapacityInFrames < 0 || mCapacityInFrames >= 32 * 1024) {
        ALOGE("invalid mCapacityInFrames = %d", mCapacityInFrames);
        return AAUDIO_ERROR_INTERNAL;
@@ -165,18 +168,6 @@ aaudio_result_t RingBufferParcelable::validate() {
        ALOGE("invalid mFramesPerBurst = %d", mFramesPerBurst);
        return AAUDIO_ERROR_INTERNAL;
    }
    if ((result = mReadCounterParcelable.validate()) != AAUDIO_OK) {
        ALOGE("invalid mReadCounterParcelable = %d", result);
        return result;
    }
    if ((result = mWriteCounterParcelable.validate()) != AAUDIO_OK) {
        ALOGE("invalid mWriteCounterParcelable = %d", result);
        return result;
    }
    if ((result = mDataParcelable.validate()) != AAUDIO_OK) {
        ALOGE("invalid mDataParcelable = %d", result);
        return result;
    }
    return AAUDIO_OK;
}

+3 −2
Original line number Diff line number Diff line
@@ -66,11 +66,12 @@ public:

    aaudio_result_t resolve(SharedMemoryParcelable *memoryParcels, RingBufferDescriptor *descriptor);

    aaudio_result_t validate();

    void dump();

private:

    aaudio_result_t validate() const;

    SharedRegionParcelable  mReadCounterParcelable;
    SharedRegionParcelable  mWriteCounterParcelable;
    SharedRegionParcelable  mDataParcelable;
Loading