Commit 27c3f2cb9bf2112b82edac898094e0a39e6efca1
1 parent
a07cf92a
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
Showing
1 changed file
with
7 additions
and
3 deletions
vl.c
| ... | ... | @@ -3283,8 +3283,8 @@ CPUState *cpu_gdbstub_get_env(void *opaque) |
| 3283 | 3283 | |
| 3284 | 3284 | int main_loop(void *opaque) |
| 3285 | 3285 | { |
| 3286 | - struct pollfd ufds[2], *pf, *serial_ufd, *net_ufd, *gdb_ufd; | |
| 3287 | - int ret, n, timeout; | |
| 3286 | + struct pollfd ufds[3], *pf, *serial_ufd, *net_ufd, *gdb_ufd; | |
| 3287 | + int ret, n, timeout, serial_ok; | |
| 3288 | 3288 | uint8_t ch; |
| 3289 | 3289 | CPUState *env = global_env; |
| 3290 | 3290 | |
| ... | ... | @@ -3296,6 +3296,7 @@ int main_loop(void *opaque) |
| 3296 | 3296 | term_init(); |
| 3297 | 3297 | } |
| 3298 | 3298 | |
| 3299 | + serial_ok = 1; | |
| 3299 | 3300 | for(;;) { |
| 3300 | 3301 | ret = cpu_x86_exec(env); |
| 3301 | 3302 | if (reset_requested) |
| ... | ... | @@ -3310,7 +3311,7 @@ int main_loop(void *opaque) |
| 3310 | 3311 | /* poll any events */ |
| 3311 | 3312 | serial_ufd = NULL; |
| 3312 | 3313 | pf = ufds; |
| 3313 | - if (!(serial_ports[0].lsr & UART_LSR_DR)) { | |
| 3314 | + if (serial_ok && !(serial_ports[0].lsr & UART_LSR_DR)) { | |
| 3314 | 3315 | serial_ufd = pf; |
| 3315 | 3316 | pf->fd = 0; |
| 3316 | 3317 | pf->events = POLLIN; |
| ... | ... | @@ -3337,6 +3338,9 @@ int main_loop(void *opaque) |
| 3337 | 3338 | n = read(0, &ch, 1); |
| 3338 | 3339 | if (n == 1) { |
| 3339 | 3340 | serial_received_byte(&serial_ports[0], ch); |
| 3341 | + } else { | |
| 3342 | + /* Closed, stop polling. */ | |
| 3343 | + serial_ok = 0; | |
| 3340 | 3344 | } |
| 3341 | 3345 | } |
| 3342 | 3346 | if (net_ufd && (net_ufd->revents & POLLIN)) { | ... | ... |