fix breakage in do_rmdir()
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 12 Aug 2020 04:15:18 +0000 (05:15 +0100)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 12 Aug 2020 17:22:39 +0000 (10:22 -0700)
syzbot reported and bisected a use-after-free due to the recent init
cleanups.

The putname() should happen only after we'd *not* branched to retry,
same as it's done in do_unlinkat().

Reported-by: syzbot+bbeb1c88016c7db4aa24@syzkaller.appspotmail.com
Fixes: e24ab0ef689d "fs: push the getname from do_rmdir into the callers"
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/namei.c

index fde8fe0..9fa10c6 100644 (file)
@@ -3770,11 +3770,11 @@ exit2:
        mnt_drop_write(path.mnt);
 exit1:
        path_put(&path);
-       putname(name);
        if (retry_estale(error, lookup_flags)) {
                lookup_flags |= LOOKUP_REVAL;
                goto retry;
        }
+       putname(name);
        return error;
 }