Whamcloud - gitweb
LU-6695 jobstats: skip too long env variables 77/15177/2
authorNiu Yawei <yawei.niu@intel.com>
Mon, 8 Jun 2015 06:33:58 +0000 (02:33 -0400)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 16 Jun 2015 08:46:27 +0000 (08:46 +0000)
The PATH env variable can be very large, it may exceed the page
size sometimes. cfs_get_envrion() should skip such too long env
variables instead of returning error.

Signed-off-by: Niu Yawei <yawei.niu@intel.com>
Change-Id: I43c103a647cde3afa499dec3a11312155c3cf924
Reviewed-on: http://review.whamcloud.com/15177
Tested-by: Jenkins
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
libcfs/libcfs/linux/linux-curproc.c

index f0e36a1..3e92367 100644 (file)
@@ -192,6 +192,7 @@ int cfs_get_environ(const char *key, char *value, int *val_len)
        int key_len = strlen(key);
        unsigned long addr;
        int rc;
+       bool skip = false;
        ENTRY;
 
        buffer = kmalloc(buf_len, GFP_USER);
@@ -236,13 +237,16 @@ int cfs_get_environ(const char *key, char *value, int *val_len)
                        /* The last entry of this buffer cross the buffer
                         * boundary, reread it in next cycle. */
                        if (unlikely(env_end - env_start == scan_len)) {
-                               /* This entry is too large to fit in buffer */
-                               if (unlikely(scan_len == this_len)) {
-                                       CERROR("Too long env variable.\n");
-                                       GOTO(out, rc = -EINVAL);
-                               }
-                               addr -= scan_len;
+                               /* Just skip the entry larger than page size,
+                                * it can't be jobID env variable. */
+                               if (unlikely(scan_len == this_len))
+                                       skip = true;
+                               else
+                                       addr -= scan_len;
                                break;
+                       } else if (unlikely(skip)) {
+                               skip = false;
+                               goto skip;
                        }
 
                        entry = env_start;
@@ -261,7 +265,7 @@ int cfs_get_environ(const char *key, char *value, int *val_len)
                                *val_len = entry_len;
                                GOTO(out, rc = 0);
                        }
-
+skip:
                        scan_len -= (env_end - env_start + 1);
                        env_start = env_end + 1;
                }