[v2] nsswitch: do not reload if "/" changes
Florian Weimer
fweimer@redhat.com
Tue Jan 26 09:58:18 GMT 2021
* DJ Delorie via Libc-alpha:
> + /* Before we reload, verify that "/" hasn't changed. We assume that
> + errors here are very unlikely, but the chance that we're entering
> + a container is also very unlikely, so we err on the side of both
> + very unlikely things not happening at the same time. */
> + if (__stat64 ("/", &str) == 0)
> + {
> + if (local->root_ino != 0
> + && (str.st_ino != local->root_ino
> + || str.st_dev != local->root_dev))
> + {
> + /* Change detected; disable reloading. */
> + atomic_store_release (&local->data.reload_disabled, 1);
> + __libc_lock_unlock (local->lock);
> + __nss_module_disable_loading ();
> + return true;
> + }
> + local->root_ino = str.st_ino;
> + local->root_dev = str.st_dev;
> + }
I still think you should disable (re)loading if __stat64 fails.
> __libc_lock_unlock (local->lock);
>
> /* Avoid overwriting the global configuration until we have loaded
> diff --git a/nss/nss_module.c b/nss/nss_module.c
> index 1a9359930d..6c5f341f3e 100644
> --- a/nss/nss_module.c
> +++ b/nss/nss_module.c
> @@ -349,6 +349,19 @@ __nss_disable_nscd (void (*cb) (size_t, struct traced_file *))
> }
> #endif
>
> +/* Block attempts to dlopen any module we haven't already opened. */
> +void
> +__nss_module_disable_loading (void)
> +{
> + __libc_lock_lock (nss_module_list_lock);
> +
> + for (struct nss_module *p = nss_module_list; p != NULL; p = p->next)
> + if (p->state == nss_module_uninitialized)
> + p->state = nss_module_failed;
> +
> + __libc_lock_unlock (nss_module_list_lock);
> +}
Maybe call __nss_module_disable_loading after releasing local->lock?
Although there should not be a risk of deadlocks in the current code
because there aren't any relevant function calls while
nss_module_list_lock is locked.
Thanks,
Florian
--
Red Hat GmbH, https://de.redhat.com/ , Registered seat: Grasbrunn,
Commercial register: Amtsgericht Muenchen, HRB 153243,
Managing Directors: Charles Cachera, Brian Klemm, Laurie Krebs, Michael O'Neill
More information about the Libc-alpha
mailing list