aboutsummaryrefslogtreecommitdiffstats
path: root/module/zcommon/zfs_namecheck.c
diff options
context:
space:
mode:
authorTulsi Jain <[email protected]>2019-06-13 08:56:15 -0700
committerBrian Behlendorf <[email protected]>2019-06-13 08:56:15 -0700
commit9c7da9a95aaaecced0a1cfc40190906e7a691327 (patch)
treed60bad72f7c6fb38bfcdd375d50a78f2eb8a2d5c /module/zcommon/zfs_namecheck.c
parent3475724ea4221a354633d7c4e50d9d90f6bd266f (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/zfs_namecheck.c')
-rw-r--r--module/zcommon/zfs_namecheck.c21
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 */