NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
kern/39842: fcntl(2)/F_SETLK overlapping locks LOCKDEBUG kernel panic
>Number: 39842
>Category: kern
>Synopsis: fcntl(2)/F_SETLK overlapping locks LOCKDEBUG kernel panic
>Confidential: no
>Severity: serious
>Priority: high
>Responsible: kern-bug-people
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Fri Oct 31 18:25:00 +0000 2008
>Originator: Nicolas Joly
>Release: NetBSD 5.99.01
>Organization:
Institut Pasteur, Paris.
>Environment:
System: NetBSD lanfeust.sis.pasteur.fr 5.99.01 NetBSD 5.99.01 (LANFEUST) #1:
Fri Oct 31 13:10:41 CET 2008
njoly%lanfeust.sis.pasteur.fr@localhost:/local/src/NetBSD/obj.amd64/sys/arch/amd64/compile/LANFEUST
amd64
Architecture: x86_64
Machine: amd64
>Description:
The following testcase triggers a LOCKDEBUG kernel panic, when trying to setup
2 overlapping F_WRLCK+F_RDLCK locks with fcntl(2)/F_SETLK.
#include <err.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#define TEST_FILE "fcntl.test"
int main() {
char *buf;
int res, fd;
size_t len;
ssize_t siz;
struct flock lck;
lck.l_whence = SEEK_SET;
fd = open(TEST_FILE, O_RDWR|O_CREAT, 0660);
if (fd == -1)
err(1, "open failed");
buf = "0123456789"; len = strlen(buf);
siz = write(fd, buf, len);
if (siz == -1)
err(1, "write failed");
lck.l_start = 1; lck.l_len = len - 2; lck.l_type = F_WRLCK;
res = fcntl(fd, F_SETLK, &lck);
if (res == -1)
err(1, "fcntl failed");
lck.l_start = 2; lck.l_len = len - 4; lck.l_type = F_RDLCK;
res = fcntl(fd, F_SETLK, &lck);
if (res == -1)
err(1, "fcntl failed");
res = close(fd);
if (res == -1)
err(1, "close failed");
res = unlink(TEST_FILE);
if (res == -1)
err(1, "unlink failed");
return 0; }
njoly@lanfeust [netbsd/todo]> ./fcntl
[...]
panic: LOCKDEBUG
fatal breakpoint trap in supervisor mode
trap type 1 code 0 rip ffffffff8052eeb5 cs 8 rflags 246 cr2 ffff800049019000
cpl 0 rsp ffff80004a1f2820
Stopped in pid 340.1 (fcntl) at netbsd:breakpoint+0x5: leave
db{0}> bt
breakpoint() at netbsd:breakpoint+0x5
panic() at netbsd:panic+0x260
lockdebug_abort1() at netbsd:lockdebug_abort1+0xd3
lockdebug_alloc() at netbsd:lockdebug_alloc+0xd7
cv_init() at netbsd:cv_init+0x27
lf_split() at netbsd:lf_split+0x5b
lf_advlock() at netbsd:lf_advlock+0x73e
VOP_ADVLOCK() at netbsd:VOP_ADVLOCK+0x71
do_fcntl_lock() at netbsd:do_fcntl_lock+0x15b
sys_fcntl() at netbsd:sys_fcntl+0xf0
syscall() at netbsd:syscall+0xb6
>How-To-Repeat:
Run the above testcase on LOCKDEBUG kernel.
>Fix:
Home |
Main Index |
Thread Index |
Old Index