From 9ab48ee37050e2676ae0ddbf253bb3ae5567eb45 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Mon, 15 Jun 2015 08:28:10 +0200 Subject: [PATCH] hjfs: defer parent directory permission check for wstat check parent directory permission *after* we determined that the new name does not exist in the parent, so that when the new name is the same as old name then no write permission is required in the parent directory. --- sys/src/cmd/hjfs/fs2.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/sys/src/cmd/hjfs/fs2.c b/sys/src/cmd/hjfs/fs2.c index 71658cfb3..4390404f1 100644 --- a/sys/src/cmd/hjfs/fs2.c +++ b/sys/src/cmd/hjfs/fs2.c @@ -698,18 +698,17 @@ chanwstat(Chan *ch, Dir *di) d = getdent(ch->loc->next, pb); if(d == nil) goto error; - if((ch->flags & CHFNOPERM) == 0) - if(!permcheck(ch->fs, d, ch->uid, OWRITE)) - goto perm; rc = findentry(ch->fs, ch->loc->next, pb, di->name, &f, ch->flags & CHFDUMP); - if(rc > 0){ - if(f.blk == ch->loc->blk && f.deind == ch->loc->deind) - rc = 0; - else - werrstr(Eexists); - } - if(rc != 0) + if(rc < 0) + goto error; + else if(rc == 0){ + if((ch->flags & CHFNOPERM) == 0) + if(!permcheck(ch->fs, d, ch->uid, OWRITE)) + goto perm; + } else if(f.blk != ch->loc->blk || f.deind != ch->loc->deind){ + werrstr(Eexists); goto error; + } } b = getbuf(ch->fs->d, ch->loc->blk, TDENTRY, 0); if(b == nil) -- 2.44.0