Backed out 6 changesets (bug 1059813) by request.

Backed out changeset cffeecd46cad (bug 1059813)
Backed out changeset f991f546dbcd (bug 1059813)
Backed out changeset ab4056a1aa06 (bug 1059813)
Backed out changeset d08a91fee65a (bug 1059813)
Backed out changeset 7bd0ecf96e59 (bug 1059813)
Backed out changeset 0b7a62175398 (bug 1059813)
This commit is contained in:
Ryan VanderMeulen 2014-09-03 11:29:16 -04:00
parent f75f7b7b52
commit afa65517bc
11 changed files with 153 additions and 236 deletions

View File

@ -751,7 +751,6 @@ BluetoothOppManager::ComposePacket(uint8_t aOpCode, UnixSocketRawData* aMessage)
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aMessage);
const uint8_t* data = aMessage->GetData();
int frameHeaderLength = 0;
// See if this is the first part of each Put packet
@ -760,9 +759,8 @@ BluetoothOppManager::ComposePacket(uint8_t aOpCode, UnixSocketRawData* aMessage)
// [opcode:1][length:2][Headers:var]
frameHeaderLength = 3;
mPacketLength = ((static_cast<int>(data[1]) << 8) | data[2]) -
frameHeaderLength;
mPacketLength = ((((int)aMessage->mData[1]) << 8) | aMessage->mData[2]) -
frameHeaderLength;
/**
* A PUT request from remote devices may be divided into multiple parts.
* In other words, one request may need to be received multiple times,
@ -773,7 +771,7 @@ BluetoothOppManager::ComposePacket(uint8_t aOpCode, UnixSocketRawData* aMessage)
mPutFinalFlag = (aOpCode == ObexRequestCode::PutFinal);
}
int dataLength = aMessage->GetSize() - frameHeaderLength;
int dataLength = aMessage->mSize - frameHeaderLength;
// Check length before memcpy to prevent from memory pollution
if (dataLength < 0 ||
@ -788,7 +786,7 @@ BluetoothOppManager::ComposePacket(uint8_t aOpCode, UnixSocketRawData* aMessage)
}
memcpy(mReceivedDataBuffer.get() + mPutPacketReceivedLength,
&data[frameHeaderLength], dataLength);
&aMessage->mData[frameHeaderLength], dataLength);
mPutPacketReceivedLength += dataLength;
@ -801,13 +799,12 @@ BluetoothOppManager::ServerDataHandler(UnixSocketRawData* aMessage)
MOZ_ASSERT(NS_IsMainThread());
uint8_t opCode;
int receivedLength = aMessage->GetSize();
const uint8_t* data = aMessage->GetData();
int receivedLength = aMessage->mSize;
if (mPutPacketReceivedLength > 0) {
opCode = mPutFinalFlag ? ObexRequestCode::PutFinal : ObexRequestCode::Put;
} else {
opCode = data[0];
opCode = aMessage->mData[0];
// When there's a Put packet right after a PutFinal packet,
// which means it's the start point of a new file.
@ -824,7 +821,7 @@ BluetoothOppManager::ServerDataHandler(UnixSocketRawData* aMessage)
// Section 3.3.1 "Connect", IrOBEX 1.2
// [opcode:1][length:2][version:1][flags:1][MaxPktSizeWeCanReceive:2]
// [Headers:var]
if (!ParseHeaders(&data[7], receivedLength - 7, &pktHeaders)) {
if (!ParseHeaders(&aMessage->mData[7], receivedLength - 7, &pktHeaders)) {
ReplyError(ObexResponseCode::BadRequest);
return;
}
@ -834,7 +831,7 @@ BluetoothOppManager::ServerDataHandler(UnixSocketRawData* aMessage)
} else if (opCode == ObexRequestCode::Abort) {
// Section 3.3.5 "Abort", IrOBEX 1.2
// [opcode:1][length:2][Headers:var]
if (!ParseHeaders(&data[3], receivedLength - 3, &pktHeaders)) {
if (!ParseHeaders(&aMessage->mData[3], receivedLength - 3, &pktHeaders)) {
ReplyError(ObexResponseCode::BadRequest);
return;
}
@ -844,7 +841,7 @@ BluetoothOppManager::ServerDataHandler(UnixSocketRawData* aMessage)
} else if (opCode == ObexRequestCode::Disconnect) {
// Section 3.3.2 "Disconnect", IrOBEX 1.2
// [opcode:1][length:2][Headers:var]
if (!ParseHeaders(&data[3], receivedLength - 3, &pktHeaders)) {
if (!ParseHeaders(&aMessage->mData[3], receivedLength - 3, &pktHeaders)) {
ReplyError(ObexResponseCode::BadRequest);
return;
}
@ -927,8 +924,7 @@ BluetoothOppManager::ClientDataHandler(UnixSocketRawData* aMessage)
{
MOZ_ASSERT(NS_IsMainThread());
const uint8_t* data = aMessage->GetData();
uint8_t opCode = data[0];
uint8_t opCode = aMessage->mData[0];
// Check response code and send out system message as finished if the response
// code is somehow incorrect.
@ -985,9 +981,10 @@ BluetoothOppManager::ClientDataHandler(UnixSocketRawData* aMessage)
AfterOppConnected();
// Keep remote information
mRemoteObexVersion = data[3];
mRemoteConnectionFlags = data[4];
mRemoteMaxPacketLength = ((static_cast<int>(data[5]) << 8) | data[6]);
mRemoteObexVersion = aMessage->mData[3];
mRemoteConnectionFlags = aMessage->mData[4];
mRemoteMaxPacketLength =
(((int)(aMessage->mData[5]) << 8) | aMessage->mData[6]);
// The length of file name exceeds maximum length.
int fileNameByteLen = (mFileName.Length() + 1) * 2;
@ -1256,7 +1253,8 @@ BluetoothOppManager::SendObexData(uint8_t* aData, uint8_t aOpcode, int aSize)
mLastCommand = aOpcode;
}
UnixSocketRawData* s = new UnixSocketRawData(aData, aSize);
UnixSocketRawData* s = new UnixSocketRawData(aSize);
memcpy(s->mData, aData, s->mSize);
mSocket->SendSocketData(s);
}

View File

@ -707,8 +707,7 @@ BluetoothHfpManager::ReceiveSocketData(BluetoothSocket* aSocket,
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aSocket);
nsAutoCString msg(reinterpret_cast<const char*>(aMessage->GetData()),
aMessage->GetSize());
nsAutoCString msg((const char*)aMessage->mData.get(), aMessage->mSize);
msg.StripWhitespace();
nsTArray<nsCString> atCommandValues;

View File

@ -774,7 +774,6 @@ BluetoothOppManager::ComposePacket(uint8_t aOpCode, UnixSocketRawData* aMessage)
MOZ_ASSERT(aMessage);
int frameHeaderLength = 0;
const uint8_t* data = aMessage->GetData();
// See if this is the first part of each Put packet
if (mPutPacketReceivedLength == 0) {
@ -782,8 +781,8 @@ BluetoothOppManager::ComposePacket(uint8_t aOpCode, UnixSocketRawData* aMessage)
// [opcode:1][length:2][Headers:var]
frameHeaderLength = 3;
mPacketLength = ((static_cast<int>(data[1]) << 8) | data[2]) -
frameHeaderLength;
mPacketLength = ((((int)aMessage->mData[1]) << 8) | aMessage->mData[2]) -
frameHeaderLength;
/**
* A PUT request from remote devices may be divided into multiple parts.
* In other words, one request may need to be received multiple times,
@ -794,7 +793,7 @@ BluetoothOppManager::ComposePacket(uint8_t aOpCode, UnixSocketRawData* aMessage)
mPutFinalFlag = (aOpCode == ObexRequestCode::PutFinal);
}
int dataLength = aMessage->GetSize() - frameHeaderLength;
int dataLength = aMessage->mSize - frameHeaderLength;
// Check length before memcpy to prevent from memory pollution
if (dataLength < 0 ||
@ -809,7 +808,7 @@ BluetoothOppManager::ComposePacket(uint8_t aOpCode, UnixSocketRawData* aMessage)
}
memcpy(mReceivedDataBuffer.get() + mPutPacketReceivedLength,
&data[frameHeaderLength], dataLength);
&aMessage->mData[frameHeaderLength], dataLength);
mPutPacketReceivedLength += dataLength;
@ -822,13 +821,12 @@ BluetoothOppManager::ServerDataHandler(UnixSocketRawData* aMessage)
MOZ_ASSERT(NS_IsMainThread());
uint8_t opCode;
int receivedLength = aMessage->GetSize();
const uint8_t* data = aMessage->GetData();
int receivedLength = aMessage->mSize;
if (mPutPacketReceivedLength > 0) {
opCode = mPutFinalFlag ? ObexRequestCode::PutFinal : ObexRequestCode::Put;
} else {
opCode = data[0];
opCode = aMessage->mData[0];
// When there's a Put packet right after a PutFinal packet,
// which means it's the start point of a new file.
@ -845,7 +843,7 @@ BluetoothOppManager::ServerDataHandler(UnixSocketRawData* aMessage)
// Section 3.3.1 "Connect", IrOBEX 1.2
// [opcode:1][length:2][version:1][flags:1][MaxPktSizeWeCanReceive:2]
// [Headers:var]
if (!ParseHeaders(&data[7], receivedLength - 7, &pktHeaders)) {
if (!ParseHeaders(&aMessage->mData[7], receivedLength - 7, &pktHeaders)) {
ReplyError(ObexResponseCode::BadRequest);
return;
}
@ -855,7 +853,7 @@ BluetoothOppManager::ServerDataHandler(UnixSocketRawData* aMessage)
} else if (opCode == ObexRequestCode::Abort) {
// Section 3.3.5 "Abort", IrOBEX 1.2
// [opcode:1][length:2][Headers:var]
if (!ParseHeaders(&data[3], receivedLength - 3, &pktHeaders)) {
if (!ParseHeaders(&aMessage->mData[3], receivedLength - 3, &pktHeaders)) {
ReplyError(ObexResponseCode::BadRequest);
return;
}
@ -865,7 +863,7 @@ BluetoothOppManager::ServerDataHandler(UnixSocketRawData* aMessage)
} else if (opCode == ObexRequestCode::Disconnect) {
// Section 3.3.2 "Disconnect", IrOBEX 1.2
// [opcode:1][length:2][Headers:var]
if (!ParseHeaders(&data[3], receivedLength - 3, &pktHeaders)) {
if (!ParseHeaders(&aMessage->mData[3], receivedLength - 3, &pktHeaders)) {
ReplyError(ObexResponseCode::BadRequest);
return;
}
@ -948,8 +946,7 @@ BluetoothOppManager::ClientDataHandler(UnixSocketRawData* aMessage)
{
MOZ_ASSERT(NS_IsMainThread());
const uint8_t* data = aMessage->GetData();
uint8_t opCode = data[0];
uint8_t opCode = aMessage->mData[0];
// Check response code and send out system message as finished if the response
// code is somehow incorrect.
@ -1006,9 +1003,10 @@ BluetoothOppManager::ClientDataHandler(UnixSocketRawData* aMessage)
AfterOppConnected();
// Keep remote information
mRemoteObexVersion = data[3];
mRemoteConnectionFlags = data[4];
mRemoteMaxPacketLength = (static_cast<int>(data[5]) << 8) | data[6];
mRemoteObexVersion = aMessage->mData[3];
mRemoteConnectionFlags = aMessage->mData[4];
mRemoteMaxPacketLength =
(((int)(aMessage->mData[5]) << 8) | aMessage->mData[6]);
// The length of file name exceeds maximum length.
int fileNameByteLen = (mFileName.Length() + 1) * 2;
@ -1276,7 +1274,8 @@ BluetoothOppManager::SendObexData(uint8_t* aData, uint8_t aOpcode, int aSize)
mLastCommand = aOpcode;
}
UnixSocketRawData* s = new UnixSocketRawData(aData, aSize);
UnixSocketRawData* s = new UnixSocketRawData(aSize);
memcpy(s->mData, aData, s->mSize);
mSocket->SendSocketData(s);
}

View File

@ -751,7 +751,6 @@ BluetoothOppManager::ComposePacket(uint8_t aOpCode, UnixSocketRawData* aMessage)
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aMessage);
const uint8_t* data = aMessage->GetData();
int frameHeaderLength = 0;
// See if this is the first part of each Put packet
@ -760,9 +759,8 @@ BluetoothOppManager::ComposePacket(uint8_t aOpCode, UnixSocketRawData* aMessage)
// [opcode:1][length:2][Headers:var]
frameHeaderLength = 3;
mPacketLength = ((static_cast<int>(data[1]) << 8) | data[2]) -
frameHeaderLength;
mPacketLength = ((((int)aMessage->mData[1]) << 8) | aMessage->mData[2]) -
frameHeaderLength;
/**
* A PUT request from remote devices may be divided into multiple parts.
* In other words, one request may need to be received multiple times,
@ -773,7 +771,7 @@ BluetoothOppManager::ComposePacket(uint8_t aOpCode, UnixSocketRawData* aMessage)
mPutFinalFlag = (aOpCode == ObexRequestCode::PutFinal);
}
int dataLength = aMessage->GetSize() - frameHeaderLength;
int dataLength = aMessage->mSize - frameHeaderLength;
// Check length before memcpy to prevent from memory pollution
if (dataLength < 0 ||
@ -788,7 +786,7 @@ BluetoothOppManager::ComposePacket(uint8_t aOpCode, UnixSocketRawData* aMessage)
}
memcpy(mReceivedDataBuffer.get() + mPutPacketReceivedLength,
&data[frameHeaderLength], dataLength);
&aMessage->mData[frameHeaderLength], dataLength);
mPutPacketReceivedLength += dataLength;
@ -801,13 +799,12 @@ BluetoothOppManager::ServerDataHandler(UnixSocketRawData* aMessage)
MOZ_ASSERT(NS_IsMainThread());
uint8_t opCode;
int receivedLength = aMessage->GetSize();
const uint8_t* data = aMessage->GetData();
int receivedLength = aMessage->mSize;
if (mPutPacketReceivedLength > 0) {
opCode = mPutFinalFlag ? ObexRequestCode::PutFinal : ObexRequestCode::Put;
} else {
opCode = data[0];
opCode = aMessage->mData[0];
// When there's a Put packet right after a PutFinal packet,
// which means it's the start point of a new file.
@ -824,7 +821,7 @@ BluetoothOppManager::ServerDataHandler(UnixSocketRawData* aMessage)
// Section 3.3.1 "Connect", IrOBEX 1.2
// [opcode:1][length:2][version:1][flags:1][MaxPktSizeWeCanReceive:2]
// [Headers:var]
if (!ParseHeaders(&data[7], receivedLength - 7, &pktHeaders)) {
if (!ParseHeaders(&aMessage->mData[7], receivedLength - 7, &pktHeaders)) {
ReplyError(ObexResponseCode::BadRequest);
return;
}
@ -834,7 +831,7 @@ BluetoothOppManager::ServerDataHandler(UnixSocketRawData* aMessage)
} else if (opCode == ObexRequestCode::Abort) {
// Section 3.3.5 "Abort", IrOBEX 1.2
// [opcode:1][length:2][Headers:var]
if (!ParseHeaders(&data[3], receivedLength - 3, &pktHeaders)) {
if (!ParseHeaders(&aMessage->mData[3], receivedLength - 3, &pktHeaders)) {
ReplyError(ObexResponseCode::BadRequest);
return;
}
@ -844,7 +841,7 @@ BluetoothOppManager::ServerDataHandler(UnixSocketRawData* aMessage)
} else if (opCode == ObexRequestCode::Disconnect) {
// Section 3.3.2 "Disconnect", IrOBEX 1.2
// [opcode:1][length:2][Headers:var]
if (!ParseHeaders(&data[3], receivedLength - 3, &pktHeaders)) {
if (!ParseHeaders(&aMessage->mData[3], receivedLength - 3, &pktHeaders)) {
ReplyError(ObexResponseCode::BadRequest);
return;
}
@ -927,8 +924,7 @@ BluetoothOppManager::ClientDataHandler(UnixSocketRawData* aMessage)
{
MOZ_ASSERT(NS_IsMainThread());
const uint8_t* data = aMessage->GetData();
uint8_t opCode = data[0];
uint8_t opCode = aMessage->mData[0];
// Check response code and send out system message as finished if the response
// code is somehow incorrect.
@ -985,9 +981,10 @@ BluetoothOppManager::ClientDataHandler(UnixSocketRawData* aMessage)
AfterOppConnected();
// Keep remote information
mRemoteObexVersion = data[3];
mRemoteConnectionFlags = data[4];
mRemoteMaxPacketLength = ((static_cast<int>(data[5]) << 8) | data[6]);
mRemoteObexVersion = aMessage->mData[3];
mRemoteConnectionFlags = aMessage->mData[4];
mRemoteMaxPacketLength =
(((int)(aMessage->mData[5]) << 8) | aMessage->mData[6]);
// The length of file name exceeds maximum length.
int fileNameByteLen = (mFileName.Length() + 1) * 2;
@ -1256,7 +1253,8 @@ BluetoothOppManager::SendObexData(uint8_t* aData, uint8_t aOpcode, int aSize)
mLastCommand = aOpcode;
}
UnixSocketRawData* s = new UnixSocketRawData(aData, aSize);
UnixSocketRawData* s = new UnixSocketRawData(aSize);
memcpy(s->mData, aData, s->mSize);
mSocket->SendSocketData(s);
}

View File

@ -707,8 +707,7 @@ BluetoothHfpManager::ReceiveSocketData(BluetoothSocket* aSocket,
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aSocket);
nsAutoCString msg(reinterpret_cast<const char*>(aMessage->GetData()),
aMessage->GetSize());
nsAutoCString msg((const char*)aMessage->mData.get(), aMessage->mSize);
msg.StripWhitespace();
nsTArray<nsCString> atCommandValues;

View File

@ -774,7 +774,6 @@ BluetoothOppManager::ComposePacket(uint8_t aOpCode, UnixSocketRawData* aMessage)
MOZ_ASSERT(aMessage);
int frameHeaderLength = 0;
const uint8_t* data = aMessage->GetData();
// See if this is the first part of each Put packet
if (mPutPacketReceivedLength == 0) {
@ -782,8 +781,8 @@ BluetoothOppManager::ComposePacket(uint8_t aOpCode, UnixSocketRawData* aMessage)
// [opcode:1][length:2][Headers:var]
frameHeaderLength = 3;
mPacketLength = ((static_cast<int>(data[1]) << 8) | data[2]) -
frameHeaderLength;
mPacketLength = ((((int)aMessage->mData[1]) << 8) | aMessage->mData[2]) -
frameHeaderLength;
/**
* A PUT request from remote devices may be divided into multiple parts.
* In other words, one request may need to be received multiple times,
@ -794,7 +793,7 @@ BluetoothOppManager::ComposePacket(uint8_t aOpCode, UnixSocketRawData* aMessage)
mPutFinalFlag = (aOpCode == ObexRequestCode::PutFinal);
}
int dataLength = aMessage->GetSize() - frameHeaderLength;
int dataLength = aMessage->mSize - frameHeaderLength;
// Check length before memcpy to prevent from memory pollution
if (dataLength < 0 ||
@ -809,7 +808,7 @@ BluetoothOppManager::ComposePacket(uint8_t aOpCode, UnixSocketRawData* aMessage)
}
memcpy(mReceivedDataBuffer.get() + mPutPacketReceivedLength,
&data[frameHeaderLength], dataLength);
&aMessage->mData[frameHeaderLength], dataLength);
mPutPacketReceivedLength += dataLength;
@ -822,13 +821,12 @@ BluetoothOppManager::ServerDataHandler(UnixSocketRawData* aMessage)
MOZ_ASSERT(NS_IsMainThread());
uint8_t opCode;
int receivedLength = aMessage->GetSize();
const uint8_t* data = aMessage->GetData();
int receivedLength = aMessage->mSize;
if (mPutPacketReceivedLength > 0) {
opCode = mPutFinalFlag ? ObexRequestCode::PutFinal : ObexRequestCode::Put;
} else {
opCode = data[0];
opCode = aMessage->mData[0];
// When there's a Put packet right after a PutFinal packet,
// which means it's the start point of a new file.
@ -845,7 +843,7 @@ BluetoothOppManager::ServerDataHandler(UnixSocketRawData* aMessage)
// Section 3.3.1 "Connect", IrOBEX 1.2
// [opcode:1][length:2][version:1][flags:1][MaxPktSizeWeCanReceive:2]
// [Headers:var]
if (!ParseHeaders(&data[7], receivedLength - 7, &pktHeaders)) {
if (!ParseHeaders(&aMessage->mData[7], receivedLength - 7, &pktHeaders)) {
ReplyError(ObexResponseCode::BadRequest);
return;
}
@ -855,7 +853,7 @@ BluetoothOppManager::ServerDataHandler(UnixSocketRawData* aMessage)
} else if (opCode == ObexRequestCode::Abort) {
// Section 3.3.5 "Abort", IrOBEX 1.2
// [opcode:1][length:2][Headers:var]
if (!ParseHeaders(&data[3], receivedLength - 3, &pktHeaders)) {
if (!ParseHeaders(&aMessage->mData[3], receivedLength - 3, &pktHeaders)) {
ReplyError(ObexResponseCode::BadRequest);
return;
}
@ -865,7 +863,7 @@ BluetoothOppManager::ServerDataHandler(UnixSocketRawData* aMessage)
} else if (opCode == ObexRequestCode::Disconnect) {
// Section 3.3.2 "Disconnect", IrOBEX 1.2
// [opcode:1][length:2][Headers:var]
if (!ParseHeaders(&data[3], receivedLength - 3, &pktHeaders)) {
if (!ParseHeaders(&aMessage->mData[3], receivedLength - 3, &pktHeaders)) {
ReplyError(ObexResponseCode::BadRequest);
return;
}
@ -948,8 +946,7 @@ BluetoothOppManager::ClientDataHandler(UnixSocketRawData* aMessage)
{
MOZ_ASSERT(NS_IsMainThread());
const uint8_t* data = aMessage->GetData();
uint8_t opCode = data[0];
uint8_t opCode = aMessage->mData[0];
// Check response code and send out system message as finished if the response
// code is somehow incorrect.
@ -1006,9 +1003,10 @@ BluetoothOppManager::ClientDataHandler(UnixSocketRawData* aMessage)
AfterOppConnected();
// Keep remote information
mRemoteObexVersion = data[3];
mRemoteConnectionFlags = data[4];
mRemoteMaxPacketLength = (static_cast<int>(data[5]) << 8) | data[6];
mRemoteObexVersion = aMessage->mData[3];
mRemoteConnectionFlags = aMessage->mData[4];
mRemoteMaxPacketLength =
(((int)(aMessage->mData[5]) << 8) | aMessage->mData[6]);
// The length of file name exceeds maximum length.
int fileNameByteLen = (mFileName.Length() + 1) * 2;
@ -1276,7 +1274,8 @@ BluetoothOppManager::SendObexData(uint8_t* aData, uint8_t aOpcode, int aSize)
mLastCommand = aOpcode;
}
UnixSocketRawData* s = new UnixSocketRawData(aData, aSize);
UnixSocketRawData* s = new UnixSocketRawData(aSize);
memcpy(s->mData, aData, s->mSize);
mSocket->SendSocketData(s);
}

View File

@ -214,22 +214,26 @@ public:
{
assertIsNfcServiceThread();
while (mData->GetSize()) {
size_t size = mData->mSize;
size_t offset = 0;
while (size > 0) {
EventOptions event;
const uint8_t* data = mData->GetData();
uint32_t parcelSize = ((data[0] & 0xff) << 24) |
((data[1] & 0xff) << 16) |
((data[2] & 0xff) << 8) |
(data[3] & 0xff);
MOZ_ASSERT(parcelSize <= mData->GetSize());
const uint8_t* data = mData->mData.get();
uint32_t parcelSize = ((data[offset + 0] & 0xff) << 24) |
((data[offset + 1] & 0xff) << 16) |
((data[offset + 2] & 0xff) << 8) |
(data[offset + 3] & 0xff);
MOZ_ASSERT(parcelSize <= (mData->mSize - offset));
Parcel parcel;
parcel.setData(mData->GetData(), parcelSize + sizeof(parcelSize));
parcel.setData(&data[offset], parcelSize + sizeof(int));
mHandler->Unmarshall(parcel, event);
nsCOMPtr<nsIRunnable> runnable = new NfcEventDispatcher(event);
NS_DispatchToMainThread(runnable);
mData->Consume(parcelSize + sizeof(parcelSize));
size -= parcel.dataSize();
offset += parcel.dataSize();
}
return NS_OK;

View File

@ -400,7 +400,8 @@ KeyStore::ResetHandlerInfo()
bool
KeyStore::CheckSize(UnixSocketRawData *aMessage, size_t aExpectSize)
{
return (aMessage->GetSize() >= aExpectSize);
return (aMessage->mSize - aMessage->mCurrentWriteOffset >= aExpectSize) ?
true : false;
}
ResponseCode
@ -416,8 +417,8 @@ KeyStore::ReadCommand(UnixSocketRawData *aMessage)
return PROTOCOL_ERROR;
}
mHandlerInfo.command = *aMessage->GetData();
aMessage->Consume(1);
mHandlerInfo.command = aMessage->mData[aMessage->mCurrentWriteOffset];
aMessage->mCurrentWriteOffset++;
// Find corrsponding command pattern
const struct ProtocolCommand *command = commands;
@ -456,10 +457,9 @@ KeyStore::ReadLength(UnixSocketRawData *aMessage)
}
// Read length of command parameter.
// FIXME: Depends on endianess and (sizeof(unsigned short) == 2)
unsigned short dataLength;
memcpy(&dataLength, aMessage->GetData(), 2);
aMessage->Consume(2);
memcpy(&dataLength, &aMessage->mData[aMessage->mCurrentWriteOffset], 2);
aMessage->mCurrentWriteOffset += 2;
mHandlerInfo.param[mHandlerInfo.paramCount].length = ntohs(dataLength);
mHandlerInfo.state = STATE_READ_PARAM_DATA;
@ -482,9 +482,9 @@ KeyStore::ReadData(UnixSocketRawData *aMessage)
// Read command parameter.
memcpy(mHandlerInfo.param[mHandlerInfo.paramCount].data,
aMessage->GetData(),
&aMessage->mData[aMessage->mCurrentWriteOffset],
mHandlerInfo.param[mHandlerInfo.paramCount].length);
aMessage->Consume(mHandlerInfo.param[mHandlerInfo.paramCount].length);
aMessage->mCurrentWriteOffset += mHandlerInfo.param[mHandlerInfo.paramCount].length;
mHandlerInfo.paramCount++;
if (mHandlerInfo.paramCount == mHandlerInfo.commandPattern->paramNum) {
@ -528,7 +528,7 @@ KeyStore::ReceiveSocketData(nsAutoPtr<UnixSocketRawData>& aMessage)
// Handle request.
ResponseCode result = SUCCESS;
while (aMessage->GetSize() ||
while (aMessage->mCurrentWriteOffset < aMessage->mSize ||
mHandlerInfo.state == STATE_PROCESSING) {
switch (mHandlerInfo.state) {
case STATE_IDLE:

View File

@ -184,13 +184,11 @@ DispatchRILEvent::RunTask(JSContext *aCx)
{
JS::Rooted<JSObject*> obj(aCx, JS::CurrentGlobalOrNull(aCx));
JS::Rooted<JSObject*> array(aCx,
JS_NewUint8Array(aCx, mMessage->GetSize()));
JS::Rooted<JSObject*> array(aCx, JS_NewUint8Array(aCx, mMessage->mSize));
if (!array) {
return false;
}
memcpy(JS_GetArrayBufferViewData(array),
mMessage->GetData(), mMessage->GetSize());
memcpy(JS_GetArrayBufferViewData(array), mMessage->mData, mMessage->mSize);
JS::AutoValueArray<2> args(aCx);
args[0].setNumber((uint32_t)mClientId);

View File

@ -7,9 +7,8 @@
*/
#include "SocketBase.h"
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include "nsThreadUtils.h"
namespace mozilla {
namespace ipc {
@ -18,83 +17,23 @@ namespace ipc {
// UnixSocketRawData
//
UnixSocketRawData::UnixSocketRawData(size_t aSize)
: mSize(aSize)
, mCurrentWriteOffset(0)
{
mData = new uint8_t[mSize];
}
UnixSocketRawData::UnixSocketRawData(const void* aData, size_t aSize)
: mSize(aSize)
, mOffset(0)
, mAvailableSpace(aSize)
, mCurrentWriteOffset(0)
{
MOZ_ASSERT(aData || !mSize);
mData = new uint8_t[mAvailableSpace];
mData = new uint8_t[mSize];
memcpy(mData, aData, mSize);
}
UnixSocketRawData::UnixSocketRawData(size_t aSize)
: mSize(0)
, mOffset(0)
, mAvailableSpace(aSize)
{
mData = new uint8_t[mAvailableSpace];
}
nsresult
UnixSocketRawData::Receive(int aFd)
{
if (!GetTrailingSpace()) {
if (!GetLeadingSpace()) {
return NS_ERROR_OUT_OF_MEMORY; /* buffer is full */
}
/* free up space at the end of data buffer */
if (GetSize() <= GetLeadingSpace()) {
memcpy(mData, GetData(), GetSize());
} else {
memmove(mData, GetData(), GetSize());
}
mOffset = 0;
}
ssize_t res =
TEMP_FAILURE_RETRY(read(aFd, GetTrailingBytes(), GetTrailingSpace()));
if (res < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
return NS_OK; /* no more data available; try again later */
}
return NS_ERROR_FAILURE;
} else if (!res) {
/* EOF or peer shutdown sending */
return NS_OK;
}
mSize += res;
return NS_OK;
}
nsresult
UnixSocketRawData::Send(int aFd)
{
if (!GetSize()) {
return NS_OK;
}
ssize_t res = TEMP_FAILURE_RETRY(write(aFd, GetData(), GetSize()));
if (res < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
return NS_OK; /* socket is blocked; try again later */
}
return NS_ERROR_FAILURE;
} else if (!res) {
/* nothing written */
return NS_OK;
}
Consume(res);
return NS_OK;
}
//
// SocketConsumerBase
//
@ -195,7 +134,7 @@ SocketIOBase::~SocketIOBase()
void
SocketIOBase::EnqueueData(UnixSocketRawData* aData)
{
if (!aData->GetSize()) {
if (!aData->mSize) {
delete aData; // delete empty data immediately
return;
}

View File

@ -9,6 +9,8 @@
#ifndef mozilla_ipc_SocketBase_h
#define mozilla_ipc_SocketBase_h
#include <errno.h>
#include <unistd.h>
#include "base/message_loop.h"
#include "nsAutoPtr.h"
#include "nsTArray.h"
@ -29,64 +31,22 @@ namespace ipc {
class UnixSocketRawData
{
public:
// Number of octets in mData.
size_t mSize;
size_t mCurrentWriteOffset;
nsAutoArrayPtr<uint8_t> mData;
/* This constructor copies aData of aSize bytes length into the
* new instance of |UnixSocketRawData|.
*/
UnixSocketRawData(const void* aData, size_t aSize);
/* This constructor reserves aSize bytes of space. Currently
* it's only possible to fill this buffer by calling |Receive|.
/**
* Constructor for situations where only size is known beforehand
* (for example, when being assigned strings)
*/
UnixSocketRawData(size_t aSize);
nsresult Receive(int aFd);
nsresult Send(int aFd);
const uint8_t* GetData() const
{
return mData + mOffset;
}
size_t GetSize() const
{
return mSize;
}
void Consume(size_t aSize)
{
MOZ_ASSERT(aSize <= mSize);
mSize -= aSize;
mOffset += aSize;
}
protected:
size_t GetLeadingSpace() const
{
return mOffset;
}
size_t GetTrailingSpace() const
{
return mAvailableSpace - (mOffset + mSize);
}
size_t GetAvailableSpace() const
{
return mAvailableSpace;
}
void* GetTrailingBytes()
{
return mData + mOffset + mSize;
}
private:
size_t mSize;
size_t mOffset;
size_t mAvailableSpace;
nsAutoArrayPtr<uint8_t> mData;
/**
* Constructor for situations where size and data is known
* beforehand (for example, when being assigned strings)
*/
UnixSocketRawData(const void* aData, size_t aSize);
};
enum SocketConnectionStatus {
@ -368,19 +328,25 @@ public:
MOZ_ASSERT(aFd >= 0);
MOZ_ASSERT(aIO);
while (true) {
do {
nsAutoPtr<UnixSocketRawData> incoming(
new UnixSocketRawData(mMaxReadSize));
nsresult rv = incoming->Receive(aFd);
ssize_t res =
TEMP_FAILURE_RETRY(read(aFd, incoming->mData, incoming->mSize));
if (NS_WARN_IF(NS_FAILED(rv))) {
if (res < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
return NS_OK; /* no more data available */
}
/* an error occored */
nsRefPtr<nsRunnable> r = new SocketIORequestClosingRunnable<T>(aIO);
NS_DispatchToMainThread(r);
return NS_ERROR_FAILURE;
} else if (!res) {
/* EOF or peer shut down sending */
nsRefPtr<nsRunnable> r = new SocketIORequestClosingRunnable<T>(aIO);
NS_DispatchToMainThread(r);
return rv;
}
if (!incoming->GetSize()) {
/* no data available; try again later */
return NS_OK;
}
@ -390,10 +356,11 @@ public:
AutoSourceEvent taskTracerEvent(SourceEventType::UNIXSOCKET);
#endif
incoming->mSize = res;
nsRefPtr<nsRunnable> r =
new SocketIOReceiveRunnable<T>(aIO, incoming.forget());
NS_DispatchToMainThread(r);
}
} while (true);
return NS_OK;
}
@ -404,21 +371,38 @@ public:
MOZ_ASSERT(aFd >= 0);
MOZ_ASSERT(aIO);
while (HasPendingData()) {
do {
if (!HasPendingData()) {
return NS_OK;
}
UnixSocketRawData* outgoing = mOutgoingQ.ElementAt(0);
MOZ_ASSERT(outgoing->mSize);
nsresult rv = outgoing->Send(aFd);
const uint8_t* data = outgoing->mData + outgoing->mCurrentWriteOffset;
size_t size = outgoing->mSize - outgoing->mCurrentWriteOffset;
if (NS_WARN_IF(NS_FAILED(rv))) {
ssize_t res = TEMP_FAILURE_RETRY(write(aFd, data, size));
if (res < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
return NS_OK; /* no more data available */
}
/* an error occored */
nsRefPtr<nsRunnable> r = new SocketIORequestClosingRunnable<T>(aIO);
NS_DispatchToMainThread(r);
return rv;
return NS_ERROR_FAILURE;
} else if (!res) {
return NS_OK; /* nothing written */
}
if (!outgoing->GetSize()) {
outgoing->mCurrentWriteOffset += res;
if (outgoing->mCurrentWriteOffset == outgoing->mSize) {
mOutgoingQ.RemoveElementAt(0);
delete outgoing;
}
}
} while (true);
return NS_OK;
}