svn commit: r216851 - in head: bin/sh tools/regression/bin/sh/errors

Jilles Tjoelker jilles at FreeBSD.org
Fri Dec 31 18:20:18 UTC 2010


Author: jilles
Date: Fri Dec 31 18:20:17 2010
New Revision: 216851
URL: http://svn.freebsd.org/changeset/base/216851

Log:
  sh: Check if dup2 for redirection from/to a file succeeds.
  
  A failure (e.g. caused by ulimit -n being set very low) is a redirection
  error.
  
  Example:
    ulimit -n 9; exec 9<.

Added:
  head/tools/regression/bin/sh/errors/redirection-error7.0   (contents, props changed)
Modified:
  head/bin/sh/redir.c

Modified: head/bin/sh/redir.c
==============================================================================
--- head/bin/sh/redir.c	Fri Dec 31 18:16:44 2010	(r216850)
+++ head/bin/sh/redir.c	Fri Dec 31 18:20:17 2010	(r216851)
@@ -155,6 +155,7 @@ openredirect(union node *redir, char mem
 	int fd = redir->nfile.fd;
 	char *fname;
 	int f;
+	int e;
 
 	/*
 	 * We suppress interrupts so that we won't leave open file
@@ -173,7 +174,11 @@ openredirect(union node *redir, char mem
 			error("cannot open %s: %s", fname, strerror(errno));
 movefd:
 		if (f != fd) {
-			dup2(f, fd);
+			if (dup2(f, fd) == -1) {
+				e = errno;
+				close(f);
+				error("%d: %s", fd, strerror(e));
+			}
 			close(f);
 		}
 		break;

Added: head/tools/regression/bin/sh/errors/redirection-error7.0
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/bin/sh/errors/redirection-error7.0	Fri Dec 31 18:20:17 2010	(r216851)
@@ -0,0 +1,7 @@
+# $FreeBSD$
+
+! dummy=$(
+	exec 3>&1 >&2 2>&3
+	ulimit -n 9
+	exec 9<.
+) && [ -n "$dummy" ]


More information about the svn-src-all mailing list