{
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;
}
#define DNAME "%.*s"
sizeof(dotdot) - 1
};
+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,
RETURN(-ESTALE);
}
- /* 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)
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);
}
}
+ 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;
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));