2.8-8
This commit is contained in:
parent
456c7dc140
commit
005e850828
171
glibc-nscd-inotify-fix.patch
Normal file
171
glibc-nscd-inotify-fix.patch
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
2008-07-12 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* nscd/connections.c (main_loop_poll): Fix handling of read errors
|
||||||
|
from inotify.
|
||||||
|
(main_loop_epoll): Likewise.
|
||||||
|
|
||||||
|
--- libc/nscd/connections.c 3 Jul 2008 12:21:15 -0000 1.55.2.42
|
||||||
|
+++ libc/nscd/connections.c 16 Jul 2008 09:47:15 -0000
|
||||||
|
@@ -1806,42 +1806,64 @@ main_loop_poll (void)
|
||||||
|
|
||||||
|
size_t first = 1;
|
||||||
|
#ifdef HAVE_INOTIFY
|
||||||
|
- if (conns[1].fd == inotify_fd)
|
||||||
|
+ if (inotify_fd != -1 && conns[1].fd == inotify_fd)
|
||||||
|
{
|
||||||
|
if (conns[1].revents != 0)
|
||||||
|
{
|
||||||
|
- bool done[lastdb] = { false, };
|
||||||
|
+ bool to_clear[lastdb] = { false, };
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct inotify_event i;
|
||||||
|
char buf[100];
|
||||||
|
} inev;
|
||||||
|
|
||||||
|
- while (TEMP_FAILURE_RETRY (read (inotify_fd, &inev,
|
||||||
|
- sizeof (inev)))
|
||||||
|
- >= (ssize_t) sizeof (struct inotify_event))
|
||||||
|
+ while (1)
|
||||||
|
{
|
||||||
|
+ ssize_t nb = TEMP_FAILURE_RETRY (read (inotify_fd, &inev,
|
||||||
|
+ sizeof (inev)));
|
||||||
|
+ if (nb < (ssize_t) sizeof (struct inotify_event))
|
||||||
|
+ {
|
||||||
|
+ if (nb == -1)
|
||||||
|
+ {
|
||||||
|
+ /* Something went wrong when reading the inotify
|
||||||
|
+ data. Better disable inotify. */
|
||||||
|
+ 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;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Check which of the files changed. */
|
||||||
|
for (size_t dbcnt = 0; dbcnt < lastdb; ++dbcnt)
|
||||||
|
- if (!done[dbcnt]
|
||||||
|
- && (inev.i.wd == dbs[dbcnt].inotify_descr
|
||||||
|
- || (dbcnt == hstdb
|
||||||
|
- && inev.i.wd == resolv_conf_descr)))
|
||||||
|
+ if (inev.i.wd == dbs[dbcnt].inotify_descr)
|
||||||
|
{
|
||||||
|
- if (dbcnt == hstdb
|
||||||
|
- && inev.i.wd == resolv_conf_descr)
|
||||||
|
- res_init ();
|
||||||
|
-
|
||||||
|
- pthread_mutex_lock (&dbs[dbcnt].prune_lock);
|
||||||
|
- dbs[dbcnt].clear_cache = 1;
|
||||||
|
- pthread_mutex_unlock (&dbs[dbcnt].prune_lock);
|
||||||
|
- pthread_cond_signal (&dbs[dbcnt].prune_cond);
|
||||||
|
-
|
||||||
|
- done[dbcnt] = true;
|
||||||
|
- break;
|
||||||
|
+ to_clear[dbcnt] = true;
|
||||||
|
+ goto next;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ if (inev.i.wd == resolv_conf_descr)
|
||||||
|
+ {
|
||||||
|
+ res_init ();
|
||||||
|
+ to_clear[hstdb] = true;
|
||||||
|
+ }
|
||||||
|
+ next:;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* Actually perform the cache clearing. */
|
||||||
|
+ for (size_t dbcnt = 0; dbcnt < lastdb; ++dbcnt)
|
||||||
|
+ if (to_clear[dbcnt])
|
||||||
|
+ {
|
||||||
|
+ pthread_mutex_lock (&dbs[dbcnt].prune_lock);
|
||||||
|
+ dbs[dbcnt].clear_cache = 1;
|
||||||
|
+ pthread_mutex_unlock (&dbs[dbcnt].prune_lock);
|
||||||
|
+ pthread_cond_signal (&dbs[dbcnt].prune_cond);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
--n;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1966,27 +1988,57 @@ main_loop_epoll (int efd)
|
||||||
|
#ifdef HAVE_INOTIFY
|
||||||
|
else if (revs[cnt].data.fd == inotify_fd)
|
||||||
|
{
|
||||||
|
+ bool to_clear[lastdb] = { false, };
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct inotify_event i;
|
||||||
|
char buf[100];
|
||||||
|
} inev;
|
||||||
|
|
||||||
|
- while (TEMP_FAILURE_RETRY (read (inotify_fd, &inev,
|
||||||
|
- sizeof (inev)))
|
||||||
|
- >= (ssize_t) sizeof (struct inotify_event))
|
||||||
|
+ while (1)
|
||||||
|
{
|
||||||
|
+ ssize_t nb = TEMP_FAILURE_RETRY (read (inotify_fd, &inev,
|
||||||
|
+ sizeof (inev)));
|
||||||
|
+ if (nb < (ssize_t) sizeof (struct inotify_event))
|
||||||
|
+ {
|
||||||
|
+ if (nb == -1)
|
||||||
|
+ {
|
||||||
|
+ /* Something went wrong when reading the inotify
|
||||||
|
+ data. Better disable inotify. */
|
||||||
|
+ (void) epoll_ctl (efd, EPOLL_CTL_DEL, inotify_fd,
|
||||||
|
+ NULL);
|
||||||
|
+ close (inotify_fd);
|
||||||
|
+ inotify_fd = -1;
|
||||||
|
+ dbg_log (_("disabled inotify after read error"));
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Check which of the files changed. */
|
||||||
|
for (size_t dbcnt = 0; dbcnt < lastdb; ++dbcnt)
|
||||||
|
if (inev.i.wd == dbs[dbcnt].inotify_descr)
|
||||||
|
{
|
||||||
|
- pthread_mutex_trylock (&dbs[dbcnt].prune_lock);
|
||||||
|
- dbs[dbcnt].clear_cache = 1;
|
||||||
|
- pthread_mutex_unlock (&dbs[dbcnt].prune_lock);
|
||||||
|
- pthread_cond_signal (&dbs[dbcnt].prune_cond);
|
||||||
|
- break;
|
||||||
|
+ to_clear[dbcnt] = true;
|
||||||
|
+ goto next;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ if (inev.i.wd == resolv_conf_descr)
|
||||||
|
+ {
|
||||||
|
+ res_init ();
|
||||||
|
+ to_clear[hstdb] = true;
|
||||||
|
+ }
|
||||||
|
+ next:;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ /* Actually perform the cache clearing. */
|
||||||
|
+ for (size_t dbcnt = 0; dbcnt < lastdb; ++dbcnt)
|
||||||
|
+ if (to_clear[dbcnt])
|
||||||
|
+ {
|
||||||
|
+ pthread_mutex_lock (&dbs[dbcnt].prune_lock);
|
||||||
|
+ dbs[dbcnt].clear_cache = 1;
|
||||||
|
+ pthread_mutex_unlock (&dbs[dbcnt].prune_lock);
|
||||||
|
+ pthread_cond_signal (&dbs[dbcnt].prune_cond);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else
|
||||||
|
@@ -2010,8 +2062,10 @@ main_loop_epoll (int efd)
|
||||||
|
/* Now look for descriptors for accepted connections which have
|
||||||
|
no reply in too long of a time. */
|
||||||
|
time_t laststart = now - ACCEPT_TIMEOUT;
|
||||||
|
+ assert (starttime[sock] == 0);
|
||||||
|
+ assert (inotify_fd == -1 || starttime[inotify_fd] == 0);
|
||||||
|
for (int cnt = highest; cnt > STDERR_FILENO; --cnt)
|
||||||
|
- if (cnt != sock && starttime[cnt] != 0 && starttime[cnt] < laststart)
|
||||||
|
+ if (starttime[cnt] != 0 && starttime[cnt] < laststart)
|
||||||
|
{
|
||||||
|
/* We are waiting for this one for too long. Close it. */
|
||||||
|
(void) epoll_ctl (efd, EPOLL_CTL_DEL, cnt, NULL);
|
30
glibc-rh455360.patch
Normal file
30
glibc-rh455360.patch
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
2008-07-15 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* stdio-common/vfprintf.c (_IO_helper_overflow): In case _IO_sputn
|
||||||
|
doesn't manage to write anything, fail.
|
||||||
|
|
||||||
|
--- libc/stdio-common/vfprintf.c 8 Apr 2008 07:59:50 -0000 1.128.2.13
|
||||||
|
+++ libc/stdio-common/vfprintf.c 16 Jul 2008 09:47:15 -0000
|
||||||
|
@@ -2080,6 +2080,11 @@ _IO_helper_overflow (_IO_FILE *s, int c)
|
||||||
|
{
|
||||||
|
_IO_size_t written = _IO_sputn (target, s->_wide_data->_IO_write_base,
|
||||||
|
used);
|
||||||
|
+ if (written == 0 || written == WEOF)
|
||||||
|
+ return WEOF;
|
||||||
|
+ __wmemmove (s->_wide_data->_IO_write_base,
|
||||||
|
+ s->_wide_data->_IO_write_base + written,
|
||||||
|
+ used - written);
|
||||||
|
s->_wide_data->_IO_write_ptr -= written;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
@@ -2087,6 +2092,10 @@ _IO_helper_overflow (_IO_FILE *s, int c)
|
||||||
|
if (used)
|
||||||
|
{
|
||||||
|
_IO_size_t written = _IO_sputn (target, s->_IO_write_base, used);
|
||||||
|
+ if (written == 0 || written == EOF)
|
||||||
|
+ return EOF;
|
||||||
|
+ memmove (s->_IO_write_base, s->_IO_write_base + written,
|
||||||
|
+ used - written);
|
||||||
|
s->_IO_write_ptr -= written;
|
||||||
|
}
|
||||||
|
#endif
|
10
glibc.spec
10
glibc.spec
@ -23,7 +23,7 @@
|
|||||||
Summary: The GNU libc libraries
|
Summary: The GNU libc libraries
|
||||||
Name: glibc
|
Name: glibc
|
||||||
Version: 2.8
|
Version: 2.8
|
||||||
Release: 7
|
Release: 8
|
||||||
# GPLv2+ is used in a bunch of programs, LGPLv2+ is used for libraries.
|
# GPLv2+ is used in a bunch of programs, LGPLv2+ is used for libraries.
|
||||||
# Things that are linked directly into dynamically linked programs
|
# Things that are linked directly into dynamically linked programs
|
||||||
# and shared libraries (e.g. crt files, lib*_nonshared.a) have an additional
|
# and shared libraries (e.g. crt files, lib*_nonshared.a) have an additional
|
||||||
@ -59,6 +59,8 @@ Patch16: glibc-rwlock-pshared.patch
|
|||||||
Patch17: glibc-sparc.patch
|
Patch17: glibc-sparc.patch
|
||||||
Patch18: glibc-tls-getaddr.patch
|
Patch18: glibc-tls-getaddr.patch
|
||||||
Patch19: glibc-bz6719.patch
|
Patch19: glibc-bz6719.patch
|
||||||
|
Patch20: glibc-nscd-inotify-fix.patch
|
||||||
|
Patch21: glibc-rh455360.patch
|
||||||
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||||
Obsoletes: glibc-profile < 2.4
|
Obsoletes: glibc-profile < 2.4
|
||||||
Provides: ldconfig
|
Provides: ldconfig
|
||||||
@ -256,6 +258,8 @@ package or when debugging this package.
|
|||||||
%patch17 -p1
|
%patch17 -p1
|
||||||
%patch18 -p1
|
%patch18 -p1
|
||||||
%patch19 -p1
|
%patch19 -p1
|
||||||
|
%patch20 -p1
|
||||||
|
%patch21 -p1
|
||||||
|
|
||||||
# A lot of programs still misuse memcpy when they have to use
|
# A lot of programs still misuse memcpy when they have to use
|
||||||
# memmove. The memcpy implementation below is not tolerant at
|
# memmove. The memcpy implementation below is not tolerant at
|
||||||
@ -1016,6 +1020,10 @@ rm -f *.filelist*
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Jul 16 2008 Jakub Jelinek <jakub@redhat.com> 2.8-8
|
||||||
|
- another nscd fix
|
||||||
|
- fix unbuffered vfprintf (#455360)
|
||||||
|
|
||||||
* Tue Jul 8 2008 Jakub Jelinek <jakub@redhat.com> 2.8-7
|
* Tue Jul 8 2008 Jakub Jelinek <jakub@redhat.com> 2.8-7
|
||||||
- assorted nscd fixes (#450704, #445656, #449358)
|
- assorted nscd fixes (#450704, #445656, #449358)
|
||||||
- misc fixes (BZ#3406, BZ#6461, BZ#6472, BZ#6612, BZ#6657, BZ#6723, BZ#6719)
|
- misc fixes (BZ#3406, BZ#6461, BZ#6472, BZ#6612, BZ#6657, BZ#6723, BZ#6719)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user