From: Niu Yawei Date: Mon, 8 Jun 2015 06:33:58 +0000 (-0400) Subject: LU-6695 jobstats: skip too long env variables X-Git-Tag: 2.7.56~43 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F77%2F15177%2F2;p=fs%2Flustre-release.git 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 --- 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; }