From 3c8a2d49ef4a17aad2973475178aea794b669f38 Mon Sep 17 00:00:00 2001 From: Niu Yawei Date: Mon, 8 Jun 2015 02:33:58 -0400 Subject: [PATCH] LU-6695 jobstats: skip too long env variables 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 Change-Id: I43c103a647cde3afa499dec3a11312155c3cf924 Reviewed-on: http://review.whamcloud.com/15177 Tested-by: Jenkins Reviewed-by: Andreas Dilger Reviewed-by: Lai Siyao Tested-by: Maloo Reviewed-by: Oleg Drokin --- libcfs/libcfs/linux/linux-curproc.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/libcfs/libcfs/linux/linux-curproc.c b/libcfs/libcfs/linux/linux-curproc.c index f0e36a1..3e92367 100644 --- a/libcfs/libcfs/linux/linux-curproc.c +++ b/libcfs/libcfs/linux/linux-curproc.c @@ -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; } -- 1.8.3.1