From dd11e3f7f02ad1cd88aec6fc42ceab4ed9442e80 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Mon, 9 Aug 2010 14:48:12 -0700 Subject: [PATCH] Limit sysfs name to KOBJ_NAME_LEN See commit dfc166d174c1550dab8b4528232449e3e0d8f9e1 for details. --- module/zcommon/zfs_namecheck.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/module/zcommon/zfs_namecheck.c b/module/zcommon/zfs_namecheck.c index 5cfafea471b3..2398c2755cc7 100644 --- a/module/zcommon/zfs_namecheck.c +++ b/module/zcommon/zfs_namecheck.c @@ -142,9 +142,22 @@ dataset_namecheck(const char *path, namecheck_err_t *why, char *what) * which is the same as MAXNAMELEN used in the kernel. * If ZFS_MAXNAMELEN value is changed, make sure to cleanup all * places using MAXNAMELEN. + * + * When HAVE_KOBJ_NAME_LEN is defined the maximum safe kobject name + * length is 20 bytes. This 20 bytes is broken down as follows to + * provide a maximum safe /[@snapshot] length of only + * 18 bytes. To ensure bytes are left for [@snapshot] the + * portition is futher limited to 9 bytes. For 2.6.27 and + * newer kernels this limit is set to MAXNAMELEN. + * + * / + + + * (18) + (1) + (1) */ - +#ifdef HAVE_KOBJ_NAME_LEN + if (strlen(path) > 18) { +#else if (strlen(path) >= MAXNAMELEN) { +#endif /* HAVE_KOBJ_NAME_LEN */ if (why) *why = NAME_ERR_TOOLONG; return (-1); @@ -303,8 +316,22 @@ pool_namecheck(const char *pool, namecheck_err_t *why, char *what) * which is the same as MAXNAMELEN used in the kernel. * If ZPOOL_MAXNAMELEN value is changed, make sure to cleanup all * places using MAXNAMELEN. + * + * When HAVE_KOBJ_NAME_LEN is defined the maximum safe kobject name + * length is 20 bytes. This 20 bytes is broken down as follows to + * provide a maximum safe /[@snapshot] length of only + * 18 bytes. To ensure bytes are left for [@snapshot] the + * portition is futher limited to 8 bytes. For 2.6.27 and + * newer kernels this limit is set to MAXNAMELEN. + * + * / + + + * (18) + (1) + (1) */ +#ifdef HAVE_KOBJ_NAME_LEN + if (strlen(pool) > 8) { +#else if (strlen(pool) >= MAXNAMELEN) { +#endif /* HAVE_KOBJ_NAME_LEN */ if (why) *why = NAME_ERR_TOOLONG; return (-1);