staging/lustre/llite: strengthen checks for hsm flags and archive id
Prior to this patch undefined flags bits and out of range archive id can be set. Signed-off-by: Bruno Faccini <bruno.faccini@intel.com> Reviewed-on: http://review.whamcloud.com/13337 Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-5757 Reviewed-by: frank zago <fzago@cray.com> Reviewed-by: Henri Doreau <henri.doreau@cea.fr> Signed-off-by: Oleg Drokin <oleg.drokin@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>hifive-unleashed-5.1
parent
44ecac6889
commit
2742c75ec6
|
@ -365,6 +365,13 @@ static inline __u64 fid_ver_oid(const struct lu_fid *fid)
|
||||||
return ((__u64)fid_ver(fid) << 32 | fid_oid(fid));
|
return ((__u64)fid_ver(fid) << 32 | fid_oid(fid));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* copytool uses a 32b bitmask field to encode archive-Ids during register
|
||||||
|
* with MDT thru kuc.
|
||||||
|
* archive num = 0 => all
|
||||||
|
* archive num from 1 to 32
|
||||||
|
*/
|
||||||
|
#define LL_HSM_MAX_ARCHIVE (sizeof(__u32) * 8)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Note that reserved SEQ numbers below 12 will conflict with ldiskfs
|
* Note that reserved SEQ numbers below 12 will conflict with ldiskfs
|
||||||
* inodes in the IGIF namespace, so these reserved SEQ numbers can be
|
* inodes in the IGIF namespace, so these reserved SEQ numbers can be
|
||||||
|
|
|
@ -2118,12 +2118,21 @@ static int ll_hsm_state_set(struct inode *inode, struct hsm_state_set *hss)
|
||||||
struct md_op_data *op_data;
|
struct md_op_data *op_data;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
/* Detect out-of range masks */
|
||||||
|
if ((hss->hss_setmask | hss->hss_clearmask) & ~HSM_FLAGS_MASK)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
/* Non-root users are forbidden to set or clear flags which are
|
/* Non-root users are forbidden to set or clear flags which are
|
||||||
* NOT defined in HSM_USER_MASK. */
|
* NOT defined in HSM_USER_MASK. */
|
||||||
if (((hss->hss_setmask | hss->hss_clearmask) & ~HSM_USER_MASK) &&
|
if (((hss->hss_setmask | hss->hss_clearmask) & ~HSM_USER_MASK) &&
|
||||||
!capable(CFS_CAP_SYS_ADMIN))
|
!capable(CFS_CAP_SYS_ADMIN))
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
|
|
||||||
|
/* Detect out-of range archive id */
|
||||||
|
if ((hss->hss_valid & HSS_ARCHIVE_ID) &&
|
||||||
|
(hss->hss_archive_id > LL_HSM_MAX_ARCHIVE))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
op_data = ll_prep_md_op_data(NULL, inode, NULL, NULL, 0, 0,
|
op_data = ll_prep_md_op_data(NULL, inode, NULL, NULL, 0, 0,
|
||||||
LUSTRE_OPC_ANY, hss);
|
LUSTRE_OPC_ANY, hss);
|
||||||
if (IS_ERR(op_data))
|
if (IS_ERR(op_data))
|
||||||
|
|
Loading…
Reference in New Issue