aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2021-02-28 00:14:43 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2021-03-02 18:21:30 +0000
commite8a2862aa0384c75603f801625e309a3dae0ed05 (patch)
tree8fa8b773347fc52b0173ab954acacac3420fadff
parent2388ad7c293fbc89ee239a1adcb87fd158c4e8e9 (diff)
downloadsrc-e8a2862aa0384c75603f801625e309a3dae0ed05.tar.gz
src-e8a2862aa0384c75603f801625e309a3dae0ed05.zip
Add nameicap_cleanup_from(), to clean tracker list starting from some element
Reviewed by: markj Tested by: arichardson, pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D28907
-rw-r--r--sys/kern/vfs_lookup.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c
index cdd4a914239f..abc01c73e24c 100644
--- a/sys/kern/vfs_lookup.c
+++ b/sys/kern/vfs_lookup.c
@@ -192,19 +192,26 @@ nameicap_tracker_add(struct nameidata *ndp, struct vnode *dp)
}
static void
-nameicap_cleanup(struct nameidata *ndp)
+nameicap_cleanup_from(struct nameidata *ndp, struct nameicap_tracker *first)
{
struct nameicap_tracker *nt, *nt1;
- KASSERT(TAILQ_EMPTY(&ndp->ni_cap_tracker) ||
- (ndp->ni_lcf & NI_LCF_CAP_DOTDOT) != 0, ("not strictrelative"));
- TAILQ_FOREACH_SAFE(nt, &ndp->ni_cap_tracker, nm_link, nt1) {
+ nt = first;
+ TAILQ_FOREACH_FROM_SAFE(nt, &ndp->ni_cap_tracker, nm_link, nt1) {
TAILQ_REMOVE(&ndp->ni_cap_tracker, nt, nm_link);
vdrop(nt->dp);
free(nt, M_NAMEITRACKER);
}
}
+static void
+nameicap_cleanup(struct nameidata *ndp)
+{
+ KASSERT(TAILQ_EMPTY(&ndp->ni_cap_tracker) ||
+ (ndp->ni_lcf & NI_LCF_CAP_DOTDOT) != 0, ("not strictrelative"));
+ nameicap_cleanup_from(ndp, NULL);
+}
+
/*
* For dotdot lookups in capability mode, only allow the component
* lookup to succeed if the resulting directory was already traversed