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

Commit 901f65de authored by jiabin's avatar jiabin
Browse files

Add parameters validation on AAudio MMap server

Bug: 63384314
Test: adb shell /system/bin/write_sine -m -pl -n4 \
&& adb shell /system/bin/write_sine -pl -n4 \
&& adb shell /system/bin/write_sine_callback -m -pl -n4 \
&& adb shell /system/bin/write_sine_callback -pl -n4 \
&& adb shell /system/bin/CtsNativeMediaAAudioTestCases32

Change-Id: I462f956e8fc25eb583699af6389e0f299243eafb
parent 6ac42ebf
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ LOCAL_SRC_FILES = \
    core/AudioStream.cpp \
    core/AudioStreamBuilder.cpp \
    core/AAudioAudio.cpp \
    core/AAudioStreamParameters.cpp \
    legacy/AudioStreamLegacy.cpp \
    legacy/AudioStreamRecord.cpp \
    legacy/AudioStreamTrack.cpp \
@@ -90,6 +91,7 @@ LOCAL_C_INCLUDES := \
LOCAL_SRC_FILES = core/AudioStream.cpp \
    core/AudioStreamBuilder.cpp \
    core/AAudioAudio.cpp \
    core/AAudioStreamParameters.cpp \
    legacy/AudioStreamLegacy.cpp \
    legacy/AudioStreamRecord.cpp \
    legacy/AudioStreamTrack.cpp \
+20 −50
Original line number Diff line number Diff line
@@ -36,17 +36,17 @@ AAudioStreamConfiguration::~AAudioStreamConfiguration() {}

status_t AAudioStreamConfiguration::writeToParcel(Parcel* parcel) const {
    status_t status;
    status = parcel->writeInt32(mDeviceId);
    status = parcel->writeInt32(getDeviceId());
    if (status != NO_ERROR) goto error;
    status = parcel->writeInt32(mSampleRate);
    status = parcel->writeInt32(getSampleRate());
    if (status != NO_ERROR) goto error;
    status = parcel->writeInt32(mSamplesPerFrame);
    status = parcel->writeInt32(getSamplesPerFrame());
    if (status != NO_ERROR) goto error;
    status = parcel->writeInt32((int32_t) mSharingMode);
    status = parcel->writeInt32((int32_t) getSharingMode());
    if (status != NO_ERROR) goto error;
    status = parcel->writeInt32((int32_t) mAudioFormat);
    status = parcel->writeInt32((int32_t) getFormat());
    if (status != NO_ERROR) goto error;
    status = parcel->writeInt32(mBufferCapacity);
    status = parcel->writeInt32(getBufferCapacity());
    if (status != NO_ERROR) goto error;
    return NO_ERROR;
error:
@@ -55,57 +55,27 @@ error:
}

status_t AAudioStreamConfiguration::readFromParcel(const Parcel* parcel) {
    status_t status = parcel->readInt32(&mDeviceId);
    int32_t value;
    status_t status = parcel->readInt32(&value);
    if (status != NO_ERROR) goto error;
    status = parcel->readInt32(&mSampleRate);
    setDeviceId(value);
    status = parcel->readInt32(&value);
    if (status != NO_ERROR) goto error;
    status = parcel->readInt32(&mSamplesPerFrame);
    setSampleRate(value);
    status = parcel->readInt32(&value);
    if (status != NO_ERROR) goto error;
    status = parcel->readInt32(&mSharingMode);
    setSamplesPerFrame(value);
    status = parcel->readInt32(&value);
    if (status != NO_ERROR) goto error;
    status = parcel->readInt32(&mAudioFormat);
    setSharingMode(value);
    status = parcel->readInt32(&value);
    if (status != NO_ERROR) goto error;
    status = parcel->readInt32(&mBufferCapacity);
    setFormat(value);
    status = parcel->readInt32(&value);
    if (status != NO_ERROR) goto error;
    setBufferCapacity(value);
    return NO_ERROR;
error:
    ALOGE("AAudioStreamConfiguration.readFromParcel(): read failed = %d", status);
    return status;
}
 No newline at end of file

aaudio_result_t AAudioStreamConfiguration::validate() const {
    // Validate results of the open.
    if (mSampleRate < 0 || mSampleRate >= 8 * 48000) { // TODO review limits
        ALOGE("AAudioStreamConfiguration.validate(): invalid sampleRate = %d", mSampleRate);
        return AAUDIO_ERROR_INTERNAL;
    }

    if (mSamplesPerFrame < 1 || mSamplesPerFrame >= 32) { // TODO review limits
        ALOGE("AAudioStreamConfiguration.validate() invalid samplesPerFrame = %d", mSamplesPerFrame);
        return AAUDIO_ERROR_INTERNAL;
    }

    switch (mAudioFormat) {
    case AAUDIO_FORMAT_PCM_I16:
    case AAUDIO_FORMAT_PCM_FLOAT:
        break;
    default:
        ALOGE("AAudioStreamConfiguration.validate() invalid audioFormat = %d", mAudioFormat);
        return AAUDIO_ERROR_INTERNAL;
    }

    if (mBufferCapacity < 0) {
        ALOGE("AAudioStreamConfiguration.validate() invalid mBufferCapacity = %d", mBufferCapacity);
        return AAUDIO_ERROR_INTERNAL;
    }
    return AAUDIO_OK;
}

