diff options
| -rw-r--r-- | xlators/protocol/server/src/server-resolve.c | 12 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix-handle.h | 6 | 
2 files changed, 18 insertions, 0 deletions
diff --git a/xlators/protocol/server/src/server-resolve.c b/xlators/protocol/server/src/server-resolve.c index 6ffb9098421..b3eda0e4c9e 100644 --- a/xlators/protocol/server/src/server-resolve.c +++ b/xlators/protocol/server/src/server-resolve.c @@ -311,6 +311,18 @@ resolve_entry_simple (call_frame_t *frame)          /* expected @parent was found from the inode cache */          gf_uuid_copy (state->loc_now->pargfid, resolve->pargfid);          state->loc_now->parent = inode_ref (parent); + +        if (strstr (resolve->bname, "../")) { +                /* Resolving outside the parent's tree is not allowed */ +                gf_msg (this->name, GF_LOG_ERROR, EPERM, +                        PS_MSG_GFID_RESOLVE_FAILED, +                        "%s: path sent by client not allowed", +                        resolve->bname); +                resolve->op_ret   = -1; +                resolve->op_errno = EPERM; +                ret = 1; +                goto out; +        }          state->loc_now->name = resolve->bname;          inode = inode_grep (state->itable, parent, resolve->bname); diff --git a/xlators/storage/posix/src/posix-handle.h b/xlators/storage/posix/src/posix-handle.h index b12e8b9610c..621f8f4d450 100644 --- a/xlators/storage/posix/src/posix-handle.h +++ b/xlators/storage/posix/src/posix-handle.h @@ -142,6 +142,12 @@                  break;                                                  \          }                                                               \                                                                          \ +        if (strstr (loc->name, "../")) {                                \ +                gf_msg (this->name, GF_LOG_ERROR, 0, P_MSG_ENTRY_HANDLE_CREATE, \ +                        "'../' in name not allowed: (%s)", loc->name); \ +                op_ret = -1;                                            \ +                break;                                                  \ +        }                                                               \          if (LOC_HAS_ABSPATH (loc)) {                                    \                  MAKE_REAL_PATH (entp, this, loc->path);                 \                  __parp = strdupa (entp);                                \  | 
