lkml.org 
[lkml]   [2020]   [Feb]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 097/113] VT_RESIZEX: get rid of field-by-field copyin
    Date
    From: Al Viro <viro@zeniv.linux.org.uk>

    [ Upstream commit 1b3bce4d6bf839304a90951b4b25a5863533bf2a ]

    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/tty/vt/vt_ioctl.c | 68 ++++++++++++++++-----------------------
    1 file changed, 27 insertions(+), 41 deletions(-)

    diff --git a/drivers/tty/vt/vt_ioctl.c b/drivers/tty/vt/vt_ioctl.c
    index a86bc7afb3b28..a1e5c408c931b 100644
    --- a/drivers/tty/vt/vt_ioctl.c
    +++ b/drivers/tty/vt/vt_ioctl.c
    @@ -850,58 +850,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;
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-02-27 14:44    [W:4.916 / U:0.256 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site