AI 144151: am: CL 144150 Fix heap corruption.

Take mutex in close(), and skip write path after turning bluetooth off.
  Original author: npelly
  Merged from: //branches/cupcake/...

Automated import of CL 144151
This commit is contained in:
Nick Pelly
2009-04-02 01:21:13 -07:00
committed by The Android Open Source Project
parent 5a0cb42f3f
commit 0827c81466
2 changed files with 43 additions and 12 deletions

View File

@@ -92,16 +92,15 @@ status_t A2dpAudioInterface::getMicMute(bool* state)
status_t A2dpAudioInterface::setParameter(const char *key, const char *value)
{
LOGD("setParameter %s,%s\n", key, value);
if (!key || !value)
return -EINVAL;
if (strcmp(key, "a2dp_sink_address") == 0) {
if (strcmp(key, "a2dp_sink_address") == 0) {
return mOutput->setAddress(value);
}
if (strcmp(key, "bluetooth_enabled") == 0 &&
strcmp(value, "false") == 0) {
return mOutput->close();
if (strcmp(key, "bluetooth_enabled") == 0) {
mOutput->setBluetoothEnabled(strcmp(value, "true") == 0);
}
return 0;
@@ -130,7 +129,10 @@ status_t A2dpAudioInterface::dump(int fd, const Vector<String16>& args)
// ----------------------------------------------------------------------------
A2dpAudioInterface::A2dpAudioStreamOut::A2dpAudioStreamOut() :
mFd(-1), mStandby(true), mStartCount(0), mRetryCount(0), mData(NULL)
mFd(-1), mStandby(true), mStartCount(0), mRetryCount(0), mData(NULL),
// assume BT enabled to start, this is safe because its only the
// enabled->disabled transition we are worried about
mBluetoothEnabled(true)
{
// use any address by default
strcpy(mA2dpAddress, "00:00:00:00:00:00");
@@ -162,14 +164,21 @@ A2dpAudioInterface::A2dpAudioStreamOut::~A2dpAudioStreamOut()
}
ssize_t A2dpAudioInterface::A2dpAudioStreamOut::write(const void* buffer, size_t bytes)
{
{
Mutex::Autolock lock(mLock);
size_t remaining = bytes;
status_t status = init();
status_t status = -1;
if (!mBluetoothEnabled) {
LOGW("A2dpAudioStreamOut::write(), but bluetooth disabled");
goto Error;
}
status = init();
if (status < 0)
goto Error;
while (remaining > 0) {
status = a2dp_write(mData, buffer, remaining);
if (status <= 0) {
@@ -181,7 +190,7 @@ ssize_t A2dpAudioInterface::A2dpAudioStreamOut::write(const void* buffer, size_t
}
mStandby = false;
return bytes;
Error:
@@ -235,7 +244,26 @@ status_t A2dpAudioInterface::A2dpAudioStreamOut::setAddress(const char* address)
return NO_ERROR;
}
status_t A2dpAudioInterface::A2dpAudioStreamOut::setBluetoothEnabled(bool enabled)
{
LOGD("setBluetoothEnabled %d", enabled);
Mutex::Autolock lock(mLock);
mBluetoothEnabled = enabled;
if (!enabled) {
return close_l();
}
return NO_ERROR;
}
status_t A2dpAudioInterface::A2dpAudioStreamOut::close()
{
Mutex::Autolock lock(mLock);
return close_l();
}
status_t A2dpAudioInterface::A2dpAudioStreamOut::close_l()
{
if (mData) {
a2dp_cleanup(mData);

View File

@@ -88,7 +88,9 @@ private:
friend class A2dpAudioInterface;
status_t init();
status_t close();
status_t setAddress(const char* address);
status_t close_l();
status_t setAddress(const char* address);
status_t setBluetoothEnabled(bool enabled);
private:
int mFd;
@@ -98,6 +100,7 @@ private:
char mA2dpAddress[20];
void* mData;
Mutex mLock;
bool mBluetoothEnabled;
};
A2dpAudioStreamOut* mOutput;