]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
(main_loop_poll): Pass a buffer which is guaranteed to be large enough to read inotif...
authorUlrich Drepper <drepper@redhat.com>
Sun, 3 Aug 2008 15:46:46 +0000 (15:46 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 3 Aug 2008 15:46:46 +0000 (15:46 +0000)
nscd/connections.c

index 8281533c3bc23b197546df688c52e9aae7e8f5a6..3395e54fa1c573d3edc4bf3f34d5363059d292b0 100644 (file)
@@ -1868,8 +1868,11 @@ main_loop_poll (void)
                  bool to_clear[lastdb] = { false, };
                  union
                  {
+# ifndef PATH_MAX
+#  define PATH_MAX 1024
+# endif
                    struct inotify_event i;
-                   char buf[100];
+                   char buf[sizeof (struct inotify_event) + PATH_MAX];
                  } inev;
 
                  while (1)
@@ -1878,17 +1881,20 @@ main_loop_poll (void)
                                                             sizeof (inev)));
                      if (nb < (ssize_t) sizeof (struct inotify_event))
                        {
-                         if (nb == -1)
+                         if (__builtin_expect (nb == -1 && errno != EAGAIN,
+                                               0))
                            {
                              /* Something went wrong when reading the inotify
                                 data.  Better disable inotify.  */
+                             dbg_log (_("\
+disabled inotify after read error %d"),
+                                      errno);
                              conns[1].fd = -1;
                              firstfree = 1;
                              if (nused == 2)
                                nused = 1;
                              close (inotify_fd);
                              inotify_fd = -1;
-                             dbg_log (_("disabled inotify after read error"));
                            }
                          break;
                        }
@@ -2047,7 +2053,7 @@ main_loop_epoll (int efd)
            union
            {
              struct inotify_event i;
-             char buf[100];
+             char buf[sizeof (struct inotify_event) + PATH_MAX];
            } inev;
 
            while (1)
@@ -2056,15 +2062,16 @@ main_loop_epoll (int efd)
                                                 sizeof (inev)));
                if (nb < (ssize_t) sizeof (struct inotify_event))
                  {
-                   if (nb == -1)
+                   if (__builtin_expect (nb == -1 && errno != EAGAIN, 0))
                      {
                        /* Something went wrong when reading the inotify
                           data.  Better disable inotify.  */
+                       dbg_log (_("disabled inotify after read error %d"),
+                                errno);
                        (void) epoll_ctl (efd, EPOLL_CTL_DEL, inotify_fd,
                                          NULL);
                        close (inotify_fd);
                        inotify_fd = -1;
-                       dbg_log (_("disabled inotify after read error"));
                      }
                    break;
                  }