From 9d3376031aef4ea56750b0b59c3a1e0c4e8e0403 Mon Sep 17 00:00:00 2001 From: Indu Bhagat Date: Mon, 14 Jul 2025 17:01:53 -0700 Subject: [PATCH] libsframe: relax the assertion limit for fre_start_addr Fix PR ld/33131 Failed assertion when linking gccgo Make amendments in both sframe_decoder_get_fre and sframe_encoder_add_fre. Since GNU as and the dw2gencfi code generally accepts such CFI, its best to allow in SFrame FREs too. libsframe/ PR ld/33131. * sframe.c (sframe_decoder_get_fre): Relax the assertion a bit. (sframe_encoder_add_fre): Likewise. (cherry picked from commit 387efef5fef727cbe52099dcd5012905c4205be3) --- libsframe/sframe.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/libsframe/sframe.c b/libsframe/sframe.c index 7357fc15abc..824d1fd7ed9 100644 --- a/libsframe/sframe.c +++ b/libsframe/sframe.c @@ -1328,13 +1328,14 @@ sframe_decoder_get_fre (sframe_decoder_ctx *ctx, if (!sframe_fre_sanity_check_p (&ifre)) return sframe_set_errno (&err, SFRAME_ERR_FRE_INVAL); - sframe_frame_row_entry_copy (fre, &ifre); + /* Although a stricter sanity check on fre_start_addr like: + if (fdep->sfde_func_size) + sframe_assert (frep->fre_start_addr < fdep->sfde_func_size); + is more suitable, some code has been seen to not abide by it. See + PR libsframe/33131. */ + sframe_assert (ifre.fre_start_addr <= fdep->sfde_func_size); - if (fdep->sfde_func_size) - sframe_assert (fre->fre_start_addr < fdep->sfde_func_size); - else - /* A SFrame FDE with func size equal to zero is possible. */ - sframe_assert (fre->fre_start_addr == fdep->sfde_func_size); + sframe_frame_row_entry_copy (fre, &ifre); return 0; } @@ -1587,11 +1588,12 @@ sframe_encoder_add_fre (sframe_encoder_ctx *encoder, = frep->fre_start_addr; ectx_frep->fre_info = frep->fre_info; - if (fdep->sfde_func_size) - sframe_assert (frep->fre_start_addr < fdep->sfde_func_size); - else - /* A SFrame FDE with func size equal to zero is possible. */ - sframe_assert (frep->fre_start_addr == fdep->sfde_func_size); + /* Although a stricter sanity check on fre_start_addr like: + if (fdep->sfde_func_size) + sframe_assert (frep->fre_start_addr < fdep->sfde_func_size); + is more suitable, some code has been seen to not abide by it. See PR + libsframe/33131. */ + sframe_assert (frep->fre_start_addr <= fdep->sfde_func_size); /* frep has already been sanity check'd. Get offsets size. */ offsets_sz = sframe_fre_offset_bytes_size (frep->fre_info); -- 2.47.3