From ea9b8c107008bfe4a24acc86a9d316306281552f Mon Sep 17 00:00:00 2001 From: Nathaniel Clark Date: Mon, 4 Feb 2013 16:07:38 -0500 Subject: [PATCH] LU-2749 ofd: check return value of ofd_seq_load Return value ofd_seq_load was not always checked for both NULL and errno. This caused a NULL pointer dereference. Signed-off-by: Nathaniel Clark Change-Id: Ib2e1658f16ba2012c9410966c08201cab7a5aa5c Reviewed-on: http://review.whamcloud.com/5263 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: wangdi --- lustre/ofd/ofd_fs.c | 6 +++++- lustre/ofd/ofd_io.c | 7 ++++--- lustre/ofd/ofd_obd.c | 7 ++++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lustre/ofd/ofd_fs.c b/lustre/ofd/ofd_fs.c index b1c7c98..9b61f58 100644 --- a/lustre/ofd/ofd_fs.c +++ b/lustre/ofd/ofd_fs.c @@ -252,6 +252,10 @@ void ofd_seqs_fini(const struct lu_env *env, struct ofd_device *ofd) return; } +/** + * + * \retval the seq with seq number or errno (never NULL) + */ struct ofd_seq *ofd_seq_load(const struct lu_env *env, struct ofd_device *ofd, obd_seq seq) { @@ -323,7 +327,7 @@ struct ofd_seq *ofd_seq_load(const struct lu_env *env, struct ofd_device *ofd, } oseq = ofd_seq_add(env, ofd, oseq); - RETURN(oseq); + RETURN((oseq != NULL) ? oseq : ERR_PTR(-ENOENT)); cleanup: ofd_seq_put(env, oseq); return ERR_PTR(rc); diff --git a/lustre/ofd/ofd_io.c b/lustre/ofd/ofd_io.c index 7f72a17..043c7ed 100644 --- a/lustre/ofd/ofd_io.c +++ b/lustre/ofd/ofd_io.c @@ -223,9 +223,10 @@ int ofd_preprw(const struct lu_env* env, int cmd, struct obd_export *exp, if (OBD_FAIL_CHECK(OBD_FAIL_OST_ENOENT)) { struct ofd_seq *oseq; oseq = ofd_seq_load(env, ofd, oa->o_seq); - if (oseq == NULL) { - CERROR("%s: Can not find seq for "LPU64":"LPU64"\n", - ofd_name(ofd), oa->o_seq, oa->o_id); + if (IS_ERR(oseq)) { + CERROR("%s: Can not find seq for "LPU64":"LPU64 + ": rc = %ld\n", ofd_name(ofd), oa->o_seq, + oa->o_id, PTR_ERR(oseq)); RETURN(-EINVAL); } diff --git a/lustre/ofd/ofd_obd.c b/lustre/ofd/ofd_obd.c index be76426..c20c071 100644 --- a/lustre/ofd/ofd_obd.c +++ b/lustre/ofd/ofd_obd.c @@ -577,7 +577,7 @@ static int ofd_get_info(const struct lu_env *env, struct obd_export *exp, ofd_info_init(env, exp); oseq = ofd_seq_load(env, ofd, (obd_seq)exp->exp_filter_data.fed_group); - LASSERT(oseq != NULL); + LASSERT(!IS_ERR(oseq)); if (last_id) { if (*vallen < sizeof(*last_id)) { ofd_seq_put(env, oseq); @@ -1183,8 +1183,9 @@ int ofd_create(const struct lu_env *env, struct obd_export *exp, seq, oa->o_id); oseq = ofd_seq_load(env, ofd, seq); - if (oseq == NULL) { - CERROR("%s: Can't find oseq "LPX64"\n", ofd_name(ofd), seq); + if (IS_ERR(oseq)) { + CERROR("%s: Can't find FID Sequence "LPX64": rc = %ld\n", + ofd_name(ofd), seq, PTR_ERR(oseq)); RETURN(-EINVAL); } -- 1.8.3.1