Skip to content

BCT に書き込み時にセグフォが発生する #444

@hender14

Description

詳細

BCT_save_cmd_ 関数内で const CommonCmdPacket* のパケットを const BCT_CmdData* にキャストさせて、BCT_set_bc_cmd_data_ 関数を call している

static BCT_ACK BCT_save_cmd_(const BCT_Pos* pos, const CommonCmdPacket* packet)
{
// FIXME: TCPに依存しない,つまりCTCPに依存するコードにする
BCT_ACK ack = BCT_check_position(pos);
if (ack != BCT_SUCCESS) return ack;
// パケット全長が想定最大長を超えている場合は異常判定
if (CCP_get_packet_len(packet) > BCT_CMD_MAX_LENGTH) return BCT_CMD_TOO_LONG;
// 格納可能なパケットなら内容をコピーし保存
BCT_set_bc_cmd_data_(pos, (BCT_CmdData*)packet->packet); // const_cast
// BCT に保存される Cmd の Sequence Count は 0 とする (BCT Digset のため)
// FIXME: CSP 依存を CCP 依存にする
CSP_set_seq_count((CmdSpacePacket*)(CommonCmdPacket*)BCT_get_bc_cmd_data_(pos), 0); // const_cast

その BCT_set_bc_cmd_data_ 関数では、sizeof(BCT_CmdData) のサイズの value にある値を cmd_data に memcpy しているが、ここの処理を実行時にセグフォが起きてしまっている
(ただし BCT のアドレスによっては、この異常が発生しない)

static void BC_set_bc_cmd_data_default_(const BCT_Pos* pos, const BCT_CmdData* value)
{
BCT_CmdData* cmd_data = &block_command_table_.blocks[pos->block]->cmds[pos->cmd];
if ((unsigned char*)cmd_data == (const unsigned char*)value) return;
memcpy(cmd_data, value, sizeof(BCT_CmdData));

memcpy 時のサイズを sizeof(BCT_CmdData) ではなく、CCP_get_packet_len((const CommonCmdPacket*)value) に変更すると問題なく動作するため、cmd_data の値が 64 Byte 未満になっている可能性が高いと推定している。

原因としては、const CommonCmdPacket* のパケットを const BCT_CmdData* にキャストさせた際に、64 Byte 分のバッファが確保されていない事が推定され、このキャスト時の動作が未定義動作に当たっていたのではないかと考えている

close条件

対応したら

備考

Metadata

Metadata

Labels

bugSomething isn't working

Type

No type
No fields configured for issues without a type.

Projects

Status
No status

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions