|
@@ -141,27 +141,20 @@ int xstateregs_set(struct task_struct *target, const struct user_regset *regset,
|
|
|
ret = copy_user_to_xstate(xsave, ubuf);
|
|
|
} else {
|
|
|
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, xsave, 0, -1);
|
|
|
-
|
|
|
- /* xcomp_bv must be 0 when using uncompacted format */
|
|
|
- if (!ret && xsave->header.xcomp_bv)
|
|
|
- ret = -EINVAL;
|
|
|
+ if (!ret)
|
|
|
+ ret = validate_xstate_header(&xsave->header);
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- * In case of failure, mark all states as init:
|
|
|
- */
|
|
|
- if (ret)
|
|
|
- fpstate_init(&fpu->state);
|
|
|
-
|
|
|
/*
|
|
|
* mxcsr reserved bits must be masked to zero for security reasons.
|
|
|
*/
|
|
|
xsave->i387.mxcsr &= mxcsr_feature_mask;
|
|
|
- xsave->header.xfeatures &= xfeatures_mask;
|
|
|
+
|
|
|
/*
|
|
|
- * These bits must be zero.
|
|
|
+ * In case of failure, mark all states as init:
|
|
|
*/
|
|
|
- memset(&xsave->header.reserved, 0, 48);
|
|
|
+ if (ret)
|
|
|
+ fpstate_init(&fpu->state);
|
|
|
|
|
|
return ret;
|
|
|
}
|