tty.c: Handle EINVAL and use recommended inotify event size.

The TTY plugin might fail in read() with EINVAL if the inotify event
buffer is too small.  Fix: set the receive event buffer to the size
recommended in inotify(7).  Also add a handler for EINVAL to close and
reinitialize the inotify descriptor so we do not accidentally overrun
the CPU with any unhandled errors.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
This commit is contained in:
Joachim Nilsson
2015-10-26 04:33:51 +01:00
parent f902505b5d
commit c8f0b97d0f
2 changed files with 10 additions and 3 deletions
+8 -2
View File
@@ -46,7 +46,10 @@ static plugin_t plugin = {
static void setup(void)
{
plugin.io.fd = inotify_init1(IN_NONBLOCK);
if (plugin.io.fd)
close(plugin.io.fd);
plugin.io.fd = inotify_init1(IN_NONBLOCK | IN_CLOEXEC);
if (-1 == plugin.io.fd || inotify_add_watch(plugin.io.fd, "/dev", IN_CREATE | IN_DELETE) < 0)
_e("Failed starting TTY watcher: %s", strerror(errno));
}
@@ -60,9 +63,12 @@ static void watcher(void *UNUSED(arg), int fd, int UNUSED(events))
while ((len = read(fd, buf, sizeof(buf)))) {
if (-1 == len) {
if (errno == EINVAL)
setup();
if (errno == EINTR)
continue;
break;
break; /* Likely EAGAIN */
}
snprintf(name, sizeof(name), "/dev/%s", notified->name);