Merge branch 'misc.compat' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull compat and uaccess updates from Al Viro: - {get,put}_compat_sigset() series - assorted compat ioctl stuff - more set_fs() elimination - a few more timespec64 conversions - several removals of pointless access_ok() in places where it was followed only by non-__ variants of primitives * 'misc.compat' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (24 commits) coredump: call do_unlinkat directly instead of sys_unlink fs: expose do_unlinkat for built-in callers ext4: take handling of EXT4_IOC_GROUP_ADD into a helper, get rid of set_fs() ipmi: get rid of pointless access_ok() pi433: sanitize ioctl cxlflash: get rid of pointless access_ok() mtdchar: get rid of pointless access_ok() r128: switch compat ioctls to drm_ioctl_kernel() selection: get rid of field-by-field copyin VT_RESIZEX: get rid of field-by-field copyin i2c compat ioctls: move to ->compat_ioctl() sched_rr_get_interval(): move compat to native, get rid of set_fs() mips: switch to {get,put}_compat_sigset() sparc: switch to {get,put}_compat_sigset() s390: switch to {get,put}_compat_sigset() ppc: switch to {get,put}_compat_sigset() parisc: switch to {get,put}_compat_sigset() get_compat_sigset() get rid of {get,put}_compat_itimerspec() io_getevents: Use timespec64 to represent timeouts ...
This commit is contained in:
@@ -843,58 +843,44 @@ int vt_ioctl(struct tty_struct *tty,
|
||||
|
||||
case VT_RESIZEX:
|
||||
{
|
||||
struct vt_consize __user *vtconsize = up;
|
||||
ushort ll,cc,vlin,clin,vcol,ccol;
|
||||
struct vt_consize v;
|
||||
if (!perm)
|
||||
return -EPERM;
|
||||
if (!access_ok(VERIFY_READ, vtconsize,
|
||||
sizeof(struct vt_consize))) {
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
}
|
||||
if (copy_from_user(&v, up, sizeof(struct vt_consize)))
|
||||
return -EFAULT;
|
||||
/* FIXME: Should check the copies properly */
|
||||
__get_user(ll, &vtconsize->v_rows);
|
||||
__get_user(cc, &vtconsize->v_cols);
|
||||
__get_user(vlin, &vtconsize->v_vlin);
|
||||
__get_user(clin, &vtconsize->v_clin);
|
||||
__get_user(vcol, &vtconsize->v_vcol);
|
||||
__get_user(ccol, &vtconsize->v_ccol);
|
||||
vlin = vlin ? vlin : vc->vc_scan_lines;
|
||||
if (clin) {
|
||||
if (ll) {
|
||||
if (ll != vlin/clin) {
|
||||
/* Parameters don't add up */
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
} else
|
||||
ll = vlin/clin;
|
||||
if (!v.v_vlin)
|
||||
v.v_vlin = vc->vc_scan_lines;
|
||||
if (v.v_clin) {
|
||||
int rows = v.v_vlin/v.v_clin;
|
||||
if (v.v_rows != rows) {
|
||||
if (v.v_rows) /* Parameters don't add up */
|
||||
return -EINVAL;
|
||||
v.v_rows = rows;
|
||||
}
|
||||
}
|
||||
if (vcol && ccol) {
|
||||
if (cc) {
|
||||
if (cc != vcol/ccol) {
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
} else
|
||||
cc = vcol/ccol;
|
||||
if (v.v_vcol && v.v_ccol) {
|
||||
int cols = v.v_vcol/v.v_ccol;
|
||||
if (v.v_cols != cols) {
|
||||
if (v.v_cols)
|
||||
return -EINVAL;
|
||||
v.v_cols = cols;
|
||||
}
|
||||
}
|
||||
|
||||
if (clin > 32) {
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
if (v.v_clin > 32)
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < MAX_NR_CONSOLES; i++) {
|
||||
if (!vc_cons[i].d)
|
||||
continue;
|
||||
console_lock();
|
||||
if (vlin)
|
||||
vc_cons[i].d->vc_scan_lines = vlin;
|
||||
if (clin)
|
||||
vc_cons[i].d->vc_font.height = clin;
|
||||
if (v.v_vlin)
|
||||
vc_cons[i].d->vc_scan_lines = v.v_vlin;
|
||||
if (v.v_clin)
|
||||
vc_cons[i].d->vc_font.height = v.v_clin;
|
||||
vc_cons[i].d->vc_resize_user = 1;
|
||||
vc_resize(vc_cons[i].d, cc, ll);
|
||||
vc_resize(vc_cons[i].d, v.v_cols, v.v_rows);
|
||||
console_unlock();
|
||||
}
|
||||
break;
|
||||
|
Reference in New Issue
Block a user