void AAudioStreamConfiguration::dump() const {
    ALOGD("AAudioStreamConfiguration mDeviceId        = %d", mDeviceId);
    ALOGD("AAudioStreamConfiguration mSampleRate      = %d", mSampleRate);
    ALOGD("AAudioStreamConfiguration mSamplesPerFrame = %d", mSamplesPerFrame);
    ALOGD("AAudioStreamConfiguration mSharingMode     = %d", (int)mSharingMode);
    ALOGD("AAudioStreamConfiguration mAudioFormat     = %d", (int)mAudioFormat);
    ALOGD("AAudioStreamConfiguration mBufferCapacity  = %d", mBufferCapacity);
}
+2 −61
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <aaudio/AAudio.h>
#include <binder/Parcel.h>
#include <binder/Parcelable.h>
#include "core/AAudioStreamParameters.h"

using android::status_t;
using android::Parcel;
@@ -29,74 +30,14 @@ using android::Parcelable;

namespace aaudio {

class AAudioStreamConfiguration : public Parcelable {
class AAudioStreamConfiguration : public AAudioStreamParameters, public Parcelable {
public:
    AAudioStreamConfiguration();
    virtual ~AAudioStreamConfiguration();

    int32_t getDeviceId() const {
        return mDeviceId;
    }

    void setDeviceId(int32_t deviceId) {
        mDeviceId = deviceId;
    }

    int32_t getSampleRate() const {
        return mSampleRate;
    }

    void setSampleRate(int32_t sampleRate) {
        mSampleRate = sampleRate;
    }

    int32_t getSamplesPerFrame() const {
        return mSamplesPerFrame;
    }

    void setSamplesPerFrame(int32_t samplesPerFrame) {
        mSamplesPerFrame = samplesPerFrame;
    }

    aaudio_format_t getAudioFormat() const {
        return mAudioFormat;
    }

    void setAudioFormat(aaudio_format_t audioFormat) {
        mAudioFormat = audioFormat;
    }

    aaudio_sharing_mode_t getSharingMode() const {
        return mSharingMode;
    }

    void setSharingMode(aaudio_sharing_mode_t sharingMode) {
        mSharingMode = sharingMode;
    }

    int32_t getBufferCapacity() const {
        return mBufferCapacity;
    }

    void setBufferCapacity(int32_t frames) {
        mBufferCapacity = frames;
    }

    virtual status_t writeToParcel(Parcel* parcel) const override;

    virtual status_t readFromParcel(const Parcel* parcel) override;

    aaudio_result_t validate() const;

    void dump() const;

private:
    int32_t               mDeviceId        = AAUDIO_UNSPECIFIED;
    int32_t               mSampleRate      = AAUDIO_UNSPECIFIED;
    int32_t               mSamplesPerFrame = AAUDIO_UNSPECIFIED;
    aaudio_sharing_mode_t mSharingMode     = AAUDIO_SHARING_MODE_SHARED;
    aaudio_format_t       mAudioFormat     = AAUDIO_FORMAT_UNSPECIFIED;
    int32_t               mBufferCapacity  = AAUDIO_UNSPECIFIED;
};

} /* namespace aaudio */
+13 −7
Original line number Diff line number Diff line
@@ -264,13 +264,19 @@ status_t BnAAudioService::onTransact(uint32_t code, const Parcel& data,
        case OPEN_STREAM: {
            CHECK_INTERFACE(IAAudioService, data, reply);
            request.readFromParcel(&data);
            result = request.validate();
            if (result != AAUDIO_OK) {
                streamHandle = result;
            } else {
                //ALOGD("BnAAudioService::client openStream request dump --------------------");
                //request.dump();
                // Override the uid and pid from the client in case they are incorrect.
                request.setUserId(IPCThreadState::self()->getCallingUid());
                request.setProcessId(IPCThreadState::self()->getCallingPid());
                streamHandle = openStream(request, configuration);
            //ALOGD("BnAAudioService::onTransact OPEN_STREAM server handle = 0x%08X", streamHandle);
                //ALOGD("BnAAudioService::onTransact OPEN_STREAM server handle = 0x%08X",
                //        streamHandle);
            }
            reply->writeInt32(streamHandle);
            configuration.writeToParcel(reply);
            return NO_ERROR;
+2 −2
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@ aaudio_result_t AudioStreamInternal::open(const AudioStreamBuilder &builder) {
        setFormat(AAUDIO_FORMAT_PCM_FLOAT);
    }
    // Request FLOAT for the shared mixer.
    request.getConfiguration().setAudioFormat(AAUDIO_FORMAT_PCM_FLOAT);
    request.getConfiguration().setFormat(AAUDIO_FORMAT_PCM_FLOAT);

    // Build the request to send to the server.
    request.setUserId(getuid());
@@ -119,7 +119,7 @@ aaudio_result_t AudioStreamInternal::open(const AudioStreamBuilder &builder) {
        setSharingMode(configuration.getSharingMode());

        // Save device format so we can do format conversion and volume scaling together.
        mDeviceFormat = configuration.getAudioFormat();
        mDeviceFormat = configuration.getFormat();

        result = mServiceInterface.getStreamDescription(mServiceStreamHandle, mEndPointParcelable);
        if (result != AAUDIO_OK) {
Loading