X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flod%2Flod_lov.c;h=65326fa5a1a2b257985915cb4249be1c3dba7a5b;hb=b7f949e04bbd4533316f0ca09b4b7d4f1765eca1;hp=d477c88cf5e12d47ff2372bedd20511d53229130;hpb=cee1ab3997d70ee5eeece41b50fbe4479eda9d14;p=fs%2Flustre-release.git diff --git a/lustre/lod/lod_lov.c b/lustre/lod/lod_lov.c index d477c88..65326fa 100644 --- a/lustre/lod/lod_lov.c +++ b/lustre/lod/lod_lov.c @@ -501,6 +501,7 @@ int lod_generate_and_set_lovea(const struct lu_env *env, struct lov_ost_data_v1 *objs; __u32 magic; int i, rc, lmm_size; + int cplen = 0; ENTRY; LASSERT(lo); @@ -527,7 +528,10 @@ int lod_generate_and_set_lovea(const struct lu_env *env, objs = &lmm->lmm_objects[0]; } else { struct lov_mds_md_v3 *v3 = (struct lov_mds_md_v3 *) lmm; - strncpy(v3->lmm_pool_name, lo->ldo_pool, LOV_MAXPOOLNAME); + cplen = strlcpy(v3->lmm_pool_name, lo->ldo_pool, + sizeof(v3->lmm_pool_name)); + if (cplen >= sizeof(v3->lmm_pool_name)) + RETURN(-E2BIG); objs = &v3->lmm_objects[0]; } @@ -613,6 +617,7 @@ int lod_store_def_striping(const struct lu_env *env, struct dt_object *dt, struct dt_object *next = dt_object_child(dt); struct lov_user_md_v3 *v3; int rc; + int cplen = 0; ENTRY; LASSERT(S_ISDIR(dt->do_lu.lo_header->loh_attr)); @@ -642,8 +647,14 @@ int lod_store_def_striping(const struct lu_env *env, struct dt_object *dt, v3->lmm_stripe_size = cpu_to_le32(lo->ldo_def_stripe_size); v3->lmm_stripe_count = cpu_to_le16(lo->ldo_def_stripenr); v3->lmm_stripe_offset = cpu_to_le16(lo->ldo_def_stripe_offset); - if (lo->ldo_pool) - strncpy(v3->lmm_pool_name, lo->ldo_pool, LOV_MAXPOOLNAME); + if (lo->ldo_pool) { + cplen = strlcpy(v3->lmm_pool_name, lo->ldo_pool, + sizeof(v3->lmm_pool_name)); + if (cplen >= sizeof(v3->lmm_pool_name)) { + OBD_FREE_PTR(v3); + RETURN(-E2BIG); + } + } info->lti_buf.lb_buf = v3; info->lti_buf.lb_len = sizeof(*v3); @@ -666,7 +677,9 @@ int lod_initialize_objects(const struct lu_env *env, struct lod_object *lo, struct lod_device *md = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev); struct lu_object *o, *n; struct lu_device *nd; - int i, idx, rc = 0; + struct dt_object **stripe; + int stripe_len; + int i, idx, rc = 0; ENTRY; LASSERT(lo); @@ -674,11 +687,10 @@ int lod_initialize_objects(const struct lu_env *env, struct lod_object *lo, LASSERT(lo->ldo_stripenr > 0); LASSERT(lo->ldo_stripe_size > 0); - i = sizeof(struct dt_object *) * lo->ldo_stripenr; - OBD_ALLOC(lo->ldo_stripe, i); - if (lo->ldo_stripe == NULL) - GOTO(out, rc = -ENOMEM); - lo->ldo_stripes_allocated = lo->ldo_stripenr; + stripe_len = lo->ldo_stripenr; + OBD_ALLOC(stripe, sizeof(stripe[0]) * stripe_len); + if (stripe == NULL) + RETURN(-ENOMEM); for (i = 0; i < lo->ldo_stripenr; i++) { info->lti_ostid.oi_id = le64_to_cpu(objs[i].l_object_id); @@ -710,10 +722,21 @@ int lod_initialize_objects(const struct lu_env *env, struct lod_object *lo, n = lu_object_locate(o->lo_header, nd->ld_type); LASSERT(n); - lo->ldo_stripe[i] = container_of(n, struct dt_object, do_lu); + stripe[i] = container_of(n, struct dt_object, do_lu); } out: + if (rc != 0) { + for (i = 0; i < stripe_len; i++) + if (stripe[i] != NULL) + lu_object_put(env, &stripe[i]->do_lu); + + OBD_FREE(stripe, sizeof(stripe[0]) * stripe_len); + } else { + lo->ldo_stripe = stripe; + lo->ldo_stripes_allocated = stripe_len; + } + RETURN(rc); }