@@ -2329,6 +2329,12 @@ static const ut16 RISCV_CI_TYPE_IMM_MASK = (1 << 12) | (0x1f << 2);
23292329 i = ((ut32)i); \
23302330 }
23312331
2332+ #define RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , type ) \
2333+ if (!success) { \
2334+ RZ_LOG_ERROR("Failed to successfully patch a %s reloc at %llx (S: %llx, A: %llx, B: %llx, P: %llx)", type, patch_addr, S, A, B, P); \
2335+ return; \
2336+ }
2337+
23322338static void patch_reloc_riscv (RZ_INOUT RzBuffer * buf_patched , const ut64 patch_addr , const int rel_type , bool big_endian , const RelocFormularSymbols * fs , const int bits ) {
23332339 rz_return_if_fail (buf_patched && fs );
23342340
@@ -2346,26 +2352,26 @@ static void patch_reloc_riscv(RZ_INOUT RzBuffer *buf_patched, const ut64 patch_a
23462352 case R_RISCV_32 : {
23472353 val = S + A ;
23482354 bool success = rz_buf_write_ble32_at (buf_patched , patch_addr , val , big_endian );
2349- rz_return_if_fail (success );
2355+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_32" );
23502356 break ;
23512357 }
23522358 case R_RISCV_64 : {
23532359 val = S + A ;
23542360 bool success = rz_buf_write_ble64_at (buf_patched , patch_addr , val , big_endian );
2355- rz_return_if_fail (success );
2361+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_64" );
23562362 break ;
23572363 }
23582364 case R_RISCV_RELATIVE :
23592365 val = A + B ;
23602366 switch (bits ) {
23612367 case 32 : {
23622368 bool success = rz_buf_write_ble32_at (buf_patched , patch_addr , val , big_endian );
2363- rz_return_if_fail (success );
2369+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_RELATIVE 32" );
23642370 break ;
23652371 }
23662372 case 64 : {
23672373 bool success = rz_buf_write_ble64_at (buf_patched , patch_addr , val , big_endian );
2368- rz_return_if_fail (success );
2374+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_RELATIVE 64" );
23692375 break ;
23702376 }
23712377 default :
@@ -2421,12 +2427,12 @@ static void patch_reloc_riscv(RZ_INOUT RzBuffer *buf_patched, const ut64 patch_a
24212427 switch (bits ) {
24222428 case 32 : {
24232429 bool success = rz_buf_write_ble32_at (buf_patched , patch_addr , S , big_endian );
2424- rz_return_if_fail (success );
2430+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_JUMP_SLOT 32" );
24252431 break ;
24262432 }
24272433 case 64 : {
24282434 bool success = rz_buf_write_ble64_at (buf_patched , patch_addr , S , big_endian );
2429- rz_return_if_fail (success );
2435+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_JUMP_SLOT 64" );
24302436 break ;
24312437 }
24322438 default :
@@ -2438,7 +2444,7 @@ static void patch_reloc_riscv(RZ_INOUT RzBuffer *buf_patched, const ut64 patch_a
24382444 case R_RISCV_32_PCREL : {
24392445 val = S + A - P ;
24402446 bool success = rz_buf_write_ble32_at (buf_patched , patch_addr , val , big_endian );
2441- rz_return_if_fail (success );
2447+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_32_PCREL" );
24422448 break ;
24432449 }
24442450
@@ -2520,110 +2526,110 @@ static void patch_reloc_riscv(RZ_INOUT RzBuffer *buf_patched, const ut64 patch_a
25202526 ut64 result = ((ut64 )old_val ) + S + A ;
25212527 unsigned long long addr = patch_addr ;
25222528 bool success = rz_buf_write_ble8_offset (buf_patched , & addr , (ut8 )result , big_endian );
2523- rz_return_if_fail (success );
2529+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_ADD8" );
25242530 break ;
25252531 }
25262532
25272533 case R_RISCV_ADD16 : {
25282534 ut16 old_val = 0 ;
25292535 bool success = rz_buf_read_ble16_at (buf_patched , patch_addr , & old_val , big_endian );
2530- rz_return_if_fail (success );
2536+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_ADD16 [r]" );
25312537 ut64 result = ((ut64 )old_val ) + S + A ;
25322538 success = rz_buf_write_ble16_at (buf_patched , patch_addr , (ut16 )result , big_endian );
2533- rz_return_if_fail (success );
2539+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_ADD16 [w]" );
25342540 break ;
25352541 }
25362542
25372543 case R_RISCV_ADD32 : {
25382544 ut32 old_val = 0 ;
25392545 bool success = rz_buf_read_ble32_at (buf_patched , patch_addr , & old_val , big_endian );
2540- rz_return_if_fail (success );
2546+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_ADD32 [r]" );
25412547 ut64 result = ((ut64 )old_val ) + S + A ;
25422548 success = rz_buf_write_ble32_at (buf_patched , patch_addr , (ut32 )result , big_endian );
2543- rz_return_if_fail (success );
2549+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_ADD32 [w]" );
25442550 break ;
25452551 }
25462552
25472553 case R_RISCV_ADD64 : {
25482554 ut64 old_val = 0 ;
25492555 bool success = rz_buf_read_ble64_at (buf_patched , patch_addr , & old_val , big_endian );
2550- rz_return_if_fail (success );
2556+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_ADD64 [r]" );
25512557 ut64 result = old_val + S + A ;
25522558 success = rz_buf_write_ble64_at (buf_patched , patch_addr , result , big_endian );
2553- rz_return_if_fail (success );
2559+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_ADD64 [w]" );
25542560 break ;
25552561 }
25562562
25572563 case R_RISCV_SUB8 : {
25582564 ut8 old_val = 0 ;
25592565 bool success = rz_buf_read_ble8_at (buf_patched , patch_addr , & old_val , big_endian );
2560- rz_return_if_fail (success );
2566+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_SUB8 [r]" );
25612567 ut64 result = ((ut64 )old_val ) - S - A ;
25622568 unsigned long long addr = patch_addr ;
25632569 success = rz_buf_write_ble8_offset (buf_patched , & addr , (ut8 )result , big_endian );
2564- rz_return_if_fail (success );
2570+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_SUB8 [w]" );
25652571 break ;
25662572 }
25672573
25682574 case R_RISCV_SUB16 : {
25692575 ut16 old_val = 0 ;
25702576 bool success = rz_buf_read_ble16_at (buf_patched , patch_addr , & old_val , big_endian );
2571- rz_return_if_fail (success );
2577+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_SUB16 [r]" );
25722578 ut64 result = ((ut64 )old_val ) - S - A ;
25732579 success = rz_buf_write_ble16_at (buf_patched , patch_addr , (ut16 )result , big_endian );
2574- rz_return_if_fail (success );
2580+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_SUB16 [w]" );
25752581 break ;
25762582 }
25772583
25782584 case R_RISCV_SUB32 : {
25792585 ut32 old_val = 0 ;
25802586 bool success = rz_buf_read_ble32_at (buf_patched , patch_addr , & old_val , big_endian );
2581- rz_return_if_fail (success );
2587+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_SUB32 [r]" );
25822588 ut64 result = ((ut64 )old_val ) - S - A ;
25832589 success = rz_buf_write_ble32_at (buf_patched , patch_addr , (ut32 )result , big_endian );
2584- rz_return_if_fail (success );
2590+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_SUB32 [w]" );
25852591 break ;
25862592 }
25872593
25882594 case R_RISCV_SUB64 : {
25892595 ut64 old_val = 0 ;
25902596 bool success = rz_buf_read_ble64_at (buf_patched , patch_addr , & old_val , big_endian );
2591- rz_return_if_fail (success );
2597+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_SUB64 [r]" );
25922598 ut64 result = ((ut64 )old_val ) - S - A ;
25932599 success = rz_buf_write_ble64_at (buf_patched , patch_addr , result , big_endian );
2594- rz_return_if_fail (success );
2600+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_SUB64 [w]" );
25952601 break ;
25962602 }
25972603
25982604 case R_RISCV_SET8 : {
25992605 val = S + A ;
26002606 unsigned long long addr = patch_addr ;
26012607 bool success = rz_buf_write_ble8_offset (buf_patched , & addr , (ut8 )val , big_endian );
2602- rz_return_if_fail (success );
2608+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_SET8" );
26032609 break ;
26042610 }
26052611 case R_RISCV_SET16 : {
26062612 val = S + A ;
26072613 bool success = rz_buf_write_ble16_at (buf_patched , patch_addr , (ut16 )val , big_endian );
2608- rz_return_if_fail (success );
2614+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_SET16" );
26092615 break ;
26102616 }
26112617 case R_RISCV_SET32 : {
26122618 val = S + A ;
26132619 bool success = rz_buf_write_ble32_at (buf_patched , patch_addr , (ut32 )val , big_endian );
2614- rz_return_if_fail (success );
2620+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , "R_RISCV_SET32" );
26152621 break ;
26162622 }
26172623
26182624 case R_RISCV_SET6 :
26192625 case R_RISCV_SUB6 : {
26202626 ut8 old_val = 0 ;
26212627 bool success = rz_buf_read_ble8_at (buf_patched , patch_addr , & old_val , big_endian );
2622- rz_return_if_fail (success );
2628+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , rel_type == R_RISCV_SET6 ? "R_RISCV_SET6 [r]" : "R_RISCV_SUB6 [r]" );
26232629 val = S + A ;
26242630 ut8 result = (rel_type == R_RISCV_SET6 ) ? val : ((old_val & 0x3F ) - val );
26252631 success = rz_buf_write_ble8_at (buf_patched , patch_addr , (old_val & 0xC0 ) | (result & 0x3F ), big_endian );
2626- rz_return_if_fail (success );
2632+ RISCV_CHECK_SUCCESS_RET_IF_FAIL (success , rel_type == R_RISCV_SET6 ? "R_RISCV_SET6 [w]" : "R_RISCV_SUB6 [w]" );
26272633 break ;
26282634 }
26292635
@@ -2674,6 +2680,8 @@ static void patch_reloc_riscv(RZ_INOUT RzBuffer *buf_patched, const ut64 patch_a
26742680 }
26752681}
26762682
2683+ #undef RISCV_CHECK_SUCCESS_RET_IF_FAIL
2684+
26772685#undef UNHANDL
26782686#undef UNHANDL_DEF
26792687
0 commit comments