100 lines
2.9 KiB
Diff
100 lines
2.9 KiB
Diff
From d40220801eec992804cb728d51228d19496fffd9 Mon Sep 17 00:00:00 2001
|
|
From: msweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>
|
|
Date: Tue, 22 Jul 2014 14:03:19 +0000
|
|
Subject: [PATCH] Mirror changes from trunk.
|
|
|
|
git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/branches/branch-1.7@12057 a1ca3aef-8c08-0410-bb20-df032aa958be
|
|
---
|
|
diff --git a/scheduler/client.c b/scheduler/client.c
|
|
index e5959fa..366b351 100644
|
|
--- a/scheduler/client.c
|
|
+++ b/scheduler/client.c
|
|
@@ -3310,7 +3310,7 @@ get_file(cupsd_client_t *con, /* I - Client connection */
|
|
* then fallback to the default one...
|
|
*/
|
|
|
|
- if ((status = stat(filename, filestats)) != 0 && language[0] &&
|
|
+ if ((status = lstat(filename, filestats)) != 0 && language[0] &&
|
|
strncmp(con->uri, "/icons/", 7) &&
|
|
strncmp(con->uri, "/ppd/", 5) &&
|
|
strncmp(con->uri, "/rss/", 5) &&
|
|
@@ -3408,13 +3408,13 @@ get_file(cupsd_client_t *con, /* I - Client connection */
|
|
plen = len - (ptr - filename);
|
|
|
|
strlcpy(ptr, "index.html", plen);
|
|
- status = stat(filename, filestats);
|
|
+ status = lstat(filename, filestats);
|
|
|
|
#ifdef HAVE_JAVA
|
|
if (status)
|
|
{
|
|
strlcpy(ptr, "index.class", plen);
|
|
- status = stat(filename, filestats);
|
|
+ status = lstat(filename, filestats);
|
|
}
|
|
#endif /* HAVE_JAVA */
|
|
|
|
@@ -3422,7 +3422,7 @@ get_file(cupsd_client_t *con, /* I - Client connection */
|
|
if (status)
|
|
{
|
|
strlcpy(ptr, "index.pl", plen);
|
|
- status = stat(filename, filestats);
|
|
+ status = lstat(filename, filestats);
|
|
}
|
|
#endif /* HAVE_PERL */
|
|
|
|
@@ -3430,7 +3430,7 @@ get_file(cupsd_client_t *con, /* I - Client connection */
|
|
if (status)
|
|
{
|
|
strlcpy(ptr, "index.php", plen);
|
|
- status = stat(filename, filestats);
|
|
+ status = lstat(filename, filestats);
|
|
}
|
|
#endif /* HAVE_PHP */
|
|
|
|
@@ -3438,18 +3438,39 @@ get_file(cupsd_client_t *con, /* I - Client connection */
|
|
if (status)
|
|
{
|
|
strlcpy(ptr, "index.pyc", plen);
|
|
- status = stat(filename, filestats);
|
|
+ status = lstat(filename, filestats);
|
|
}
|
|
|
|
if (status)
|
|
{
|
|
strlcpy(ptr, "index.py", plen);
|
|
- status = stat(filename, filestats);
|
|
+ status = lstat(filename, filestats);
|
|
}
|
|
#endif /* HAVE_PYTHON */
|
|
|
|
}
|
|
while (status && language[0]);
|
|
+
|
|
+ /*
|
|
+ * If we've found a symlink, 404 the sucker to avoid disclosing information.
|
|
+ */
|
|
+
|
|
+ if (!status && S_ISLNK(filestats->st_mode))
|
|
+ {
|
|
+ cupsdLogMessage(CUPSD_LOG_INFO, "[Client %d] Symlinks such as \"%s\" are not allowed.", con->http.fd, filename);
|
|
+ return (NULL);
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Similarly, if the file/directory does not have world read permissions, do
|
|
+ * not allow access...
|
|
+ */
|
|
+
|
|
+ if (!status && !(filestats->st_mode & S_IROTH))
|
|
+ {
|
|
+ cupsdLogMessage(CUPSD_LOG_INFO, "[Client %d] Files/directories such as \"%s\" must be world-readable.", con->http.fd, filename);
|
|
+ return (NULL);
|
|
+ }
|
|
}
|
|
|
|
cupsdLogMessage(CUPSD_LOG_DEBUG2,
|
|
--
|
|
1.9.3
|
|
|