From 19d0e888e1335a239dd7047745f22ae96811fa6c Mon Sep 17 00:00:00 2001 From: fanyong Date: Wed, 22 Nov 2006 02:23:20 +0000 Subject: [PATCH] Add symlink target length check. --- lustre/mdd/mdd_dir.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index aef052a..280afc9 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -997,12 +997,14 @@ static int mdd_create_sanity_check(const struct lu_env *env, struct md_object *pobj, const char *name, struct md_attr *ma, - int lookup) + struct md_op_spec *spec) { struct mdd_thread_info *info = mdd_env_info(env); struct lu_attr *la = &info->mti_la; struct lu_fid *fid = &info->mti_fid; struct mdd_object *obj = md2mdd_obj(pobj); + struct mdd_device *m = mdo2mdd(pobj); + int lookup = spec->sp_cr_lookup; int rc; ENTRY; @@ -1049,12 +1051,20 @@ static int mdd_create_sanity_check(const struct lu_env *env, switch (ma->ma_attr.la_mode & S_IFMT) { case S_IFDIR: { - struct mdd_device *mdd = mdo2mdd(pobj); - if (la->la_nlink >= mdd->mdd_dt_conf.ddp_max_nlink) + if (la->la_nlink >= m->mdd_dt_conf.ddp_max_nlink) RETURN(-EMLINK); + else + RETURN(0); + } + case S_IFLNK: { + unsigned int symlen = strlen(spec->u.sp_symname) + 1; + + if (symlen > (1 << m->mdd_dt_conf.ddp_block_shift)) + RETURN(-ENAMETOOLONG); + else + RETURN(0); } case S_IFREG: - case S_IFLNK: case S_IFCHR: case S_IFBLK: case S_IFIFO: @@ -1128,7 +1138,7 @@ static int mdd_create(const struct lu_env *env, */ /* Sanity checks before big job. */ - rc = mdd_create_sanity_check(env, pobj, name, ma, spec->sp_cr_lookup); + rc = mdd_create_sanity_check(env, pobj, name, ma, spec); if (rc) RETURN(rc); -- 1.8.3.1