components/proftpd/patches/19596338.patch
branchs11u2-sru
changeset 4311 3a33895438c9
parent 4294 427b52500a3a
child 4319 da855e17148a
--- a/components/proftpd/patches/19596338.patch	Fri May 15 09:41:56 2015 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,157 +0,0 @@
-diff --git a/include/glibc-glob.h b/include/glibc-glob.h
-index 422089a..a55899a 100644
---- a/include/glibc-glob.h
-+++ b/include/glibc-glob.h
-@@ -85,6 +85,7 @@ extern "C" {
- #define	GLOB_ABORTED	2	/* Read error.  */
- #define	GLOB_NOMATCH	3	/* No matches found.  */
- #define GLOB_NOSYS	4	/* Not implemented.  */
-+#define GLOB_LIMIT	5       /* MAX_RESULTS limit reached */
- #ifdef _GNU_SOURCE
- /* Previous versions of this file defined GLOB_ABEND instead of
-    GLOB_ABORTED.  Provide a compatibility definition here.  */
-diff --git a/lib/glibc-glob.c b/lib/glibc-glob.c
-index 43b02bc..92c2b94 100644
---- a/lib/glibc-glob.c
-+++ b/lib/glibc-glob.c
-@@ -40,6 +40,15 @@ char *alloca ();
- #define MAX_RECURSION 	PR_TUNABLE_GLOBBING_MAX_RECURSION
- #define MAX_RESULTS	PR_TUNABLE_GLOBBING_MAX_MATCHES
- 
-+unsigned long GlobMaxResults = 0;
-+
-+static unsigned long get_globmaxresults(void)
-+{
-+  if (GlobMaxResults > 0)
-+    return GlobMaxResults;
-+  return MAX_RESULTS;
-+}
-+
- /* Enable GNU extensions in glob.h.  */
- #ifndef _GNU_SOURCE
- # define _GNU_SOURCE	1
-@@ -239,8 +248,6 @@ extern void bcopy ();
- # define mempcpy(Dest, Src, Len) __mempcpy (Dest, Src, Len)
- #endif
- 
--static unsigned long nbresults;
--
- #ifndef	__GNU_LIBRARY__
- # ifdef	__GNUC__
- __inline
-@@ -1157,7 +1164,6 @@ int
- glob (const char *pattern, int flags, int (*errfunc) __P((const char *, int)),
-     glob_t *pglob)
- {
--	nbresults = 0UL;
- 	return glob_limited(0U, pattern, flags, errfunc, pglob);
- }
- 
-@@ -1318,6 +1324,7 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
-   size_t nfound;
-   int meta;
-   int save;
-+  int ret_glob_limit = 0;
- 
-   meta = __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE));
-   if (meta == 0 && (flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
-@@ -1428,10 +1435,6 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
- #endif
- 		  if (d == NULL)
- 		    break;
--		  if (nbresults > MAX_RESULTS) {	
--			  break;
--		  }
--		  nbresults++;	
- 		  if (! REAL_DIR_ENTRY (d))
- 		    continue;
- 
-@@ -1463,6 +1466,14 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
- 		      new->next = names;
- 		      names = new;
- 		      ++nfound;
-+
-+		      if (nfound > get_globmaxresults()) {
-+                        for (; names != NULL; names = names->next)
-+                          free(names->name);
-+                        nfound = 0;
-+		        ret_glob_limit = 1;
-+		        break;
-+		      }
- 		    }
- 		}
- 	    }
-@@ -1516,6 +1527,9 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
-     }
-   __set_errno (save);
- 
-+  if (ret_glob_limit)
-+    return GLOB_LIMIT;
-+
-   return nfound == 0 ? GLOB_NOMATCH : 0;
- 
-  memory_error:
-diff --git a/modules/mod_core.c b/modules/mod_core.c
-index e33ee11..1f6da19 100644
---- a/modules/mod_core.c
-+++ b/modules/mod_core.c
-@@ -973,6 +973,26 @@ MODRET set_maxconnrate(cmd_rec *cmd) {
-   return PR_HANDLED(cmd);
- }
- 
-+extern unsigned long GlobMaxResults;
-+
-+MODRET set_globmaxresults(cmd_rec *cmd) {
-+  unsigned long max;
-+  char *endp;
-+
-+  CHECK_ARGS(cmd,1);
-+  CHECK_CONF(cmd,CONF_ROOT);
-+
-+  max = strtoul(cmd->argv[1], &endp, 10);
-+
-+  if ((endp && *endp) || max == 0)
-+    CONF_ERROR(cmd, "argument must be greater than 0");
-+
-+  pr_log_debug(DEBUG1, "setting GlobMaxResults to %lu", max);
-+
-+  GlobMaxResults = max;
-+  return PR_HANDLED(cmd);
-+}
-+
- MODRET set_timeoutidle(cmd_rec *cmd) {
-   int timeout = -1;
-   config_rec *c = NULL;
-@@ -6108,6 +6128,7 @@ static conftable core_conftab[] = {
-   { "DisplayConnect",		set_displayconnect,		NULL },
-   { "DisplayQuit",		set_displayquit,		NULL },
-   { "From",			add_from,			NULL },
-+  { "GlobMaxResults",		set_globmaxresults,	        NULL },
-   { "Group",			set_group, 			NULL },
-   { "GroupOwner",		add_groupowner,			NULL },
-   { "HideFiles",		set_hidefiles,			NULL },
-diff --git a/modules/mod_ls.c b/modules/mod_ls.c
-index 5b95d2b..e8bbb74 100644
---- a/modules/mod_ls.c
-+++ b/modules/mod_ls.c
-@@ -2015,6 +2015,8 @@ static int dolist(cmd_rec *cmd, const char *opt, int clearflags) {
-         pr_response_add(R_226, _("Read error during globbing of %s"),
-           pr_fs_encode_path(cmd->tmp_pool, arg));
- 
-+      } else if (a == GLOB_LIMIT) {
-+        pr_response_add(R_226, _("Too many files"));
-       } else if (a != GLOB_NOMATCH) {
-         pr_response_add(R_226, _("Unknown error during globbing of %s"),
-           pr_fs_encode_path(cmd->tmp_pool, arg));
-@@ -2837,7 +2839,10 @@ MODRET ls_nlst(cmd_rec *cmd) {
-           return PR_HANDLED(cmd);
-         }
- 
--        pr_response_add_err(R_450, _("No files found"));
-+        if (res == GLOB_LIMIT)
-+          pr_response_add_err(R_451, _("Too many files"));
-+        else
-+          pr_response_add_err(R_450, _("No files found"));
-         return PR_ERROR(cmd);
-       }
-     }