[binutils-gdb] gas: sframe: Error on open CFI at EOF; missing .cfi_endproc

Jens Remus via Binutils-cvs <[email protected]>
Newsgroups gmane.comp.gnu.binutils.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=bc145a24033381e93bae0ee24add664386c66433

commit bc145a24033381e93bae0ee24add664386c66433
Author: Jens Remus <[email protected]>
Date:   Thu Apr 30 12:18:05 2026 +0200

    gas: sframe: Error on open CFI at EOF; missing .cfi_endproc
    
    Open CFI at end of file (i.e. .cfi_startproc without matching
    .cfi_endproc) caused generation of SFrame strack trace information
    to segfault.
    
    Handle an open DWARF FDE in .sframe generation like it is handled
    in .eh_frame and .debug_frame generation (see cfi_finish() in
    gas/dw2gencfi.c).  Report the following error and set the DWARF FDE
    end address to its start address:
    
      open CFI at the end of file; missing .cfi_endproc directive
    
    gas/
            PR/gas 34026
            * gen-sframe.c (create_sframe_all): Error on open CFI.
    
    gas/testsuite/
            PR/gas 34026
            * gas/cfi-sframe/cfi-sframe.exp: Run new test.
            * gas/cfi-sframe/cfi-sframe-common-pr34026.d: New test.
            * gas/cfi-sframe/cfi-sframe-common-pr34026.s: Likewise.
    
    Signed-off-by: Jens Remus <[email protected]>

Diff:
---
 gas/gen-sframe.c                                         | 8 ++++++++
 gas/testsuite/gas/cfi-sframe/cfi-sframe-common-pr34026.d | 3 +++
 gas/testsuite/gas/cfi-sframe/cfi-sframe-common-pr34026.s | 1 +
 gas/testsuite/gas/cfi-sframe/cfi-sframe.exp              | 1 +
 4 files changed, 13 insertions(+)

diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c
index 7c1b7be93bb..b5c8f649bea 100644
--- a/gas/gen-sframe.c
+++ b/gas/gen-sframe.c
@@ -2478,6 +2478,14 @@ create_sframe_all (void)
       /* Initialize the translation context with information anew.  */
       sframe_xlate_ctx_init (xlate_ctx);
 
+      /* Report and fix open CFI.  */
+      if (dw_fde->end_address == NULL)
+	{
+	  as_bad (_("open CFI at the end of file; "
+		    "missing .cfi_endproc directive"));
+	  dw_fde->end_address = dw_fde->start_address;
+	}
+
       /* Process and link SFrame FDEs if no error.  */
       int err = sframe_do_fde (xlate_ctx, dw_fde);
       if (err && get_dw_fde_signal_p (dw_fde))
diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-pr34026.d b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-pr34026.d
new file mode 100644
index 00000000000..a944e074404
--- /dev/null
+++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-pr34026.d
@@ -0,0 +1,3 @@
+#as: --gsframe
+#error: open CFI at the end of file; missing \.cfi_endproc directive
+#name: Open CFI at end of file (PR 34026)
diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-pr34026.s b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-pr34026.s
new file mode 100644
index 00000000000..df692dbcd98
--- /dev/null
+++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe-common-pr34026.s
@@ -0,0 +1 @@
+	.cfi_startproc
diff --git a/gas/testsuite/gas/cfi-sframe/cfi-sframe.exp b/gas/testsuite/gas/cfi-sframe/cfi-sframe.exp
index a73e5c84033..ba6cbc13f72 100644
--- a/gas/testsuite/gas/cfi-sframe/cfi-sframe.exp
+++ b/gas/testsuite/gas/cfi-sframe/cfi-sframe.exp
@@ -55,6 +55,7 @@ if  { ([istarget "x86_64-*-*"] || [istarget "aarch64*-*-*"]
     run_dump_test "common-empty-3"
 
     run_dump_test "cfi-sframe-common-pr33810"
+    run_dump_test "cfi-sframe-common-pr34026"
 }
 
 # x86-64 specific tests
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.