components/proftpd/patches/proftpd-slow_ls.patch
author Ben Chang <Benjamin.Chang@Oracle.COM>
Mon, 02 Mar 2015 18:15:40 -0800
changeset 3891 d2dffb0b5ea6
permissions -rw-r--r--
19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3891
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
     1
The fix was developed in-house and submitted upstream. The upstream bug
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
     2
is:
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
     3
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
     4
http://bugs.proftpd.org/show_bug.cgi?id=4157
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
     5
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
     6
diff --git a/modules/mod_core.c b/modules/mod_core.c
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
     7
--- a/modules/mod_core.c
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
     8
+++ b/modules/mod_core.c
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
     9
@@ -40,6 +40,7 @@
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    10
 /* From src/main.c */
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    11
 extern unsigned long max_connects;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    12
 extern unsigned int max_connect_interval;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    13
+extern unsigned char tracing_enabled;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    14
 
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    15
 /* From modules/mod_site.c */
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    16
 extern modret_t *site_dispatch(cmd_rec*);
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    17
@@ -1381,6 +1382,8 @@
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    18
   int per_session = FALSE;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    19
   unsigned int idx = 1;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    20
 
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    21
+  tracing_enabled = TRUE;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    22
+
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    23
   if (cmd->argc-1 < 1)
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    24
     CONF_ERROR(cmd, "wrong number of parameters");
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    25
   CHECK_CONF(cmd, CONF_ROOT);
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    26
diff --git a/modules/mod_ls.c b/modules/mod_ls.c
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    27
--- a/modules/mod_ls.c
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    28
+++ b/modules/mod_ls.c
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    29
@@ -307,10 +307,12 @@
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    30
 
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    31
 static int sendline(int flags, char *fmt, ...) {
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    32
   va_list msg;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    33
-  char buf[PR_TUNABLE_BUFFER_SIZE+1] = {'\0'};
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    34
+  char buf[PR_TUNABLE_BUFFER_SIZE+1];
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    35
   int res = 0;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    36
   size_t buflen, listbuflen;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    37
 
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    38
+  (void) memset(buf, '\0', sizeof(buf));
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    39
+
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    40
   if (listbuf == NULL) {
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    41
     listbufsz = pr_config_get_server_xfer_bufsz(PR_NETIO_IO_WR);
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    42
     listbuf = listbuf_ptr = pcalloc(session.pool, listbufsz);
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    43
diff --git a/src/fsio.c b/src/fsio.c
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    44
--- a/src/fsio.c
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    45
+++ b/src/fsio.c
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    46
@@ -556,10 +556,12 @@
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    47
 static int cache_stat(pr_fs_t *fs, const char *path, struct stat *sbuf,
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    48
     unsigned int op) {
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    49
   int res = -1;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    50
-  char pathbuf[PR_TUNABLE_PATH_MAX + 1] = {'\0'};
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    51
+  char pathbuf[PR_TUNABLE_PATH_MAX + 1];
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    52
   int (*mystat)(pr_fs_t *, const char *, struct stat *) = NULL;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    53
   size_t pathlen;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    54
 
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    55
+  (void) memset(pathbuf, '\0', sizeof(pathbuf));
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    56
+
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    57
   /* Sanity checks */
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    58
   if (fs == NULL) {
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    59
     errno = EINVAL;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    60
@@ -641,8 +643,8 @@
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    61
  * during the hit.
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    62
  */
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    63
 static pr_fs_t *lookup_dir_fs(const char *path, int op) {
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    64
-  char buf[PR_TUNABLE_PATH_MAX + 1] = {'\0'};
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    65
-  char tmp_path[PR_TUNABLE_PATH_MAX + 1] = {'\0'};
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    66
+  char buf[PR_TUNABLE_PATH_MAX + 1];
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    67
+  char tmp_path[PR_TUNABLE_PATH_MAX + 1];
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    68
   pr_fs_t *fs = NULL;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    69
   int exact = FALSE;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    70
   size_t tmp_pathlen = 0;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    71
@@ -651,6 +653,9 @@
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    72
   pr_fs_match_t *fsm = NULL;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    73
 #endif /* PR_FS_MATCH */
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    74
 
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    75
+  (void) memset(buf, '\0', sizeof(buf));
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    76
+  (void) memset(tmp_path, '\0', sizeof(tmp_path));
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    77
+
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    78
   sstrncpy(buf, path, sizeof(buf));
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    79
 
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    80
   /* Check if the given path is an absolute path.  Since there may be
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    81
diff --git a/src/trace.c b/src/trace.c
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    82
--- a/src/trace.c
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    83
+++ b/src/trace.c
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    84
@@ -32,6 +32,8 @@
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    85
 
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    86
 #ifdef PR_USE_TRACE
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    87
 
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    88
+unsigned char tracing_enabled = FALSE;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    89
+
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    90
 static int trace_logfd = -1;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    91
 static unsigned long trace_opts = PR_TRACE_OPT_DEFAULT;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    92
 static pool *trace_pool = NULL;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    93
@@ -473,6 +475,10 @@
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    94
   int res;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    95
   va_list msg;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    96
 
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    97
+  /* Optimization: do not run tracing code unless explicitly enabled. */
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    98
+  if (tracing_enabled == FALSE)
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
    99
+    return 0;
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
   100
+
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
   101
   va_start(msg, fmt);
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
   102
   res = pr_trace_vmsg(channel, level, fmt, msg);
d2dffb0b5ea6 19693019 proftpd LIST/NLST could take much more time than in.ftpd.
Ben Chang <Benjamin.Chang@Oracle.COM>
parents:
diff changeset
   103
   va_end(msg);