Whamcloud - gitweb
LU-17939 ofd: validate FID in MDT/OFD 01/55401/11
authorLai Siyao <lai.siyao@whamcloud.com>
Mon, 20 May 2024 21:20:34 +0000 (17:20 -0400)
committerOleg Drokin <green@whamcloud.com>
Sun, 24 Nov 2024 06:03:54 +0000 (06:03 +0000)
OST object FID from other nodes can only be normal FID, IDIF, ECHO or
OST_MDT0, and MDT object FID can only be namespace visible FID or
local ROOT, return error if it's not true to avoid assertion later.

Signed-off-by: Lai Siyao <lai.siyao@whamcloud.com>
Change-Id: I0c518c67acad44e90159fff71ff4fa9b893e8f3d
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/55401
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Hongchao Zhang <hongchao@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
lustre/mdt/mdt_handler.c
lustre/ofd/ofd_objects.c

index 68c32b4..9dcae05 100644 (file)
@@ -3612,6 +3612,12 @@ struct mdt_object *mdt_object_find(const struct lu_env *env,
        struct mdt_object *m;
 
        ENTRY;
+       /* mdt_orphan_open() gets local ROOT */
+       if (!fid_is_namespace_visible(f) && !fid_is_local_file(f)) {
+               CERROR("%s: MDT object FID "DFID" is corrupt: rc = %d\n",
+                      mdt_obd_name(d), PFID(f), -EINVAL);
+               RETURN(ERR_PTR(-EINVAL));
+       }
 
        CDEBUG(D_INFO, "Find object for "DFID"\n", PFID(f));
        o = lu_object_find(env, &d->mdt_lu_dev, f, NULL);
index 2af0f2d..b66b6c0 100644 (file)
@@ -104,7 +104,13 @@ struct ofd_object *ofd_object_find(const struct lu_env *env,
        struct lu_object  *o;
 
        ENTRY;
-
+       if (!(fid_is_mdt0(fid) || fid_is_norm(fid) || fid_is_idif(fid) ||
+             fid_is_echo(fid)) ||
+           fid_oid(fid) == 0) {
+               CERROR("%s: OST object FID "DFID" is corrupt, rc = %d\n",
+                      ofd_name(ofd), PFID(fid), -EINVAL);
+               RETURN(ERR_PTR(-EINVAL));
+       }
        o = lu_object_find(env, &ofd->ofd_dt_dev.dd_lu_dev, fid, NULL);
        if (likely(!IS_ERR(o)))
                fo = ofd_obj(o);