Skip to content

Commit

Permalink
[fix][ethereum-bbc][*]: wrong way to copy value in memcpy
Browse files Browse the repository at this point in the history
[fix][ethereum-bbc][*]: incorrect sdp v2 deserialization
[fix][ethereum-bbc][*]: incorrect sdp v2 serialization
[fix][ethereum-bbc][*]: incorrect sdp v1 decode
  • Loading branch information
zouxyan committed Apr 10, 2024
1 parent 069b35b commit 5b4ce04
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 66 deletions.
81 changes: 48 additions & 33 deletions pluginset/ethereum/onchain-plugin/solidity/sys/SDPMsg.sol
Original file line number Diff line number Diff line change
Expand Up @@ -184,17 +184,22 @@ contract SDPMsg is ISDPMessage, Ownable {
bool res = false;
string memory errMsg;
address receiver = sdpMessage.getReceiverAddress();
try
IContractUsingSDP(receiver).recvMessage(senderDomain, senderID, sdpMessage.message)
{
res = true;
} catch Error(
string memory reason
) {
errMsg = reason;
} catch (
bytes memory /*lowLevelData*/
) {}
if (receiver.code.length == 0) {
res = false;
errMsg = "receiver has no code";
} else {
try
IContractUsingSDP(receiver).recvMessage(senderDomain, senderID, sdpMessage.message)
{
res = true;
} catch Error(
string memory reason
) {
errMsg = reason;
} catch (
bytes memory /*lowLevelData*/
) {}
}

emit receiveMessage(senderDomain, senderID, receiver, seqExpected, res, errMsg);
}
Expand Down Expand Up @@ -264,35 +269,45 @@ contract SDPMsg is ISDPMessage, Ownable {
bool res = false;
string memory errMsg;
address receiver = sdpMessage.getReceiverAddress();
try
IContractUsingSDP(receiver).recvMessage(senderDomain, senderID, sdpMessage.message)
{
res = true;
} catch Error(
string memory reason
) {
errMsg = reason;
} catch (
bytes memory /*lowLevelData*/
) {}
if (receiver.code.length == 0) {
res = false;
errMsg = "receiver has no code";
} else {
try
IContractUsingSDP(receiver).recvMessage(senderDomain, senderID, sdpMessage.message)
{
res = true;
} catch Error(
string memory reason
) {
errMsg = reason;
} catch (
bytes memory /*lowLevelData*/
) {}
}

return (res, errMsg);
}

