From: Koine Yuusuke(koinec) Date: Mon, 23 Sep 2019 08:51:36 +0000 (+0900) Subject: (LibGoblin) X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=ac83ad709935887da37eefbbab22152de5776e40;p=drdeamon64%2Fdrdeamon64.git (LibGoblin) * WorkBackup(Correct DW_OP_addr proc.) --- diff --git a/libgoblin/drd64_libgoblin_dwarf_expression.c b/libgoblin/drd64_libgoblin_dwarf_expression.c index 51d5e35..531acc4 100644 --- a/libgoblin/drd64_libgoblin_dwarf_expression.c +++ b/libgoblin/drd64_libgoblin_dwarf_expression.c @@ -144,6 +144,9 @@ DWord } if( 0 == p_exp->b_dwsize ) { p_exp->b_dwsize = 8; } + if((4 != p_exp->b_dwsize) && (8 != p_exp->b_dwsize)) { + return (LIBGOBLIN_DWARF_STATUS_ERROR | 0x03); + } // ------------------------ if( NULL != p_exp->resume.pb_resume ) { @@ -232,14 +235,16 @@ DWord break; case DW_OP_addr: // 0x03 - if( p_exp->dw_setdata & LIBGOBLIN_DWARF_REQUEST_ADDRSIZE ) { - PUSH_DWARF( p_exp, p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_ADDRSIZE ] ); - p_exp->dw_setdata &= (~LIBGOBLIN_DWARF_REQUEST_ADDRSIZE); - } - else { - p_exp->dw_requested |= LIBGOBLIN_DWARF_REQUEST_ADDRSIZE; - qw_remain = 0; // for Loop-Break - } + if( p_exp->b_dwsize > qw_remain ) + { goto goto_DWARF_Expression_Evaluate_post; } + + if( 8 == p_exp->b_dwsize ) + { qw_value = (QWord)*((QWord *)pb_now); } + else if( 4 == p_exp->b_dwsize ) + { qw_value = (QWord)*((DWord *)pb_now); } + pb_now += p_exp->b_dwsize; + qw_remain -= p_exp->b_dwsize; + PUSH_DWARF( p_exp, qw_value ); break; case DW_OP_const1u: // 0x08 diff --git a/libgoblin/test_libgoblin_dwarf_expression.c b/libgoblin/test_libgoblin_dwarf_expression.c index e2c0984..4bfa2ee 100644 --- a/libgoblin/test_libgoblin_dwarf_expression.c +++ b/libgoblin/test_libgoblin_dwarf_expression.c @@ -222,20 +222,15 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void ) // DW_OP_addr ------------------ b_data[0] = DW_OP_addr; + pqw_value = (QWord *)&(b_data[1]); + *pqw_value = 0x1234567890abcdef; DWARF_Expression_ClearValue( p_exp ); - dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 1 ); - Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, - LIBGOBLIN_DWARF_STATUS_REQUESTED, - LIBGOBLIN_DWARF_REQUEST_ADDRSIZE, LIBGOBLIN_DWARF_REQUEST_NONE ); - - p_exp->qw_reqdata[ LIBGOBLIN_DWARF_DATAID_ADDRSIZE ] = 8; - p_exp->dw_setdata |= LIBGOBLIN_DWARF_REQUEST_ADDRSIZE; - dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 1 ); + dw_result = DWARF_Expression_Evaluate( p_exp, b_data, 9 ); Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp, LIBGOBLIN_DWARF_STATUS_EVALUATED, LIBGOBLIN_DWARF_REQUEST_NONE, LIBGOBLIN_DWARF_REQUEST_NONE ); - CU_ASSERT( p_exp->result[0].value.qw_value == 8 ); - CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 8 ); + CU_ASSERT( p_exp->result[0].value.qw_value == 0x1234567890abcdef ); + CU_ASSERT( p_exp->t_stack[ 0 ].value.qw_value == 0x1234567890abcdef ); CU_ASSERT( p_exp->dw_depth == 1 ); // DW_OP_const1u --------------