]> git.sur5r.net Git - openocd/commitdiff
- fixes possible crash when GDB connection is closed while target is running due...
authordrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Sun, 24 Feb 2008 12:30:45 +0000 (12:30 +0000)
committerdrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Sun, 24 Feb 2008 12:30:45 +0000 (12:30 +0000)
exist anymore (thanks to Pavel Chromy for this patch)

git-svn-id: svn://svn.berlios.de/openocd/trunk@325 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/server/gdb_server.c
src/server/server.c

index 71f82dd456d548683d23a8a62560a0fb77d95b20..c2651e88edce971968596f63f75d1a5e019c4e35 100644 (file)
@@ -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;
 }
index 82f9f448bb33a3a91cf52db3a200861fc2478ce9..b0ad834ab6b15b79842455f008100a9c8db15e2f 100644 (file)
@@ -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;