Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 4 Dec 2020 02:20:42 +0000 (UTC)
From:      Kyle Evans <kevans@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r368323 - stable/12/sys/kern
Message-ID:  <202012040220.0B42KgET055959@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kevans
Date: Fri Dec  4 02:20:41 2020
New Revision: 368323
URL: https://svnweb.freebsd.org/changeset/base/368323

Log:
  MFC r368006: kern: never restart syscalls calling closefp(), e.g. close(2)
  
  All paths leading into closefp() will either replace or remove the fd from
  the filedesc table, and closefp() will call fo_close methods that can and do
  currently sleep without regard for the possibility of an ERESTART. This can
  be dangerous in multithreaded applications as another thread could have
  opened another file in its place that is subsequently operated on upon
  restart.
  
  The following are seemingly the only ones that will pass back ERESTART
  in-tree:
  - sockets (SO_LINGER)
  - fusefs
  - nfsclient

Modified:
  stable/12/sys/kern/kern_descrip.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/kern/kern_descrip.c
==============================================================================
--- stable/12/sys/kern/kern_descrip.c	Fri Dec  4 02:19:45 2020	(r368322)
+++ stable/12/sys/kern/kern_descrip.c	Fri Dec  4 02:20:41 2020	(r368323)
@@ -1223,6 +1223,15 @@ closefp(struct filedesc *fdp, int fd, struct file *fp,
 	FILEDESC_XUNLOCK(fdp);
 
 	error = closef(fp, td);
+
+	/*
+	 * All paths leading up to closefp() will have already removed or
+	 * replaced the fd in the filedesc table, so a restart would not
+	 * operate on the same file.
+	 */
+	if (error == ERESTART)
+		error = EINTR;
+
 	if (holdleaders) {
 		FILEDESC_XLOCK(fdp);
 		fdp->fd_holdleaderscount--;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202012040220.0B42KgET055959>