From: drath Date: Sun, 24 Feb 2008 12:30:45 +0000 (+0000) Subject: - fixes possible crash when GDB connection is closed while target is running due... X-Git-Tag: v0.1.0~964 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=885ae471ad66693d3266b645bdb6e3671d8b0822 - fixes possible crash when GDB connection is closed while target is running due to log callback sending messages to connection which does not exist anymore (thanks to Pavel Chromy for this patch) git-svn-id: svn://svn.berlios.de/openocd/trunk@325 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index 71f82dd456..c2651e88ed 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -678,6 +678,7 @@ int gdb_connection_closed(connection_t *connection) } target_unregister_event_callback(gdb_target_callback_event_handler, connection); + log_setCallback(NULL, NULL); return ERROR_OK; } diff --git a/src/server/server.c b/src/server/server.c index 82f9f448bb..b0ad834ab6 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -47,7 +47,7 @@ int handle_shutdown_command(struct command_context_s *cmd_ctx, char *cmd, char * int add_connection(service_t *service, command_context_t *cmd_ctx) { unsigned int address_size; - connection_t *c, *p; + connection_t *c, **p; int retval; c = malloc(sizeof(connection_t)); @@ -73,16 +73,9 @@ int add_connection(service_t *service, command_context_t *cmd_ctx) free(c); } - if (service->connections) - { - for (p = service->connections; p && p->next; p = p->next); - if (p) - p->next = c; - } - else - { - service->connections = c; - } + /* add to the end of linked list */ + for (p = &service->connections; *p; p = &(*p)->next); + *p = c; service->max_connections--; @@ -91,30 +84,28 @@ int add_connection(service_t *service, command_context_t *cmd_ctx) int remove_connection(service_t *service, connection_t *connection) { - connection_t *c = service->connections; + connection_t **p = &service->connections; + connection_t *c; /* find connection */ - while(c) - { - connection_t *next = c->next; - + while(c = *p) + { if (c->fd == connection->fd) { - service->connections = next; service->connection_closed(c); close_socket(c->fd); - command_done(c->cmd_ctx); /* delete connection */ + *p = c->next; free(c); service->max_connections++; break; } - /* remember the last connection for unlinking */ - c = next; + /* redirect p to next list pointer */ + p = &(*p)->next; } return ERROR_OK; @@ -122,7 +113,7 @@ int remove_connection(service_t *service, connection_t *connection) int add_service(char *name, enum connection_type type, unsigned short port, int max_connections, new_connection_handler_t new_connection_handler, input_handler_t input_handler, connection_closed_handler_t connection_closed_handler, void *priv) { - service_t *c, *p; + service_t *c, **p; int so_reuseaddr_option = 1; c = malloc(sizeof(service_t)); @@ -166,29 +157,21 @@ int add_service(char *name, enum connection_type type, unsigned short port, int exit(-1); } - if (services) - { - for (p = services; p && p->next; p = p->next); - if (p) - p->next = c; - } - else - { - services = c; - } + /* add to the end of linked list */ + for (p = &services; *p; p = &(*p)->next); + *p = c; return ERROR_OK; } int remove_service(unsigned short port) { - service_t *c = services; + service_t **p = services; + service_t *c; /* find service */ - while(c) - { - service_t *next = c->next; - + while(c = *p) + { if (c->port == port) { if (c->name) @@ -198,11 +181,12 @@ int remove_service(unsigned short port) free(c->priv); /* delete service */ + *p = c->next; free(c); } - - /* remember the last service for unlinking */ - c = next; + + /* redirect p to next list pointer */ + p = &(*p)->next; } return ERROR_OK;