diff options
author | Tulsi Jain <[email protected]> | 2019-06-13 08:56:15 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2019-06-13 08:56:15 -0700 |
commit | 9c7da9a95aaaecced0a1cfc40190906e7a691327 (patch) | |
tree | d60bad72f7c6fb38bfcdd375d50a78f2eb8a2d5c /module/zcommon | |
parent | 3475724ea4221a354633d7c4e50d9d90f6bd266f (diff) |
Restrict filesystem creation if name referred either '.' or '..'
This change restricts filesystem creation if the given name
contains either '.' or '..'
Reviewed-by: Matt Ahrens <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Reviewed-by: Richard Elling <[email protected]>
Signed-off-by: TulsiJain <[email protected]>
Closes #8842
Closes #8564
Diffstat (limited to 'module/zcommon')
-rw-r--r-- | module/zcommon/zfs_namecheck.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/module/zcommon/zfs_namecheck.c b/module/zcommon/zfs_namecheck.c index 58b23b0e0..b1e0de6d8 100644 --- a/module/zcommon/zfs_namecheck.c +++ b/module/zcommon/zfs_namecheck.c @@ -232,6 +232,27 @@ entity_namecheck(const char *path, namecheck_err_t *why, char *what) } } + if (*end == '\0' || *end == '/') { + int component_length = end - start; + /* Validate the contents of this component is not '.' */ + if (component_length == 1) { + if (start[0] == '.') { + if (why) + *why = NAME_ERR_SELF_REF; + return (-1); + } + } + + /* Validate the content of this component is not '..' */ + if (component_length == 2) { + if (start[0] == '.' && start[1] == '.') { + if (why) + *why = NAME_ERR_PARENT_REF; + return (-1); + } + } + } + /* Snapshot or bookmark delimiter found */ if (*end == '@' || *end == '#') { /* Multiple delimiters are not allowed */ |