Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Jan 2012 08:04:39 +0000 (UTC)
From:      Martin Matuska <mm@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r230495 - head/usr.sbin/jail
Message-ID:  <201201240804.q0O84dLq064199@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mm
Date: Tue Jan 24 08:04:38 2012
New Revision: 230495
URL: http://svn.freebsd.org/changeset/base/230495

Log:
  Try resolving jail path with realpath(3).
  
  jail(8) does a chdir(2) to the given path argument. Kernel evaluates the
  jail path from the new cwd and not from the original cwd, which leads to
  undesired behavior if given a relative path.
  
  Reviewed by:	jamie
  MFC after:	2 weeks

Modified:
  head/usr.sbin/jail/jail.c

Modified: head/usr.sbin/jail/jail.c
==============================================================================
--- head/usr.sbin/jail/jail.c	Tue Jan 24 06:21:38 2012	(r230494)
+++ head/usr.sbin/jail/jail.c	Tue Jan 24 08:04:38 2012	(r230495)
@@ -508,6 +508,7 @@ static void
 set_param(const char *name, char *value)
 {
 	struct jailparam *param;
+	char path[PATH_MAX];
 	int i;
 
 	static int paramlistsize;
@@ -520,8 +521,13 @@ set_param(const char *name, char *value)
 	}
 
 	/* jail_set won't chdir along with its chroot, so do it here. */
-	if (!strcmp(name, "path") && chdir(value) < 0)
-		err(1, "chdir: %s", value);
+	if (!strcmp(name, "path")) {
+		/* resolve the path with realpath(3) */
+		if (realpath(value, path) != NULL)
+			value = path;
+		if (chdir(value) < 0)
+			err(1, "chdir: %s", value);
+	}
 
 	/* Check for repeat parameters */
 	for (i = 0; i < nparams; i++)



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