Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 6 Aug 2014 10:38:06 +0000 (UTC)
From:      Andrey A. Chernov <ache@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r269624 - stable/10/lib/libc/stdio
Message-ID:  <53e2058e.5e19.1980309a@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ache
Date: Wed Aug  6 10:38:06 2014
New Revision: 269624
URL: http://svnweb.freebsd.org/changeset/base/269624

Log:
  MFC: r269116
  
  In the "Too many open files" edge cases don't try to preserve old
  number for non-std* descriptors, but close old file and retry.
  
  Obtained from:  inspired by Apple's change from pfg@

Modified:
  stable/10/lib/libc/stdio/freopen.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/lib/libc/stdio/freopen.c
==============================================================================
--- stable/10/lib/libc/stdio/freopen.c	Wed Aug  6 10:33:43 2014	(r269623)
+++ stable/10/lib/libc/stdio/freopen.c	Wed Aug  6 10:38:06 2014	(r269624)
@@ -150,6 +150,14 @@ freopen(const char * __restrict file, co
 
 	/* Get a new descriptor to refer to the new file. */
 	f = _open(file, oflags, DEFFILEMODE);
+	/* If out of fd's close the old one and try again. */
+	if (f < 0 && isopen && wantfd > STDERR_FILENO &&
+	    (errno == ENFILE || errno == EMFILE)) {
+		(void) (*fp->_close)(fp->_cookie);
+		isopen = 0;
+		wantfd = -1;
+		f = _open(file, oflags, DEFFILEMODE);
+	}
 	sverrno = errno;
 
 finish:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?53e2058e.5e19.1980309a>