From 1ff30367b7e4e5a603185fee4fbf9f229e0e15a3 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Fri, 20 Oct 2023 09:05:32 +0200 Subject: [PATCH] nscd: Skip unusable entries in first pass in prune_cache (RHEL-1192) Resolves: RHEL-1192 --- glibc-RHEL-1192.patch | 83 +++++++++++++++++++++++++++++++++++++++++++ glibc.spec | 6 +++- 2 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 glibc-RHEL-1192.patch diff --git a/glibc-RHEL-1192.patch b/glibc-RHEL-1192.patch new file mode 100644 index 0000000..1262624 --- /dev/null +++ b/glibc-RHEL-1192.patch @@ -0,0 +1,83 @@ +commit c00b984fcd53f679ca2dafcd1aee2c89836e6e73 +Author: Florian Weimer +Date: Tue Aug 29 08:28:31 2023 +0200 + + nscd: Skip unusable entries in first pass in prune_cache (bug 30800) + + Previously, if an entry was marked unusable for any reason, but had + not timed out yet, the assert would trigger. + + One way to get into such state is if a data change is detected during + re-validation of an entry. This causes the entry to be marked as not + usable. If exits nscd soon after that, then the clock jumps + backwards, and nscd restarted, the cache re-validation run after + startup triggers the removed assert. + + The change is more complicated than just the removal of the assert + because entries marked as not usable should be garbage-collected in + the second pass. To make this happen, it is necessary to update some + book-keeping data. + + Reviewed-by: DJ Delorie + +diff --git a/nscd/cache.c b/nscd/cache.c +index efe4214d953edb30..2fd3f78ebb567bbe 100644 +--- a/nscd/cache.c ++++ b/nscd/cache.c +@@ -371,8 +371,11 @@ prune_cache (struct database_dyn *table, time_t now, int fd) + serv2str[runp->type], str, dh->timeout); + } + +- /* Check whether the entry timed out. */ +- if (dh->timeout < now) ++ /* Check whether the entry timed out. Timed out entries ++ will be revalidated. For unusable records, it is still ++ necessary to record that the bucket needs to be scanned ++ again below. */ ++ if (dh->timeout < now || !dh->usable) + { + /* This hash bucket could contain entries which need to + be looked at. */ +@@ -384,7 +387,7 @@ prune_cache (struct database_dyn *table, time_t now, int fd) + /* We only have to look at the data of the first entries + since the count information is kept in the data part + which is shared. */ +- if (runp->first) ++ if (runp->first && dh->usable) + { + + /* At this point there are two choices: we reload the +@@ -400,9 +403,6 @@ prune_cache (struct database_dyn *table, time_t now, int fd) + { + /* Remove the value. */ + dh->usable = false; +- +- /* We definitely have some garbage entries now. */ +- any = true; + } + else + { +@@ -414,18 +414,15 @@ prune_cache (struct database_dyn *table, time_t now, int fd) + + time_t timeout = readdfcts[runp->type] (table, runp, dh); + next_timeout = MIN (next_timeout, timeout); +- +- /* If the entry has been replaced, we might need +- cleanup. */ +- any |= !dh->usable; + } + } ++ ++ /* If the entry has been replaced, we might need cleanup. */ ++ any |= !dh->usable; + } + else +- { +- assert (dh->usable); +- next_timeout = MIN (next_timeout, dh->timeout); +- } ++ /* Entry has not timed out and is usable. */ ++ next_timeout = MIN (next_timeout, dh->timeout); + + run = runp->next; + } diff --git a/glibc.spec b/glibc.spec index 3c44c47..1ac2604 100644 --- a/glibc.spec +++ b/glibc.spec @@ -1,6 +1,6 @@ %define glibcsrcdir glibc-2.28 %define glibcversion 2.28 -%define glibcrelease 238%{?dist} +%define glibcrelease 239%{?dist} # Pre-release tarballs are pulled in from git using a command that is # effectively: # @@ -1055,6 +1055,7 @@ Patch867: glibc-RHEL-2423.patch Patch868: glibc-RHEL-3036.patch Patch869: glibc-RHEL-3757.patch Patch870: glibc-RHEL-2122.patch +Patch871: glibc-RHEL-1192.patch ############################################################################## # Continued list of core "glibc" package information: @@ -2885,6 +2886,9 @@ fi %files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared %changelog +* Fri Oct 20 2023 Florian Weimer - 2.28-239 +- nscd: Skip unusable entries in first pass in prune_cache (RHEL-1192) + * Mon Oct 16 2023 DJ Delorie - 2.28-238 - Fix slow tls access after dlopen (RHEL-2122)