gdbstub: Handle errors in gdb_accept()
In gdb_accept(), we both fail to check all errors (notably that from socket_set_nodelay(), as Coverity notes in CID 1005666), and fail to return an error status back to our caller. Correct both of these things, so that errors in accept() result in our stopping with a useful error message rather than ignoring it. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
This commit is contained in:
		
							parent
							
								
									f5bdd78131
								
							
						
					
					
						commit
						2f652224f7
					
				
							
								
								
									
										16
									
								
								gdbstub.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								gdbstub.c
									
									
									
									
									
								
							@ -1814,7 +1814,7 @@ void gdb_signalled(CPUArchState *env, int sig)
 | 
				
			|||||||
    put_packet(s, buf);
 | 
					    put_packet(s, buf);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void gdb_accept(void)
 | 
					static bool gdb_accept(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GDBState *s;
 | 
					    GDBState *s;
 | 
				
			||||||
    struct sockaddr_in sockaddr;
 | 
					    struct sockaddr_in sockaddr;
 | 
				
			||||||
@ -1826,7 +1826,7 @@ static void gdb_accept(void)
 | 
				
			|||||||
        fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
 | 
					        fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
 | 
				
			||||||
        if (fd < 0 && errno != EINTR) {
 | 
					        if (fd < 0 && errno != EINTR) {
 | 
				
			||||||
            perror("accept");
 | 
					            perror("accept");
 | 
				
			||||||
            return;
 | 
					            return false;
 | 
				
			||||||
        } else if (fd >= 0) {
 | 
					        } else if (fd >= 0) {
 | 
				
			||||||
            qemu_set_cloexec(fd);
 | 
					            qemu_set_cloexec(fd);
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
@ -1834,7 +1834,10 @@ static void gdb_accept(void)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* set short latency */
 | 
					    /* set short latency */
 | 
				
			||||||
    socket_set_nodelay(fd);
 | 
					    if (socket_set_nodelay(fd)) {
 | 
				
			||||||
 | 
					        perror("setsockopt");
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    s = g_malloc0(sizeof(GDBState));
 | 
					    s = g_malloc0(sizeof(GDBState));
 | 
				
			||||||
    s->c_cpu = first_cpu;
 | 
					    s->c_cpu = first_cpu;
 | 
				
			||||||
@ -1843,6 +1846,7 @@ static void gdb_accept(void)
 | 
				
			|||||||
    gdb_has_xml = false;
 | 
					    gdb_has_xml = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    gdbserver_state = s;
 | 
					    gdbserver_state = s;
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int gdbserver_open(int port)
 | 
					static int gdbserver_open(int port)
 | 
				
			||||||
@ -1883,7 +1887,11 @@ int gdbserver_start(int port)
 | 
				
			|||||||
    if (gdbserver_fd < 0)
 | 
					    if (gdbserver_fd < 0)
 | 
				
			||||||
        return -1;
 | 
					        return -1;
 | 
				
			||||||
    /* accept connections */
 | 
					    /* accept connections */
 | 
				
			||||||
    gdb_accept();
 | 
					    if (!gdb_accept()) {
 | 
				
			||||||
 | 
					        close(gdbserver_fd);
 | 
				
			||||||
 | 
					        gdbserver_fd = -1;
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user