mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
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:
parent
f75f7b7b52
commit
afa65517bc
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user