]> git.proxmox.com Git - qemu.git/commitdiff
buffer overflow fix - handle case where stdin is closed (Rusty Russell)
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Tue, 30 Sep 2003 21:40:47 +0000 (21:40 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Tue, 30 Sep 2003 21:40:47 +0000 (21:40 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@397 c046a42c-6fe2-441c-8c8c-71466251a162

vl.c

diff --git a/vl.c b/vl.c
index ddb622c1af86ba5fc709b902287389835b761871..89a9e06d5549bacd4b9deea20897a68370f6ed80 100644 (file)
--- a/vl.c
+++ b/vl.c
@@ -3283,8 +3283,8 @@ CPUState *cpu_gdbstub_get_env(void *opaque)
 
 int main_loop(void *opaque)
 {
-    struct pollfd ufds[2], *pf, *serial_ufd, *net_ufd, *gdb_ufd;
-    int ret, n, timeout;
+    struct pollfd ufds[3], *pf, *serial_ufd, *net_ufd, *gdb_ufd;
+    int ret, n, timeout, serial_ok;
     uint8_t ch;
     CPUState *env = global_env;
 
@@ -3296,6 +3296,7 @@ int main_loop(void *opaque)
         term_init();
     }
 
+    serial_ok = 1;
     for(;;) {
         ret = cpu_x86_exec(env);
         if (reset_requested)
@@ -3310,7 +3311,7 @@ int main_loop(void *opaque)
         /* poll any events */
         serial_ufd = NULL;
         pf = ufds;
-        if (!(serial_ports[0].lsr & UART_LSR_DR)) {
+        if (serial_ok && !(serial_ports[0].lsr & UART_LSR_DR)) {
             serial_ufd = pf;
             pf->fd = 0;
             pf->events = POLLIN;
@@ -3337,6 +3338,9 @@ int main_loop(void *opaque)
                 n = read(0, &ch, 1);
                 if (n == 1) {
                     serial_received_byte(&serial_ports[0], ch);
+                } else {
+                   /* Closed, stop polling. */
+                    serial_ok = 0;
                 }
             }
             if (net_ufd && (net_ufd->revents & POLLIN)) {