diff options
author | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2003-09-30 21:40:47 +0000 |
---|---|---|
committer | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2003-09-30 21:40:47 +0000 |
commit | 27c3f2cb9bf2112b82edac898094e0a39e6efca1 (patch) | |
tree | 8448e0a8f68446e656d857558e9edf1f99c00a73 | |
parent | a07cf92aed58a1fbf03d9010e6a81258300be642 (diff) |
buffer overflow fix - handle case where stdin is closed (Rusty Russell)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@397 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r-- | vl.c | 10 |
1 files changed, 7 insertions, 3 deletions
@@ -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)) { |