Module Name: src Committed By: riastradh Date: Sun Aug 5 04:26:10 UTC 2012
Modified Files: src/sys/kern: sys_descrip.c Log Message: Force sys_close not to restart by returning ERESTART. Print a diagnostic message if we ever get ERESTART out of fd_close and convert it to EINTR instead. Even if fd_close fails, it has already closed the file descriptor, so restarting the system call is a mistake, with dangerous consequences for multithreaded programs. Should probably turn the message into a kassert eventually, and maybe add one deeper in fd_close in order to more easily debug it before all the data structures are destroyed. To generate a diff of this commit: cvs rdiff -u -r1.26 -r1.27 src/sys/kern/sys_descrip.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/sys_descrip.c diff -u src/sys/kern/sys_descrip.c:1.26 src/sys/kern/sys_descrip.c:1.27 --- src/sys/kern/sys_descrip.c:1.26 Sat Feb 11 23:16:17 2012 +++ src/sys/kern/sys_descrip.c Sun Aug 5 04:26:10 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_descrip.c,v 1.26 2012/02/11 23:16:17 martin Exp $ */ +/* $NetBSD: sys_descrip.c,v 1.27 2012/08/05 04:26:10 riastradh Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_descrip.c,v 1.26 2012/02/11 23:16:17 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_descrip.c,v 1.27 2012/08/05 04:26:10 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -479,11 +479,22 @@ sys_close(struct lwp *l, const struct sy /* { syscallarg(int) fd; } */ + int error; if (fd_getfile(SCARG(uap, fd)) == NULL) { return EBADF; } - return fd_close(SCARG(uap, fd)); + + error = fd_close(SCARG(uap, fd)); + if (error == ERESTART) { +#ifdef DIAGNOSTIC + printf("pid %d: close returned ERESTART\n", + (int)l->l_proc->p_pid); +#endif + error = EINTR; + } + + return error; } /*