In lu_name_is_valid() check that the length of the ln_name is equal to
ln_namelen and check that there are no embedded slashes. Add
mdd_name_check() which calls lu_name_is_valid() and check against the
mdd ENAMETOOLONG limit. Call mdd_name_check() from
mdd_create_sanity_check(), mdd_link_sanity_check() and mdd_rename().
Signed-off-by: John L. Hammond <john.hammond@intel.com>
Change-Id: I66413b796177f042fc9bd87e98338de9e5125cae
Reviewed-on: http://review.whamcloud.com/10111
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Mike Pershin <mike.pershin@intel.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
{
return ln->ln_name != NULL &&
ln->ln_namelen > 0 &&
{
return ln->ln_name != NULL &&
ln->ln_namelen > 0 &&
- ln->ln_name[0] != '\0' &&
- ln->ln_name[ln->ln_namelen] == '\0';
+ ln->ln_name[ln->ln_namelen] == '\0' &&
+ strlen(ln->ln_name) == ln->ln_namelen &&
+ memchr(ln->ln_name, '/', ln->ln_namelen) == NULL;
+static inline int
+mdd_name_check(struct mdd_device *m, const struct lu_name *ln)
+{
+ if (!lu_name_is_valid(ln))
+ return -EINVAL;
+ else if (ln->ln_namelen > m->mdd_dt_conf.ddp_max_name_len)
+ return -ENAMETOOLONG;
+ else
+ return 0;
+}
+
/* Get FID from name and parent */
static int
__mdd_lookup(const struct lu_env *env, struct md_object *pobj,
/* Get FID from name and parent */
static int
__mdd_lookup(const struct lu_env *env, struct md_object *pobj,
- /* The common filename length check. */
- if (unlikely(lname->ln_namelen > m->mdd_dt_conf.ddp_max_name_len))
- RETURN(-ENAMETOOLONG);
-
rc = mdd_permission_internal_locked(env, mdd_obj, pattr, mask,
MOR_TGT_PARENT);
if (rc)
rc = mdd_permission_internal_locked(env, mdd_obj, pattr, mask,
MOR_TGT_PARENT);
if (rc)
RETURN(-ESTALE);
/* Local ops, no lookup before link, check filename length here. */
RETURN(-ESTALE);
/* Local ops, no lookup before link, check filename length here. */
- if (lname && (lname->ln_namelen > m->mdd_dt_conf.ddp_max_name_len))
- RETURN(-ENAMETOOLONG);
+ rc = mdd_name_check(m, lname);
+ if (rc < 0)
+ RETURN(rc);
if (mdd_is_immutable(src_obj) || mdd_is_append(src_obj))
RETURN(-EPERM);
if (mdd_is_immutable(src_obj) || mdd_is_append(src_obj))
RETURN(-EPERM);
+ rc = mdd_name_check(m, lname);
+ if (rc < 0)
+ RETURN(rc);
+
switch (cattr->la_mode & S_IFMT) {
case S_IFLNK: {
unsigned int symlen = strlen(spec->u.sp_symname) + 1;
switch (cattr->la_mode & S_IFMT) {
case S_IFLNK: {
unsigned int symlen = strlen(spec->u.sp_symname) + 1;
if (rc)
GOTO(out_pending, rc);
if (rc)
GOTO(out_pending, rc);
+ rc = mdd_name_check(mdd, ltname);
+ if (rc < 0)
+ GOTO(out_pending, rc);
+
handle = mdd_trans_create(env, mdd);
if (IS_ERR(handle))
GOTO(out_pending, rc = PTR_ERR(handle));
handle = mdd_trans_create(env, mdd);
if (IS_ERR(handle))
GOTO(out_pending, rc = PTR_ERR(handle));