[openssh-commits] [openssh] 67/87: upstream: set a glob(3) error callback when globbing Include

git+noreply at mindrot.org git+noreply at mindrot.org
Fri Oct 30 20:21:44 AEDT 2026


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

djm pushed a commit to branch master
in repository openssh.

commit c30113f3511c7e8c580c354b2b71be3ee585b633
Author: djm at openbsd.org <djm at openbsd.org>
AuthorDate: Fri Oct 30 08:07:36 2026 +0000

    upstream: set a glob(3) error callback when globbing Include
    
    files to allow discrimination between missing files/directories and failure
    to open a file or directory.
    
    Avoids possible (though unlikely) situation where a local attacker could
    cause an Include'd file from being processed by doing tricks like hitting
    fd limits at the right time.
    
    Anthropic ANT-2026-NF7CR4JX
    
    OpenBSD-Commit-ID: 561568f92b71cda06f47070c31a533995d652a70
---
 misc.c     | 17 ++++++++++++++++-
 misc.h     |  3 ++-
 readconf.c |  4 ++--
 servconf.c |  5 +++--
 4 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/misc.c b/misc.c
index bc83e39fc..fb3ec2bee 100644
--- a/misc.c
+++ b/misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc.c,v 1.222 2026/10/30 01:16:44 djm Exp $ */
+/* $OpenBSD: misc.c,v 1.223 2026/10/30 08:07:36 djm Exp $ */
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
  * Copyright (c) 2005-2020 Damien Miller.  All rights reserved.
@@ -2686,6 +2686,21 @@ path_absolute(const char *path)
 	return (*path == '/') ? 1 : 0;
 }
 
+/*
+ * glob(3) error callback for configuration file Include directives.
+ * A directory that doesn't exist matches no files, but a failure to read
+ * one that does must not be mistaken for that: abort the glob instead.
+ */
+int
+include_glob_error(const char *path, int errnum)
+{
+	if (errnum == ENOENT || errnum == ENOTDIR)
+		return 0;
+	error("Include: unable to read directory %s: %s", path,
+	    strerror(errnum));
+	return 1;
+}
+
 void
 skip_space(char **cpp)
 {
diff --git a/misc.h b/misc.h
index 0784f379b..cfb9d50a4 100644
--- a/misc.h
+++ b/misc.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc.h,v 1.120 2026/09/16 06:23:16 djm Exp $ */
+/* $OpenBSD: misc.h,v 1.121 2026/10/30 08:07:36 djm Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo at cs.hut.fi>
@@ -111,6 +111,7 @@ int	 parse_absolute_time(const char *, uint64_t *);
 void	 format_absolute_time(uint64_t, char *, size_t);
 int	 parse_pattern_interval(const char *, char **, double *);
 int	 path_absolute(const char *);
+int	 include_glob_error(const char *, int);
 int	 stdfd_devnull(int, int, int);
 int	 lib_contains_symbol(const char *, const char *);
 char	*get_homedir(void);
diff --git a/readconf.c b/readconf.c
index cf9baa988..80788df85 100644
--- a/readconf.c
+++ b/readconf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: readconf.c,v 1.421 2026/10/30 06:40:58 djm Exp $ */
+/* $OpenBSD: readconf.c,v 1.422 2026/10/30 08:07:36 djm Exp $ */
 /*
  * Author: Tatu Ylonen <ylo at cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo at cs.hut.fi>, Espoo, Finland
@@ -2150,7 +2150,7 @@ parse_pubkey_algos:
 			}
 			free(p);
 			memset(&gl, 0, sizeof(gl));
-			r = glob(arg2, GLOB_TILDE, NULL, &gl);
+			r = glob(arg2, GLOB_TILDE, include_glob_error, &gl);
 			if (r == GLOB_NOMATCH) {
 				debug("%.200s line %d: include %s matched no "
 				    "files",filename, linenum, arg2);
diff --git a/servconf.c b/servconf.c
index 70842a076..d40750a87 100644
--- a/servconf.c
+++ b/servconf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: servconf.c,v 1.461 2026/10/30 03:28:03 djm Exp $ */
+/* $OpenBSD: servconf.c,v 1.462 2026/10/30 08:07:36 djm Exp $ */
 /*
  * Copyright (c) 1995 Tatu Ylonen <ylo at cs.hut.fi>, Espoo, Finland
  *                    All rights reserved
@@ -2226,7 +2226,8 @@ process_server_config_line_depth(ServerOptions *options, char *line,
 			/* requested glob was not in cache */
 			debug2("%s line %d: new include %s",
 			    filename, linenum, arg);
-			if ((r = glob(arg, 0, NULL, &gbuf)) != 0) {
+			if ((r = glob(arg, 0, include_glob_error,
+			    &gbuf)) != 0) {
 				if (r != GLOB_NOMATCH) {
 					fatal("%s line %d: include \"%s\" glob "
 					    "failed", filename, linenum, arg);

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


More information about the openssh-commits mailing list