[openssh-commits] [openssh] 01/01: Check if realpath works on nonexistent files.

git+noreply at mindrot.org git+noreply at mindrot.org
Fri Jul 17 12:58:20 AEST 2015


This is an automated email from the git hooks/post-receive script.

dtucker pushed a commit to branch master
in repository openssh.

commit d3e2aee41487d55b8d7d40f538b84ff1db7989bc
Author: Darren Tucker <dtucker at zip.com.au>
Date:   Fri Jul 17 12:52:34 2015 +1000

    Check if realpath works on nonexistent files.
    
    On some platforms the native realpath doesn't work with non-existent
    files (this is actually specified in some versions of POSIX), however
    the sftp spec says its realpath with "canonicalize any given path name".
    On those platforms, use realpath from the compat library.
    
    In addition, when compiling with -DFORTIFY_SOURCE, glibc redefines
    the realpath symbol to the checked version, so redefine ours to
    something else so we pick up the compat version we want.
    
    bz#2428, ok djm@
---
 configure.ac                    | 27 ++++++++++++++++++++++++++-
 openbsd-compat/openbsd-compat.h | 10 +++++++++-
 2 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/configure.ac b/configure.ac
index 2240c72..9b05c30 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1674,7 +1674,6 @@ AC_CHECK_FUNCS([ \
 	pstat \
 	readpassphrase \
 	reallocarray \
-	realpath \
 	recvmsg \
 	rresvport_af \
 	sendmsg \
@@ -1891,6 +1890,32 @@ AC_CHECK_FUNCS([setresgid], [
 	)
 ])
 
+AC_CHECK_FUNCS([realpath], [
+	dnl the sftp v3 spec says SSH_FXP_REALPATH will "canonicalize any given
+	dnl path name", however some implementations of realpath (and some
+	dnl versions of the POSIX spec) do not work on non-existent files,
+	dnl so we use the OpenBSD implementation on those platforms.
+	AC_MSG_CHECKING([if realpath works with non-existent files])
+	AC_RUN_IFELSE(
+		[AC_LANG_PROGRAM([[
+#include <limits.h>
+#include <stdlib.h>
+#include <errno.h>
+		]], [[
+		char buf[PATH_MAX];
+		if (realpath("/opensshnonexistentfilename1234", buf) == NULL)
+			if (errno == ENOENT)
+				exit(1);
+		exit(0);
+		]])],
+		[AC_MSG_RESULT([yes])],
+		[AC_DEFINE([BROKEN_REALPATH], [1],
+			[realpath does not work with nonexistent files])
+		 AC_MSG_RESULT([no])],
+		[AC_MSG_WARN([cross compiling: assuming working])]
+	)
+])
+
 dnl    Checks for time functions
 AC_CHECK_FUNCS([gettimeofday time])
 dnl    Checks for utmp functions
diff --git a/openbsd-compat/openbsd-compat.h b/openbsd-compat/openbsd-compat.h
index cb59ccd..1ff7114 100644
--- a/openbsd-compat/openbsd-compat.h
+++ b/openbsd-compat/openbsd-compat.h
@@ -70,8 +70,16 @@ void *reallocarray(void *, size_t, size_t);
 #endif
 
 #if !defined(HAVE_REALPATH) || defined(BROKEN_REALPATH)
+/*
+ * glibc's FORTIFY_SOURCE can redefine this and prevent us picking up the
+ * compat version.
+ */
+# ifdef BROKEN_REALPATH
+#  define realpath(x, y) _ssh_compat_realpath(x, y)
+# endif
+
 char *realpath(const char *path, char *resolved);
-#endif 
+#endif
 
 #ifndef HAVE_RRESVPORT_AF
 int rresvport_af(int *alport, sa_family_t af);

-- 
To stop receiving notification emails like this one, please contact
djm at mindrot.org.


More information about the openssh-commits mailing list