function _routeUnorderedMessageV2(string calldata senderDomain, bytes32 senderID, SDPMessageV2 memory sdpMessage) internal returns (bool, string memory) {
bool res = false;
string memory errMsg;
try
IContractUsingSDP(sdpMessage.getReceiverAddress()).recvUnorderedMessage(senderDomain, senderID, sdpMessage.message)
{
res = true;
} catch Error(
string memory reason
) {
errMsg = reason;
} catch (
bytes memory /*lowLevelData*/
) {}
if (sdpMessage.getReceiverAddress().code.length == 0) {
res = false;
errMsg = "receiver has no code";
} else {
try
IContractUsingSDP(sdpMessage.getReceiverAddress()).recvUnorderedMessage(senderDomain, senderID, sdpMessage.message)
{
res = true;
} catch Error(
string memory reason
) {
errMsg = reason;
} catch (
bytes memory /*lowLevelData*/
) {}
}

return (res, errMsg);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,13 +201,13 @@ library AMLib {
bytes memory pkg = new bytes(len);
uint offset = len;

TypesToBytes.uintToBytes(offset, message.version, pkg);
TypesToBytes.uint32ToBytes(offset, message.version, pkg);
offset -= SizeOf.sizeOfInt(32);

TypesToBytes.bytes32ToBytes(offset, message.author, pkg);
offset -= SizeOf.sizeOfBytes32();

TypesToBytes.uintToBytes(offset, message.protocolType, pkg);
TypesToBytes.uint32ToBytes(offset, message.protocolType, pkg);
offset -= SizeOf.sizeOfInt(32);

TypesToBytes.stringToBytes(offset, message.body, pkg);
Expand All @@ -232,13 +232,13 @@ library AMLib {
bytes memory pkg = new bytes(len);
uint offset = len;

TypesToBytes.uintToBytes(offset, message.version, pkg);
TypesToBytes.uint32ToBytes(offset, message.version, pkg);
offset -= SizeOf.sizeOfInt(32);

TypesToBytes.bytes32ToBytes(offset, message.author, pkg);
offset -= SizeOf.sizeOfBytes32();

TypesToBytes.uintToBytes(offset, message.protocolType, pkg);
TypesToBytes.uint32ToBytes(offset, message.protocolType, pkg);
offset -= SizeOf.sizeOfInt(32);

TypesToBytes.varBytesToBytes(offset, message.body, pkg);
Expand Down
40 changes: 22 additions & 18 deletions pluginset/ethereum/onchain-plugin/solidity/sys/lib/sdp/SDPLib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ library SDPLib {
offset -= SizeOf.sizeOfBytes32();

// 填充sequence
TypesToBytes.uintToBytes(offset, sdpMessage.sequence, pkg);
TypesToBytes.uint32ToBytes(offset, sdpMessage.sequence, pkg);
offset -= SizeOf.sizeOfUint(32);

// 填充消息
Expand Down Expand Up @@ -108,14 +108,10 @@ library SDPLib {
BytesToTypes.bytesToString(offset, rawMessage, message);
offset -= SizeOf.sizeOfBytes(message);

sdpMessage = SDPMessage(
{
receiveDomain: string(dest_domain),
receiver: receiver,
message: message,
sequence: sequence
}
);
sdpMessage.receiveDomain = string(dest_domain);
sdpMessage.receiver = receiver;
sdpMessage.sequence = sequence;
sdpMessage.message = message;
}

function encode(SDPMessageV2 memory sdpMessage) pure internal returns (bytes memory) {
Expand Down Expand Up @@ -143,13 +139,15 @@ library SDPLib {
bytes memory pkg = new bytes(total_size);
uint offset = total_size;

TypesToBytes.uintToBytes(offset, sdpMessage.version, pkg);
TypesToBytes.uintToBytes(offset, sdpMessage.version + 0xff000000, pkg);
offset -= SizeOf.sizeOfInt(32);

TypesToBytes.bytes32ToBytes(offset, sdpMessage.messageId, pkg);
offset -= SizeOf.sizeOfBytes32();

TypesToBytes.varBytesToBytes(offset, bytes(sdpMessage.receiveDomain), pkg);
bytes memory raw_recv_domain = bytes(sdpMessage.receiveDomain);
TypesToBytes.varBytesToBytes(offset, raw_recv_domain, pkg);
offset -= 4 + raw_recv_domain.length;

TypesToBytes.bytes32ToBytes(offset, sdpMessage.receiver, pkg);
offset -= SizeOf.sizeOfBytes32();
Expand All @@ -164,6 +162,7 @@ library SDPLib {
offset -= SizeOf.sizeOfInt(32);

TypesToBytes.varBytesToBytes(offset, sdpMessage.message, pkg);
offset -= 4 + sdpMessage.message.length;

if (withErrorMsg) {
TypesToBytes.varBytesToBytes(offset, bytes(sdpMessage.errorMsg), pkg);
Expand All @@ -174,15 +173,16 @@ library SDPLib {

function decode(SDPMessageV2 memory sdpMessage, bytes memory rawMessage) internal pure {
uint256 offset = rawMessage.length;
bool withErrorMsg = sdpMessage.atomicFlag > SDP_V2_ATOMIC_FLAG_ACK_SUCCESS;

sdpMessage.version = BytesToTypes.bytesToUint32(offset, rawMessage);
sdpMessage.version = getSDPVersionFrom(rawMessage);
offset -= SizeOf.sizeOfUint(32);

sdpMessage.messageId = BytesToTypes.bytesToBytes32(offset, rawMessage);
offset -= SizeOf.sizeOfBytes32();

sdpMessage.receiveDomain = string(BytesToTypes.bytesToVarBytes(offset, rawMessage));
bytes memory raw_recv_domain = BytesToTypes.bytesToVarBytes(offset, rawMessage);
sdpMessage.receiveDomain = string(raw_recv_domain);
offset -= 4 + raw_recv_domain.length;

sdpMessage.receiver = BytesToTypes.bytesToBytes32(offset, rawMessage);
offset -= SizeOf.sizeOfBytes32();
Expand All @@ -197,8 +197,9 @@ library SDPLib {
offset -= 4;

sdpMessage.message = BytesToTypes.bytesToVarBytes(offset, rawMessage);
offset -= 4 + sdpMessage.message.length;

if (withErrorMsg) {
if (sdpMessage.atomicFlag > SDP_V2_ATOMIC_FLAG_ACK_SUCCESS) {
sdpMessage.errorMsg = string(BytesToTypes.bytesToVarBytes(offset, rawMessage));
}
}
Expand All @@ -213,14 +214,16 @@ library SDPLib {
"encodeSDPMessage: body length overlimit"
);

uint total_size = 57 + bytes(sdpMessage.receiveDomain).length + sdpMessage.message.length;
uint total_size = 121 + bytes(sdpMessage.receiveDomain).length + sdpMessage.message.length;
bytes memory pkg = new bytes(total_size);
uint offset = total_size;

TypesToBytes.uintToBytes(offset, sdpMessage.version, pkg);
TypesToBytes.uintToBytes(offset, sdpMessage.version + 0xff000000, pkg);
offset -= SizeOf.sizeOfInt(32);

TypesToBytes.varBytesToBytes(offset, bytes(sdpMessage.receiveDomain), pkg);
bytes memory raw_recv_domain = bytes(sdpMessage.receiveDomain);
TypesToBytes.varBytesToBytes(offset, raw_recv_domain, pkg);
offset -= 4 + raw_recv_domain.length;

TypesToBytes.bytes32ToBytes(offset, sdpMessage.receiver, pkg);
offset -= SizeOf.sizeOfBytes32();
Expand All @@ -235,6 +238,7 @@ library SDPLib {
offset -= SizeOf.sizeOfInt(32);

TypesToBytes.varBytesToBytes(offset, sdpMessage.message, pkg);
offset -= 4 + sdpMessage.message.length;

TypesToBytes.addressToBytes(offset, msg.sender, pkg);
TypesToBytes.bytes32ToBytes(offset, localDomainHash, pkg);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,12 @@ library TypesToBytes {
function byteToBytes(uint _offset, uint8 _input, bytes memory _output) internal pure {

assembly {
mstore(add(_output, _offset), _input)
let my_pos := add(_output, _offset)
let prev_word_pos := sub(my_pos, 1)
let prev_word := mload(prev_word_pos)

mstore(my_pos, _input)
mstore(prev_word_pos, prev_word)
}
}

Expand All @@ -47,7 +52,7 @@ library TypesToBytes {

function varBytesToBytes(uint _offset, bytes memory _input, bytes memory _output) internal pure {
uint32 body_len = uint32(_input.length);
TypesToBytes.uintToBytes(_offset, body_len, _output);
TypesToBytes.uint32ToBytes(_offset, body_len, _output);
_offset -= 4;

require(
Expand Down Expand Up @@ -147,35 +152,35 @@ library TypesToBytes {
function uint16ToBytes(uint _offset, uint16 _input, bytes memory _output) internal pure {

assembly {
let prev_word_pos := add(_output, _offset)
let my_pos := add(_output, _offset)
let prev_word_pos := sub(my_pos, 2)
let prev_word := mload(prev_word_pos)

mstore(add(prev_word_pos, 2), _input)

mstore(my_pos, _input)
mstore(prev_word_pos, prev_word)
}
}

function uint32ToBytes(uint _offset, uint32 _input, bytes memory _output) internal pure {

assembly {
let prev_word_pos := add(_output, _offset)
let my_pos := add(_output, _offset)
let prev_word_pos := sub(my_pos, 4)
let prev_word := mload(prev_word_pos)

mstore(add(prev_word_pos, 4), _input)

mstore(my_pos, _input)
mstore(prev_word_pos, prev_word)
}
}

function uint64ToBytes(uint _offset, uint64 _input, bytes memory _output) internal pure {

assembly {
let prev_word_pos := add(_output, _offset)
let my_pos := add(_output, _offset)
let prev_word_pos := sub(my_pos, 8)
let prev_word := mload(prev_word_pos)

mstore(add(prev_word_pos, 8), _input)

mstore(my_pos, _input)
mstore(prev_word_pos, prev_word)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,10 @@ library Utils {
src += 32;
}

if (len == 0) {
return;
}

// uint mask = SafeMath.pwr(256, (32 - len)) - 1;
uint mask = 256 ** (32 - len) - 1;
assembly {
Expand Down

0 comments on commit 5b4ce04

Please sign in to comment.