SEGV during AX eval of OP_DOUBLE (unsupported)
authorJoel Brobecker <brobecker@gnat.com>
Wed, 21 Mar 2012 15:16:24 +0000 (15:16 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Wed, 21 Mar 2012 15:16:24 +0000 (15:16 +0000)
commitbd0b9f9e12441312c46482764448a8a8ce236107
treedd038bb3899fde1f4b8bed60e4de7ada7b83ba57
parentb781d74fe101630e7d5dac103916b17fbe4de7cd
SEGV during AX eval of OP_DOUBLE (unsupported)

To reproduce the problem, simply try the following with any program:

    (gdb) maintenance agent-eval 1.0
    Critical error handler: process [...] terminated due to access violation

(this is on Windows; on GNU/Linux, the libc copes better)

The problem is quite simple: gen_expr is given an expression that
contains an unrecognized operator (OP_DOUBLE in this case). When that
happens, it tries to report an error with a string image of the operator
in the error message.  Conversion of the opcode into a string is done
using op_string which, despite its name, probably is not what the author
was looking for.  This function returns NULL for a lot of the opcodes,
thus triggering the crash.

There is a function that corresponds to what we are looking for:
expprint.c:op_name. It was static, though, so I made it non-static,
and used it from ax-gdb.c:gen_expr.

gdb/ChangeLog:

        * expression.h (op_name): Add declaration.
        * expprint.c (op_name): Remove declaration.  Make non-static.
        * ax-gdb.c (gen_expr): Use op_name instead of op_string.
gdb/ChangeLog
gdb/ax-gdb.c
gdb/expprint.c
gdb/expression.h