詳細
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条件
対応したら
備考
詳細
BCT_save_cmd_関数内で const CommonCmdPacket* のパケットを const BCT_CmdData* にキャストさせて、BCT_set_bc_cmd_data_関数を call しているc2a-core/tlm_cmd/block_command_table.c
Lines 225 to 239 in d920245
その
BCT_set_bc_cmd_data_関数では、sizeof(BCT_CmdData)のサイズのvalueにある値をcmd_dataに memcpy しているが、ここの処理を実行時にセグフォが起きてしまっている(ただし BCT のアドレスによっては、この異常が発生しない)
c2a-core/tlm_cmd/block_command_table.c
Lines 97 to 101 in d920245
memcpy 時のサイズを
sizeof(BCT_CmdData)ではなく、CCP_get_packet_len((const CommonCmdPacket*)value)に変更すると問題なく動作するため、cmd_dataの値が 64 Byte 未満になっている可能性が高いと推定している。原因としては、const CommonCmdPacket* のパケットを const BCT_CmdData* にキャストさせた際に、64 Byte 分のバッファが確保されていない事が推定され、このキャスト時の動作が未定義動作に当たっていたのではないかと考えている
close条件
対応したら
備考