Il 11/11/2013 17:56, Anthony Liguori ha scritto: > On Mon, Nov 11, 2013 at 8:50 AM, Eric Blake <ebl...@redhat.com> wrote: >> Quick - identify the bug in this code (from ui/curses.c): >> >> static void curses_winch_handler(int signum) >> { >> struct winsize { >> unsigned short ws_row; >> unsigned short ws_col; >> unsigned short ws_xpixel; /* unused */ >> unsigned short ws_ypixel; /* unused */ >> } ws; >> >> /* terminal size changed */ >> if (ioctl(1, TIOCGWINSZ, &ws) == -1) >> return; >> >> resize_term(ws.ws_row, ws.ws_col); >> curses_calc_pad(); >> invalidate = 1; >> >> /* some systems require this */ >> signal(SIGWINCH, curses_winch_handler); >> } >> >> Here's a hint: ioctl() can clobber errno. But if a signal handler is >> called in the middle of other code that is using errno, then the handler >> MUST restore the value of errno before returning, if it is to guarantee >> that the interrupted context won't be corrupted. > > Isn't this precisely why EINTR exists?
No. do { rc = read(...); } while (rc == -1 && errno == EINTR); /* signal handler runs here */ if (errno == EAGAIN) { ... } That said, aren't all signals in QEMU (except SIG_IPI) caught with signalfd and the handlers run synchronously in the iothread? Paolo