diff options
| -rwxr-xr-x | tests/bugs/core/io-stats-1322825.t | 12 | ||||
| -rw-r--r-- | xlators/debug/io-stats/src/io-stats.c | 34 | 
2 files changed, 31 insertions, 15 deletions
diff --git a/tests/bugs/core/io-stats-1322825.t b/tests/bugs/core/io-stats-1322825.t index d232ecb2420..53f2d040daa 100755 --- a/tests/bugs/core/io-stats-1322825.t +++ b/tests/bugs/core/io-stats-1322825.t @@ -23,7 +23,7 @@ TEST $CLI volume profile $V0 start  TEST mkdir $M0/dir1  # Generate the stat dump across the io-stat instances -TEST setfattr -n trusted.io-stats-dump -v /tmp/io-stats-1322825 $M0 +TEST setfattr -n trusted.io-stats-dump -v io-stats-1322825 $M0  # Check if $M0 is clean w.r.t xattr information  # TODO: if there are better ways to check we really get no attr error, please @@ -42,12 +42,12 @@ ret=$(echo $?)  EXPECT 0 echo $ret  # Check if we have 5 io-stat files in /tmp -EXPECT 5 ls -1 /tmp/io-stats-1322825* +EXPECT 5 ls -1 /var/run/gluster/io-stats-1322825*  # Cleanup the 5 generated files -rm -f /tmp/io-stats-1322825* +rm -f /var/run/gluster/io-stats-1322825*  # Rinse and repeat above for a directory -TEST setfattr -n trusted.io-stats-dump -v /tmp/io-stats-1322825 $M0/dir1 +TEST setfattr -n trusted.io-stats-dump -v io-stats-1322825 $M0/dir1  getfattr -n trusted.io-stats-dump $B0/${V0}1/dir1 2>&1 | grep -qi "no such attribute"  ret=$(echo $?)  EXPECT 0 echo $ret @@ -61,7 +61,7 @@ getfattr -n trusted.io-stats-dump $B0/${V0}4/dir1 2>&1 | grep -qi "no such attri  ret=$(echo $?)  EXPECT 0 echo $ret -EXPECT 5 ls -1 /tmp/io-stats-1322825* -rm -f /tmp/io-stats-1322825* +EXPECT 5 ls -1 /var/run/gluster/io-stats-1322825* +rm -f /var/run/gluster/io-stats-1322825*  cleanup; diff --git a/xlators/debug/io-stats/src/io-stats.c b/xlators/debug/io-stats/src/io-stats.c index 7a7a9217df0..4bc8b7999a7 100644 --- a/xlators/debug/io-stats/src/io-stats.c +++ b/xlators/debug/io-stats/src/io-stats.c @@ -46,6 +46,8 @@  #define DEFAULT_GRP_BUF_SZ 16384  #define IOS_BLOCK_COUNT_SIZE 32 +#define IOS_STATS_DUMP_DIR DEFAULT_VAR_RUN_DIRECTORY +  typedef enum {          IOS_STATS_TYPE_NONE,          IOS_STATS_TYPE_OPEN, @@ -3054,7 +3056,6 @@ io_stats_fsync (call_frame_t *frame, xlator_t *this,          return 0;  } -  int  conditional_dump (dict_t *dict, char *key, data_t *value, void *data)  { @@ -3067,9 +3068,10 @@ conditional_dump (dict_t *dict, char *key, data_t *value, void *data)          char                 *filename = NULL;          FILE                 *logfp = NULL;          struct ios_dump_args args = {0}; -        int                   pid, namelen; +        int                   pid, namelen, dirlen;          char                  dump_key[100];          char                 *slash_ptr = NULL; +        char                 *path_in_value = NULL;          stub  = data;          this  = stub->this; @@ -3078,16 +3080,30 @@ conditional_dump (dict_t *dict, char *key, data_t *value, void *data)          name as well. This helps when there is more than a single io-stats          instance in the graph, or the client and server processes are running          on the same node */ -        /* hmmm... no check for this */ -        /* name format: <passed in path/filename>.<xlator name slashes to -> */ -        namelen = value->len + strlen (this->name) + 2; /* '.' and '\0' */ +        /* For the sanity of where the file should be located, we should make +           sure file is written only inside RUNDIR (ie, /var/run/gluster) */ +        /* TODO: provide an option to dump it to different directory of +           choice, based on options */ +        /* name format: /var/run/gluster/<passed in path/filename>.<xlator name slashes to -> */ + +        path_in_value = data_to_str (value); + +        if (strstr (path_in_value, "../")) { +                gf_log (this->name, GF_LOG_ERROR, +                        "%s: no \"../\" allowed in path", path_in_value); +                return -1; +        } +        dirlen = strlen (IOS_STATS_DUMP_DIR); +        namelen = (dirlen + value->len + strlen (this->name) + 3); +        /* +3 for '/', '.' and '\0' added in snprintf below*/ +          filename = alloca0 (namelen); -        memcpy (filename, data_to_str (value), value->len); -        memcpy (filename + value->len, ".", 1); -        memcpy (filename + value->len + 1, this->name, strlen(this->name)); + +        snprintf (filename, namelen, "%s/%s.%s", IOS_STATS_DUMP_DIR, +                  path_in_value, this->name);          /* convert any slashes to '-' so that fopen works correctly */ -        slash_ptr = strchr (filename + value->len + 1, '/'); +        slash_ptr = strchr (filename + dirlen + 1, '/');          while (slash_ptr) {                  *slash_ptr = '-';                  slash_ptr = strchr (slash_ptr, '/');  | 
