fusefs: during F_GETLK, don't change l_pid if no lock is found

PR:		266885
MFC after:	2 weeks
Submitted by:	John Millikin <jmillikin@gmail.com>
Sponsored by:	Axcient
Reviewed by:	emaste
Differential Revision: https://reviews.freebsd.org/D36905
This commit is contained in:
Alan Somers 2022-10-07 08:46:22 -06:00
parent 6bf91573c1
commit 46fcf947c6
2 changed files with 15 additions and 3 deletions

View file

@ -537,8 +537,8 @@ fuse_vnop_advlock(struct vop_advlock_args *ap)
if (err == 0 && op == FUSE_GETLK) {
flo = fdi.answ;
fl->l_type = flo->lk.type;
fl->l_pid = flo->lk.pid;
if (flo->lk.type != F_UNLCK) {
fl->l_pid = flo->lk.pid;
fl->l_start = flo->lk.start;
if (flo->lk.end == INT64_MAX)
fl->l_len = 0;

View file

@ -278,12 +278,24 @@ TEST_F(Getlk, no_locks)
ASSERT_LE(0, fd) << strerror(errno);
fl.l_start = 10;
fl.l_len = 1000;
fl.l_pid = 0;
fl.l_pid = 42;
fl.l_type = F_RDLCK;
fl.l_whence = SEEK_SET;
fl.l_sysid = 0;
fl.l_sysid = 42;
ASSERT_NE(-1, fcntl(fd, F_GETLK, &fl)) << strerror(errno);
/*
* If no lock is found that would prevent this lock from being created,
* the structure is left unchanged by this system call except for the
* lock type which is set to F_UNLCK.
*/
ASSERT_EQ(F_UNLCK, fl.l_type);
ASSERT_EQ(fl.l_pid, 42);
ASSERT_EQ(fl.l_start, 10);
ASSERT_EQ(fl.l_len, 1000);
ASSERT_EQ(fl.l_whence, SEEK_SET);
ASSERT_EQ(fl.l_sysid, 42);
leak(fd);
}