diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c index 88ef347..dd40014 100644 --- a/gdb/gdbserver/remote-utils.c +++ b/gdb/gdbserver/remote-utils.c @@ -321,7 +321,10 @@ remote_open (char *name) if (bind (listen_desc, (struct sockaddr *) &sockaddr, sizeof (sockaddr)) || listen (listen_desc, 1)) - perror_with_name ("Can't bind address"); + { + close (listen_desc); + perror_with_name ("Can't bind address"); + } /* If port is zero, a random port will be selected, and the fprintf below needs to know what port was selected. */ @@ -331,7 +334,10 @@ remote_open (char *name) if (getsockname (listen_desc, (struct sockaddr *) &sockaddr, &len) < 0 || len < sizeof (sockaddr)) - perror_with_name ("Can't determine port"); + { + close (listen_desc); + perror_with_name ("Can't determine port"); + } port = ntohs (sockaddr.sin_port); } diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 0ddf9de..b04a50d 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -2650,6 +2650,9 @@ main (int argc, char *argv[]) while (1) { + /* Wait a moment when for example the listening port is now busy. */ + int delay = 1; + noack_mode = 0; multi_process = 0; /* Be sure we're out of tfind mode. */ @@ -2665,7 +2668,11 @@ main (int argc, char *argv[]) write_enn (own_buf); putpkt (own_buf); } + + if (delay) + sleep (1); } + delay = 0; /* Wait for events. This will return when all event sources are removed from the event loop. */