@@ -10,6 +10,7 @@
*/
#include "qemu/osdep.h"
+#include "qapi/error.h"
#include "qemu/bitops.h"
#include "qemu/cutils.h"
#include "qemu/sockets.h"
@@ -317,9 +318,9 @@ static bool gdb_accept_socket(int gdb_fd)
static int gdbserver_open_socket(const char *path)
{
g_autoptr(GString) buf = g_string_new("");
- struct sockaddr_un sockaddr = {};
char *pid_placeholder;
- int fd, ret;
+ Error *err = NULL;
+ int fd;
pid_placeholder = strstr(path, "%d");
if (pid_placeholder != NULL) {
@@ -329,24 +330,9 @@ static int gdbserver_open_socket(const char *path)
path = buf->str;
}
- fd = socket(AF_UNIX, SOCK_STREAM, 0);
+ fd = unix_listen(path, &err);
if (fd < 0) {
- perror("create socket");
- return -1;
- }
-
- sockaddr.sun_family = AF_UNIX;
- pstrcpy(sockaddr.sun_path, sizeof(sockaddr.sun_path) - 1, path);
- ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
- if (ret < 0) {
- perror("bind socket");
- close(fd);
- return -1;
- }
- ret = listen(fd, 1);
- if (ret < 0) {
- perror("listen socket");
- close(fd);
+ warn_report_err(err);
return -1;
}
In case an emulated process execve()s another emulated process, bind() will fail, because the socket already exists. So try deleting it. Use the existing unix_listen() function which does this. Note that it is not possible to handle this in do_execv(): deleting gdbserver_user_state.socket_path before safe_execve() is not correct, because the latter may fail, and afterwards we may lose control. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> --- gdbstub/user.c | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-)