]> git.gag.com Git - fw/openocd/commitdiff
gdb_server: refuse gdb connection if target is not examined
authorAntonio Borneo <borneo.antonio@gmail.com>
Tue, 4 Jun 2019 10:06:44 +0000 (12:06 +0200)
committerAntonio Borneo <borneo.antonio@gmail.com>
Sat, 8 Aug 2020 21:17:31 +0000 (22:17 +0100)
If the target is not examined, many internal data required for the
gdb connections are not ready nor allocated. This causes OpenOCD
to hit a segmentation fault.

After the execution of the gdb-attach event handler, check if
target has been examined and eventually return error to refuse the
gdb connection.

Plus, since OpenOCD does not implements non-stop mode yet, gdb
expects the target to be halted by the inferior when the
connection is established.
Print a warning to inform the user in case the target is not
halted, but still accept the gdb connection to permit the
non-intrusive memory inspection with gdb, as explained in
http://openocd.org/doc/html/GDB-and-OpenOCD.html#gdbmeminspect

Change-Id: If727d68f683c3a94e4826e8c62977de41274ceff
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: http://openocd.zylin.com/5201
Tested-by: jenkins
src/server/gdb_server.c

index 327d96b1772a4ba23135d1a450612f512fd04649..61d7686c44b7bd16a01bc2d58d21ae28d88e2608 100644 (file)
@@ -1018,6 +1018,17 @@ static int gdb_new_connection(struct connection *connection)
                        target_name(target),
                        target_state_name(target));
 
+       if (!target_was_examined(target)) {
+               LOG_ERROR("Target %s not examined yet, refuse gdb connection %d!",
+                                 target_name(target), gdb_actual_connections);
+               gdb_actual_connections--;
+               return ERROR_TARGET_NOT_EXAMINED;
+       }
+
+       if (target->state == TARGET_HALTED)
+               LOG_WARNING("GDB connection %d on target %s not halted",
+                                       gdb_actual_connections, target_name(target));
+
        /* DANGER! If we fail subsequently, we must remove this handler,
         * otherwise we occasionally see crashes as the timer can invoke the
         * callback fn.