From 2847dac128a8ba0e1ba1b4f9bb8fb8f638fdd9c0 Mon Sep 17 00:00:00 2001 From: Taylor R Campbell Date: Fri, 11 Apr 2014 19:06:11 +0000 Subject: [PATCH 10/14] Fix locking in doscheckpath. --- sys/fs/msdosfs/msdosfs_lookup.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sys/fs/msdosfs/msdosfs_lookup.c b/sys/fs/msdosfs/msdosfs_lookup.c index b25bd10..905e012 100644 --- a/sys/fs/msdosfs/msdosfs_lookup.c +++ b/sys/fs/msdosfs/msdosfs_lookup.c @@ -836,7 +836,7 @@ doscheckpath(struct denode *source, struct denode *target) u_long scn; struct msdosfsmount *pmp; struct direntry *ep; - struct denode *dep; + struct denode *dep, *ddep; struct buf *bp = NULL; int error = 0; @@ -895,12 +895,13 @@ doscheckpath(struct denode *source, struct denode *target) break; } - vput(DETOV(dep)); brelse(bp, 0); bp = NULL; /* NOTE: deget() clears dep on error */ - if ((error = deget(pmp, scn, 0, 0, &dep)) != 0) + if ((error = deget(pmp, scn, 0, 0, &ddep)) != 0) break; + vput(DETOV(dep)); + dep = ddep; #ifndef MAKEFS if ((error = vn_lock(DETOV(dep), LK_EXCLUSIVE)) != 0) { vrele(DETOV(dep)); -- 1.8.3.1