[binutils-gdb] gdb.base/execl-update-breakpoints.exp: Don't execl forever

Pedro Alves via Gdb-cvs <[email protected]> Fri, 10 Jul 2026 18:03:41 +0000 (GMT)
Newsgroups gmane.comp.gdb.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=490469846dcef89fe53668bdbba73591c64bed61

commit 490469846dcef89fe53668bdbba73591c64bed61
Author: Pedro Alves <[email protected]>
Date:   Thu Nov 27 18:06:12 2025 +0000

    gdb.base/execl-update-breakpoints.exp: Don't execl forever
    
    execl-update-breakpoints.c is compiled as both
    execl-update-breakpoints1 and execl-update-breakpoints2.
    
    execl-update-breakpoints1 checks to see if the last character in its
    filename is '1', and if so, replace it with '2' and execl the result.
    
    On Windows, this fails to take into account that the filename may have
    an ".exe" extension.  The result is that the execl-update-breakpoints1
    executable execs itself forever.
    
    This patch fixes it by taking the .exe extension into account.
    
    (Note that neither native Windows nor Cygwin support following execs,
    and maybe the testcase will eventually be skipped there, but even
    then, if someone enables follow-exec testing there, we'd want it to
    handle the .exe extension, so I think it's better to adjust the
    testcase than not.)
    
    Now, on e.g. GNU/Linux, if you run execl-update-breakpoints1 manually,
    you'll see that it also execs forever, but this time, what happens is
    that execl-update-breakpoints1 execs execl-update-breakpoints2, and
    then it's execl-update-breakpoints2 that execs itself forever.  There
    is no reason for execl-update-breakpoints2 to exec.  It's just that
    the testcase is assuming that the process is killed when the testcase
    is over.  It's just cleaner if execl-update-breakpoints1 execs
    execl-update-breakpoints2, and then execl-update-breakpoints2 just
    cleanly exits.  The patch does that too.
    
    And then, the test program should really be erroring out if neither
    '1' nor '2' is found at the tail of the executable.  Done too.
    
    Approved-By: Simon Marchi <[email protected]>
    Change-Id: Id88830cd8dff2c63dd69b827d4ba79743aa9ebca

Diff:
---
 gdb/testsuite/gdb.base/execl-update-breakpoints.c | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/gdb/testsuite/gdb.base/execl-update-breakpoints.c b/gdb/testsuite/gdb.base/execl-update-breakpoints.c
index adaf2e3bbbd..1682c9ad40a 100644
--- a/gdb/testsuite/gdb.base/execl-update-breakpoints.c
+++ b/gdb/testsuite/gdb.base/execl-update-breakpoints.c
@@ -34,11 +34,21 @@ main (int argc, char **argv)
   len = strlen (argv[0]);
   bin = malloc (len + 1);
   memcpy (bin, argv[0], len + 1);
-  if (bin[len - 1] == '1')
-    bin[len - 1] = '2';
 
-  execl (bin, bin, (char *) NULL);
-  perror ("execl failed");
-  some_function ();
-  exit (1);
+  /* Account for the extension on Windows.  */
+  if (len > 4 && strcmp (bin + len - 4, ".exe") == 0)
+    len -= 4;
+
+  if (bin[len - 1] == '1')
+    {
+      bin[len - 1] = '2';
+      execl (bin, bin, (char *) NULL);
+      perror ("execl failed");
+      some_function ();
+      exit (1);
+    }
+  else if (bin[len - 1] == '2')
+    exit (0);
+  else
+    exit (1);
 }