crash evaluating bogus exception condition expression (sparc-solaris)
authorJoel Brobecker <brobecker@adacore.com>
Tue, 29 Oct 2013 10:36:58 +0000 (11:36 +0100)
committerJoel Brobecker <brobecker@adacore.com>
Tue, 3 Dec 2013 11:42:48 +0000 (15:42 +0400)
commit849f2b52ec2b71bc76188ac8c53f35fb57a5d41c
treec9755759006fe51f398edddc25258107dd33152d
parent4e35e8085e8922746e0731a7005452de499620fa
crash evaluating bogus exception condition expression (sparc-solaris)

With a program raising an exception, trying to debug that program
in GDB/MI mode can yield a crash:

    % gdb -i=mi foo
    (gdb)
    -catch-exception -e "Program_Error"
    ^done,bkptno="2",bkpt={number="2",type="breakpoint",[...]
    (gdb)
    -exec-continue
    ^running
    *running,thread-id="all"
    (gdb)
    =library-loaded,id=[...]
    &"warning: failed to reevaluate internal exception condition for catchpoint 2: Error in expression, near `'.\n"
    zsh: 22956 bus error (core dumped)  gdb -q -i=mi foo

The problem is triggered by a problem in the compiler which causes
EXP in the following TRY_CATCH block to change unexpectedly when
parse_exp_1 throws an error :

   |      TRY_CATCH (e, RETURN_MASK_ERROR)
   |        {
   |          exp = parse_exp_1 (&s, bl->address,
   |                             block_for_pc (bl->address), 0);
   |        }

In ada-lang.c:create_excep_cond_exprs, EXP is initialized to NULL,
and is expected to remain NULL if parse_exp_1 throws.  Instead,
its value gets changed to something invalid.  This later crashes
the debugger, when trying to evaluate the bogus expression.

This patch works around the issue by simply forcing EXP back to NULL
when an exception was thrown. A comment explaining why, and the sort
of timeline we're looking at for a fix, is also added.

gdb/ChangeLog:

        * ada-lang.c (create_excep_cond_exprs): Force EXP to NULL
        when parse_exp_1 threw an error.  Add comment.
gdb/ChangeLog
gdb/ada-lang.c